1、编译原理实验报告实验二语法分析算符优先2 华北水利水电学院 编译原理 实验报告一、 实验题目:语法分析(算符优先分析程序)(1)选择最有代表性的语法分析方法算符优先法;(2)选择对各种常见程序语言都用的语法结构,如赋值语句(尤指表达式)作为分析对象,并且与所选语法分析方法要比较贴切。二、 实验内容(1)根据给定文法,先求出FirstVt和LastVt集合,构造算符优先关系表(要求算符优先关系表输出到屏幕或者输出到文件);(2)根据算法和优先关系表分析给定表达式是否是该文法识别的正确的算术表达式(要求输出归约过程)(3)给定表达式文法为:G(E): E#E#EE+T | TTT*F |FF(E)
2、|i(4) 分析的句子为: (i+i)*i和i+i)*i三、 程序源代#include#include#include#include#define SIZE 128char priority66; /算符优先关系表数组char inputSIZE; /存放输入的要进行分析的句子char remainSIZE; /存放剩余串 char AnalyseStackSIZE; /分析栈void analyse();int testchar(char x); /判断字符X在算符优先关系表中的位置void remainString(); /移进时处理剩余字符串,即去掉剩余字符串第一个字符int k;vo
3、id init()/构造算符优先关系表,并将其存入数组中 priority00=; priority01=; priority02=; priority03=; priority05=; priority10=; priority11=; priority12=; priority13=; priority15=; priority20=; priority21=; priority22=$;/无优先关系的用$表示 priority23=$; priority24=; priority25=; priority30=; priority31=; priority32=; priority33=
4、; priority41=; priority42=$; priority43=$; priority44=; priority45=; priority50=; priority51=; priority52=; priority53=; priority54=$; priority55=;void analyse()/对所输入的句子进行算符优先分析过程的函数 FILE *fp; fp=fopen(li,a); int i,j,f,z,z1,n,n1,z2,n2; int count=0;/操作的步骤数 char a; /用于存放正在分析的字符 char p,Q,p1,p2; f=strle
5、n(input); /测出数组的长度 for(i=0;i) for( ; ; ) Q=AnalyseStackj; if(AnalyseStackj-1=+|AnalyseStackj-1=*|AnalyseStackj-1=i|AnalyseStackj-1=(|AnalyseStackj-1=)|AnalyseStackj-1=#) j=j-1; else j=j-2; z1=testchar(AnalyseStackj); n1=testchar(Q); p1=priorityz1n1; if(p1=) /把AnalyseStackj+1AnalyseStackk归约为N count+;
6、 printf(%d) %st%10ct%5c%17st 归约n,count,AnalyseStack,p,a,remain); fprintf(fp,(%d) %st%17st %sn,count,AnalyseStack,remain,归约); k=j+1; i-; AnalyseStackk=N; int r,r1; r=strlen(AnalyseStack); for(r1=k+1;r1r;r1+) AnalyseStackr1=0; break; else continue; else if(p=) /表示移进 count+; printf(%d) %st%10ct%5c%17st
7、 移进n,count,AnalyseStack,p,a,remain); fprintf(fp,(%d) %st%17st %sn,count,AnalyseStack,remain,移进); k=k+1; AnalyseStackk=a; remainString(); else if(p=) z2=testchar(AnalyseStackj); n2=testchar(#); p2=priorityz2n2; if(p2=) count+; printf(%d) %st%10ct%5c%17st 接受n,count,AnalyseStack,p,a,remain); fprintf(fp
8、,(%d) %st%17st %sn,count,AnalyseStack,remain,接受); printf(该句子是该文法的合法句子。n); fprintf(fp,%s,该句子是该文法的合法句子。n); break; else count+; printf(%d) %st%10ct%5c%17st 移进n,count,AnalyseStack,p,a,remain); fprintf(fp,(%d) %st%17st %sn,count,AnalyseStack,remain,移进); k=k+1; AnalyseStackk=a; remainString(); else printf
9、(错误!该句子不是该文法的合法句子!n); fprintf(fp,%s,错误!该句子不是该文法的合法句子。n); break; fclose(fp); int testchar(char x) int m; if(x=+) m=0; if(x=*) m=1; if(x=i) m=2; if(x=() m=3; if(x=) m=4; if(x=#) m=5; return m;void remainString() int i,j; i=strlen(remain); for(j=0;j#E#n); printf(1)E-E+Tn); printf(2)E-Tn); printf(3)T-T*
10、Fn); printf(4)T-Fn); printf(5)F-(E)n); printf(6)F-in); FILE *fp; fp=fopen(li,w); fprintf(fp,%s,要分析的文法为:n); fprintf(fp,%s,(0)E-#E#n); fprintf(fp,%s,(1)E-E+Tn); fprintf(fp,%s,(2)E-Tn); fprintf(fp,%s,(3)T-T*Fn); fprintf(fp,%s,(4)T-Fn); fprintf(fp,%s,(5)F-(E)n); fprintf(fp,%s,(6)F-in); fprintf(fp,%s,优先关
11、系表为:n); fprintf(fp,%s, + * i ( ) #n); for(m=0;m6;m+) fprintf(fp,%c ,s1m); for(n=0;n n); printf( * n); printf( i n); printf( ( n); printf( # =n); printf(-n); printf(请输入要进行分析的句子(以#号结束输入):n); gets(input);/将输入的字符串存到数组中 fprintf(fp,%s,需要分析的字符串为:n); fprintf(fp,%s,input); fprintf(fp,%s,n); fclose(fp); print
12、f(步骤 栈 优先关系 当前符号 剩余输入串 移进或归约n); k=0; AnalyseStackk=#; AnalyseStackk+1=0; int length,i; /初始化剩余字符串数组为输入串 length=strlen(input);/ for(i=0;ilength;i+) remaini=inputi; remaini=0; analyse();/对所输入的句子进行算符优先分析过程的函数四、测试结果输入串(i+i)*i的算符优先分析过程输入串i+i)*i的算符优先分析过程五、小结(包括收获、心得体会、存在的问题及解决问题的方法、建议等)本次实验是算符优先分析法,这种方法特别有利于表达式分析,宜于手工实现。算符优先分析过程是自下而上的规约过程,但这种规约未必是严格的最左规约,也就是说,算符优先分析法不是一种规范规约法。通过这次实验,我对编译原理的理解又加深了一步。本次试验很难,所以求助于网络和同学,然后经过自己的更改编辑,将结果存入名为li的文件中。虽然对编程依旧感觉很困难,但是经过这次实验,我对存写文件,以及算符优先分析法的理解与学习又上升了一个台阶。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1