编译原理_词法分析器_实验报告.docxVIP

  • 19
  • 0
  • 约4.3千字
  • 约 14页
  • 2021-12-08 发布于天津
  • 举报
word word专业资料 词法分析器实验报告 实验目的: 设计、编制、调试一个词法分析子程序-识别单词,加深对词法分析原理的理 解。 功能描述: 该程序要实现的是一个读单词过程,从输入的源程序中,识别出各个具有独立 意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出 各个单词的部编码及单词符号自身值。(遇到错误时可显示“ Error !”,然后跳过 错误部分继续进行) 设计思想: 设计该词法分析器的过程中虽然没有实际将所有的状态转移表建立出来,但是 所用的思想是根据状态转移表实现对单词的识别。首先构造一个保留字表 ,然后,每 输入一个字符就检测应该进入什么状态,并将该字符连接到d串后继续输入,如此循 环,最后根据所在的接受状态以及保留字表识别单词。 符号表: 记号 类别 属性值 ws - - const 保留子 1 var 保留子 1 call 保留子 1 beg in 保留子 1 if 保留子 1 while 保留子 1 do 保留子 1 odd 保留子 1 end 保留子 1 the n 保留子 1 procedure 保留子 1 = 运算符 2 运算符 2 = 运算符 2 运算符 2 运算符 2 = 运算符 2 * 运算符 2 + 运算符 2 - 运算符 2 / 运算符 2 := 运算符 2 ide nt 标识符 3 nu mber 常数 4 ( 分隔符 5 ) 分隔符 5 5 分隔符 5 分隔符 5 分隔符 5 状态转换图: ①标识符及保留字: letter or digitt ② nu mber: other other ③关系操作符: (=,2) (=,2) word word专业资料 (,2) (,2) (=,2) ④分隔符: word word专业资料 ⑤算术运算符: start start 使用环境: Windows xp 下的 visual C++6.0 程序测试: in putl : int a,b; a=b+2; in put2: while(a=0) do 7x=x+6.7E+23; end; in put3: beg in: x:=9 if x0 the n x:=x+1; while a:=0 do b:=2*x/3,c:=a; end; output1: 4,2 1,do 3,i nt 5,; error line 3 3,a 2,= 5,, output2: 3,x 3,b 1,while 2,+ 5,; 5,( 4,6.7E+23 3,a 3,a 5,; 2,= 2,= 1,e nd 3,b 4,0 5,; 2,+ 5,) output3: 3,x 3,x 1,begi n 2,+ 2,/ error line 1 4,1 4,3 3,x 5,; 5,, 2,:= 1,while 3,c 4,9 3,a 2 := J J ■ 1,if 2,:= 3,a 3,x 4,0 5,; 2, 1,do 1,e nd 4,0 3,b 5,; 1,the n 2,:= 3,x 4,2 2 := J J ■ 2,* 测试结果与预期结果一致 源程序代码: #in cludestdio.h #in cludestri ng.h void mai n() { int i=O,j,k=O,state=1,f=O,l inenum=1; char a[11][10]={co nst,var,call,begi n,if,while,do,odd,e nd,the n,procedure}; char b,d[4O]={\O}; freope n(i nput.txt,r,stdi n); freope n(output.txt,w,stdout); b=getchar(); while(b!=EOF)/* 判断所输入字符是否为结束符 */ { if(b== ||b==\n||b==\t)/* 滤过空格、换行等分隔符号 */ { if(b=\n) linenu m++; } } word word专业资料 b=getchar(); else if((b=ab=z)||(b=Ab=Z))/* 识别标识符以及保留字 */ { d[i++]=b; b=getchar(); while((b=ab=z)||(b=Ab=Z)||(b=0b=9)) { d[i++]=b; b=getchar(); } for(j=0;j11;j++)/* 查询保留字表确定该单词是否是保留字 */ { if(strcmp(d,a[j])==O) { prin tf(1,%s\n,d); k=1; break; } } if(k==O)/* 在保留字表中没有查到该单词,是标识符 */ prin tf(3,%s\n,d)

文档评论(0)

1亿VIP精品文档

相关文档