《编译原理_词法分析器_实验报告(20220301233624).pdf》由会员分享,可在线阅读,更多相关《编译原理_词法分析器_实验报告(20220301233624).pdf(10页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、词法分析器实验报告实验目的:设计、编制、调试一个词法分析子程序识别单词,加深对词法分析原理的理解。功能描述:该程序要实现的是一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error!”,然后跳过错误部分继续进行)设计思想:设计该词法分析器的过程中虽然没有实际将所有的状态转移表建立出来,但是所用的思想是根据状态转移表实现对单词的识别。首先构造一个保留字表,然后,每输入一个字符就检测应该进入什么状态,并将该字符连接到d 串后继续输入,如此循环,最后根据所在的接受状态
2、以及保留字表识别单词。符号表:记号类别属性值ws-const 保留字1 var 保留字1 call 保留字1 begin 保留字1 if 保留字1 while 保留字1 do 保留字1 odd 保留字1 end 保留字1 then 保留字1 procedure 保留字1=运算符2 运算符2=运算符2 运算符2 运算符2=运算符2*运算符2+运算符2-运算符2/运算符2:=运算符2 ident 标识符3 number 常数4(分隔符5)分隔符5;分隔符5,分隔符5.分隔符5 状态转换图:标识符及保留字:number:关系操作符:Start letter letter or digitt 0 2
3、1 4 3 65 start digit.digit E+|-digit digit digit digit E digit other other 分隔符:start other=(=other =*(,2)(=,2)(,2):=(:=,2)算术运算符:使用环境:Windows xp 下的 visual c+6.0 程序测试:input1:int a,b;a=b+2;start;(),.(;,5)(,5)(),5)(,5)(.,5)start+-*/(+,2)(-,2)(*,2)(/,2)input2:while(a=0)do 7x=x+6.7E+23;end;input3:begin:x:
4、=9 if x0 then x:=x+1;while a:=0 do b:=2*x/3,c:=a;end;output1:3,int 3,a 5,3,b 5,;3,a 2,=3,b 2,+4,2 5,;output2:output2:1,while 5,(3,a 2,=4,0 5,)1,do error line 3 2,=3,x 2,+4,6.7E+23 5,;1,end 5,;output3:output3:1,begin error line 1 3,x 2,:=4,9 1,if 3,x 2,4,0 1,then 3,x 2,:=3,x 2,+4,1 5,;1,while 3,a 2,:
5、=4,0 1,do 3,b 2,:=4,2 2,*3,x 2,/4,3 5,3,c 2,:=3,a 5,;1,end 5,;测试结果与预期结果一致源程序代码:#include#include void main()int i=0,j,k=0,state=1,f=0,linenum=1;char a1110=const,var,call,begin,if,while,do,odd,end,then,procedure;char b,d40=0;freopen(input.txt,r,stdin);freopen(output.txt,w,stdout);b=getchar();while(b!=
6、EOF)/*判断所输入字符是否为结束符*/if(b=|b=n|b=t)/*滤过空格、换行等分隔符号*/if(b=n)linenum+;b=getchar();else if(b=a&b=A&b=a&b=A&b=0&b=9)di+=b;b=getchar();for(j=0;j11;j+)/*查询保留字表确定该单词是否是保留字*/if(strcmp(d,aj)=0)printf(1,%sn,d);k=1;break;if(k=0)/*在保留字表中没有查到该单词,是标识符*/printf(3,%sn,d);for(j=0;j=0&b=0&b=0&b=0&b=0&b=0&b=0&b=9)state=
7、6;di+=b;b=getchar();else state=7;break;case 7:f=1;break;case 8:f=1;break;if(state=7&(bz)&(bZ)printf(4,%sn,d);else if(state=7&(b=a&b=A&b=a&b=A&b=Z)di+=b;b=getchar();printf(error line%dn,linenum);else printf(error line%dn,linenum);for(j=0;j=i;j+)dj=0;i=0;f=0;state=1;else if(b=)/*识别 、=和*/di+=b;b=getcha
8、r();if(b=|b=)di+=b;b=getchar();printf(2,%sn,d);for(j=0;j=i;j+)dj=0;i=0;else printf(2,%sn,d);for(j=0;j)/*识别 和=*/di+=b;b=getchar();if(b=)di+=b;b=getchar();printf(2,%sn,d);for(j=0;j=i;j+)dj=0;i=0;else printf(2,%sn,d);for(j=0;j=i;j+)dj=0;i=0;else if(b=:)/*识别:=*/di+=b;b=getchar();if(b=)di+=b;b=getchar();
9、printf(2,%sn,d);else printf(error line%dn,linenum);for(j=0;j=i;j+)dj=0;i=0;else if(b=*|b=+|b=-|b=/|b=)/*识别运算符*/printf(2,%cn,b);b=getchar();else if(b=(|b=)|b=,|b=;|b=.)/*识别分隔符*/printf(5,%cn,b);b=getchar();else printf(error line%dn,linenum);b=getchar();实验心得:此次实验让我了解了如何设计、编制并调试词法分析程序,并加深了我对词法分析器原理的理解;熟悉了直接构造词法分析器的方法和相关原理,并学会使用c 语言直接编写词法分析器;同时更熟练的掌握用c 语言编写程序,实现一定的实际功能。