资源描述:
《编译原理实验_词法分析》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、编译原理词法分析程序一、实验目的构造词法分析程序,程序要求能对输入的字符串流进行词法分析。在试验过程中,学会应用单词分析的方法——NFA(非确定有限自动机)和DFA(确定有限自动机),加深对词法分析原理的理解。二、实验内容了解语言的基本词法,并为之构造一个不确定有限自动机NFA,并将其转换成确定有限自动机DFA;然后一句此DFA编写词法分析程序。三、实验参考(一)惯用的词法(1)关键字functionifthenwhiledoendfunc所有关键字都是保留字,并且必须是小写。(2)专用符号=+-*/<<=!=>>===;
2、()#(3)其他单词是标识符(id)和整形常数(num),通过下列正则式定义。id=letter(letter
3、digit)*num=digitdigit*letter=a
4、…
5、z
6、A
7、…
8、Zdigit=0
9、…
10、9小写和大写字母是有区别的。(4)空格由空白、换行符和制表符组成。空格一般用来分隔id、num、运算符和关键字,词法分析阶段通常被忽略。(5)各种单词符号对应的种别码如图所示:单词符号种别码function1if2then3while4do5endfunc6Letter(letter
11、digit)*10digitd
12、igit*11+13-14*15/16=18<20<=21!=22>23>=24==25;26(27)28#0(二)词法分析程序的功能(1)输入为所给文法的源程序字符串。(2)程序的输出形式为单词串的输出形式。所输出的每一单词,均按形如(syn,token和sun)的二元式编码。其中,syn为单词种别码;token为存放的单词自身字符串;sum为整形常数。(3)测试源程序输入。Functionx=9;ifx>0thenx=2*x+1/3;endfunc#(4)输出结果。(1,function)(10,’x’)(18,=)(
13、11,9)(26,;)(2,if)……(三)算法设计思想为翟玉庆老师上课所讲。一、实验源程序#include#includecharprog[80],token[8];charch;intsyn,p,m,n,sum;char*rwtab[6]={"function","if","then","while","do","endfunc"};voidscaner();main(){p=0;printf("pleaseinputstring:");do{scanf("%c",&ch);p
14、rog[++p]=ch;}while(ch!='#');//for(inti=0;i<80;i++)//printf("%c",prog[i]);p=0;do{scaner();switch(syn){case11:printf("(%d,%d)",syn,sum);break;case-1:printf("erron");break;default:printf("(%d,%s)",syn,token);}}while(syn!=0);}voidscaner(){for(n=0;n<8;n++)token[n
15、]=NULL;ch=prog[++p];while(ch==''
16、
17、ch==''
18、
19、ch=='t')ch=prog[++p];if(ch>='a'&&ch<='z'){m=0;while((ch>='a'&&ch<='z')
20、
21、(ch>='0'&&ch<='9')){token[m++]=ch;ch=prog[++p];}token[m]=' ';ch=prog[--p];syn=10;for(n=0;n<6;n++)if(strcmp(token,rwtab[n])==0){syn=n+1;break;}}els
22、eif(ch>='0'&&ch<='9'){sum=0;while(ch>='0'&&ch<='9'){sum=sum*10+ch-'0';ch=prog[++p];}ch=prog[--p];syn=11;}elseswitch(ch){case'<':m=0;token[m++]=ch;ch=prog[++p];if(ch=='='){syn=22;token[m+1]=ch;}else{syn=20;ch=prog[--p];}break;case'>':m=0;token[m++]=ch;ch=prog[++p];
23、if(ch=='='){syn=24;token[m++]=ch;}else{syn=23;ch=prog[--p];}break;case'=':m=0;token[m++]=ch;ch=prog[++p];if(ch=='='){syn=25;token[m++]=ch;}else{syn=18;c