预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共24页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

魏陈强23020092204168 实验3递归下降法的语法分析器 一、实验目的 学习用递归下降法构造语法分析器的原理,掌握递归下降法的编程方法。 二、实验内容 用递归下降法编写一个语法分析程序,使之与词法分析器结合,能够根据语言的上下文无关文法,识别输入的单词序列是否文法的句子。 这里只要求实现部分产生式,文法的开始符号为program。(完整的源语言的文法定义见教材附录A.1,p394) program →block block → {stmts} stmts →stmtstmts| stmt → id=expr; | if(bool)stmt | if(bool)stmtelsestmt | while(bool)stmt | dostmtwhile(bool); | break; | block bool → expr<expr | expr<=expr | expr>expr | expr>=expr | expr expr → expr+term | expr-term | term term → term*factor | term/factor | factor factor → (expr)|id|num 三、实验要求 1.个人完成,提交实验报告。 2.实验报告中给出采用测试源代码片断,及其对应的最左推导过程(形式可以自行考虑)。 测试程序片断: { i=2; while(i<=100) { sum=sum+i; i=i+2; } } 对应的推导过程为: program block  {stmts}  {stmtstmts}  {id=expr;stmts}  {id=num;stmts}  {id=num;stmtstmts}  {id=num;while(bool)stmtstmts}  {id=num;while(expr<=expr)stmtstmts}  {id=num;while(id<=expr)stmtstmts}  {id=num;while(id<=num)stmtstmts}  {id=num;while(id<=num)blockstmts}  {id=num;while(id<=num){stmts}stmts} ....... 四、实验思路 之前编写的词法分析器,能够将语句中的每一个词素都识别出来,因此,在此基础上,定义一个二维字符串数组finaltable[100][20],用于存放由词法分析器提取出来的每个词素,比如,i=2,则finaltable[0]=”id”,finaltable[1]=”=”,finaltable[2]=”num”。并且,为了以后能够方便使用switch()case语句,另外再定义一个一维整型数组finaltableint[100],用于存放一个数字和finaltable[100][20]中的字符串对应。这里,我们定义if=100,for=200,else=300,while=400,do=500,float=600,int=700,break=800,<=17,<==16,>=15,>==14,+=13,&&=12,||=11,}=10,{=9,;=8;)=7,(=6,==5,===4,!==3,/=2,id=1,keyword=0,num=99,*=18,-=19。然后依据语法分析的正则表达式,参照实验一类似中缀改后缀的写法以及课本40页的伪代码编写。相比词法分析器,词法分析的时候,是以单个字符为一个单位,而语法分析,我们以字符串为单位,这些字符串即finaltable[100][20]中的字符串。编写的过程中涉及几个问题,1、如何把每一步的迭代都显示出来?对于这个问题,可以在每个非终结符函数的开头输出对应的迭代即可。2、在应用文法的时候,应该首先消除左递归,这是至关重要的,该实验我们只要消除expr()和term()的左递归即可。3、if语句二义性处理。对于这个问题,我们只要再往后看一个字符串,看其是否是else,如果是,则匹配if(bool)stmtelsestmt,否则匹配if(bool)stmt。4、对于空选择,如何处理?一开始的时候,我选择暂时忽略。 五、实验代码 #include<stdio.h> #include<string.h> #include<ctype.h> /* if=100,for=200,else=300,while=400,do=500,float=600,int=700,break=800,<=17,<==16,>=15,>==14,+=13,&&=12,||=11,}=10,{=9,;=8;)=7,(=6,==5,===4,!