资源描述:
《北邮编译原理语法分析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、编译原理语法分析实验报告班级:2013211307学号:2013211353姓名:陈剑南目录1.实验题目及要求2.递归调用预测分析实现自顶向下分析3.实验1.实验题目及要求题目:语法分析程序的设计与实现。 实验内容:编写语法分析程序,实现对算术表达式的语法分析。要求所分析算术表达式由如下的文法产生。 E->E+T
2、E-T
3、TT->T*F
4、T/F
5、FF->id
6、(E)
7、num实验要求:在对输入表达式进行分析的过程中,输出所采用的产生式。 方法1:编写递归调用程序实现自顶向下的分析。 方法2:编写LL(1)语法分析程序,要求如下。 (
8、1) 编程实现算法4.2,为给定文法自动构造预测分析表。 (2)编程实现算法4.1,构造LL(1)预测分析程序。 方法3:编写语法分析程序实现自底向上的分析,要求如下。 (1) 构造识别所有活前缀的DFA。 (2)构造LR分析表。 (3) 编程实现算法4.3,构造LR分析程序。 方法4:利用YACC自动生成语法分析程序,调用LEX自动生成的词法分析程序。2.递归调用预测分析实现自顶向下分析(1)消除文法左递归文法改写为:E->TE''E''->E'E''
9、εE'->+T
10、-TT->FT''T''->T'T''
11、εT'->*F
12、/F
13、F->id
14、num
15、(E)(2)状态图:(3)化简后得3.实验结果(1)1+3(2)A*3(3)3+(出错)4.实验心得本次实验我是用的是递归下降分析方法,分析过程基本同书上的过程一样,消除左递归与状态转移图均是在纸上完成,只是用代码完成了递归分析过程。总体来说该方法比较简单,分析过程也比较清楚。遗憾在于:本想使用LR或是LL分析方法。5.源程序/**本题使用的是第一种方法*通过递归调用程序实现自顶向下的分析*1.首先消除左递归*得到:*E->TE''E''->E'E''
16、εE'->+T
17、-TT->FT''T''->T'T''
18、ε
19、T'->*F
20、/FF->id
21、num
22、(E)*2.化简状态转换图*3.实现预测分析*/#include#include#include#includeusingnamespacestd;inti;//全局变量,确定被判断的字符在字符串中的位置intprocE(stringstr,int&i);intprocT(stringstr,int&i);intprocF(stringstr,int&i);intprocE(stringstr,int&i){intres
23、ult;cout<<"ttE->TE''";if(str[i]!='$'){//递归T的过程if(procT(str,i)==1){if(str[i]=='+'
24、
25、str[i]=='-'){cout<<"ttE''->E'E''";cout<+T";elsecout<<"E'->-T";i++;result=procT(str,i);//调用T的过程if(str[i]=='$'
26、
27、str[i]==')'){cout<<"t
28、tE''->ε";}}elseif(str[i]=='$'
29、
30、str[i]==')'){cout<<"ttE''->ε";result=1;}else{result=-1;}}elseresult=-1;}elseresult=1;returnresult;}intprocT(stringstr,int&i){intresult;cout<<"ttT->FT''";if(procF(str,i)==1){if(str[i]=='*'
31、
32、str[i]=='/'){cout<<"ttT''->T'T''"
33、;cout<*F";elsecout<<"T'->/F";i++;result=procF(str,i);if(str[i]=='$'
34、
35、str[i]=='+'
36、
37、str[i]=='-'
38、
39、str[i]==')'){cout<<"ttT''->ε";}}elseif(str[i]=='$'
40、
41、str[i]=='+'
42、
43、str[i]=='-'
44、
45、str[i]==')'){cout<<"ttT''->ε";result=1;}e
46、lse{result=-1;}}elseresult=-1;returnresult;}intprocF(stringstr,int&i){intresult;if(str[i]=='('){cout<