资源描述:
《递归下降分析器的设计》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、河北大学工商学院编译原理实验报告河北大学工商学院编译原理实验报告年级09级学号姓名成绩专业计算机科学与技术实验地点B3-216指导教师李凯实验项目递归下降分析器的设计实验日期2012/5/14实验报告要求:一、实验目的1.实验目的使用递归子程序法设计一个语法分析程序,理解自顶向下分析方法的原理,掌握手工编写语法分析程序的方法。2.了解什么是LL(1)文法的,以及如何把一个非ll(1)的文法转化为非ll(1)型文法,深入了解如何根据ll(1)文法编写递归子程序,实现语法的检查。3.深入了解编译程序语法分析
2、的过程。二、实验原理1.基本原理递归下降法是语法分析中最易懂的一种方法。它的主要原理是,对每个非终极符按其产生式结构构造相应语法分析子程序,其中终极符产生匹配命令,而非终极符则产生过程调用命令。因为文法递归相应子程序也递归,所以称这种方法为递归子程序下降法或递归下降法。其中子程序的结构与产生式结构几乎是一致的。2.文法要求递归下降法要满足的条件:假设A的全部产生式为Aα1
3、α2
4、……
5、αn,则必须满足如下条件才能保证可以唯一的选择合适的产生式Select(A->αi)∩select(A->αj)=Φ,当
6、i≠j,即要求文法必需满足ll(1)文法。共9页第9页6/22/2021河北大学工商学院编译原理实验报告3.开发工具要求本程序使用C语言写的,要求掌握C语言的基本语法和语义,特别是关于程序递归调用的要求。4.文法的BNF式:E->EaT
7、T;T->TbF
8、FF->(E)
9、da:=+
10、-b:=*
11、/消除左递归之后的文法E->TE’E’->aTE’
12、εT->bFT’
13、εT’->bFT’F->(E)
14、da:=+
15、-b:=*
16、/三、实验要求【目的】使用递归子程序法设计一个语法分析程序,理解自顶向下分析方法的原理
17、,掌握手工编写语法分析程序的方法。【要求】1、使用递归下降分析算法分析表达式文法:exp::=expaddopterm
18、term共9页第9页6/22/2021河北大学工商学院编译原理实验报告addop::=+
19、-term::=termmulopfactor
20、factormulop::=*
21、/factor::=(exp)
22、number其中number可以是多位的十进制数字串(整数即可),因此这里还需要一个小的词法分析器来得到number的值。2、该词法分析器以子程序形式出现,当需要进行词法分析时进行调用;
23、3、能够识别正确和错误的表达式;4、在进行语法分析的过程中,计算输入表达式的值。四、实验结果(程序)及分析程序源代码:#include#include#include"file.h"intright=1;charch[100];inti=0;voidmain(){intj=0;charc;FILE*fp;if((fp=fopen("Source.txt","r"))==NULL)共9页第9页6/22/2021河北大学工商学院编译原理实验报告{printf("file
24、openerror");exit(0);}c=fgetc(fp);while(!feof(fp)){ch[j]=c;j++;c=fgetc(fp);}e();if(right)printf("分析成功");elseprintf("分析失败,输入的表达式不合法,请重新输入");}voide(){t();e1();}共9页第9页6/22/2021河北大学工商学院编译原理实验报告voidt(){f();t1();}voidt1(){if(ch[i]=='*'
25、
26、ch[i]=='/'){i++;f(
27、);t1();}elseif(ch[i]!='#'&&ch[i]!=')'&&ch[i]!='+'&&ch[i]!='-')right=0;}voide1(){if(ch[i]=='+'
28、
29、ch[i]=='-'){i++;共9页第9页6/22/2021河北大学工商学院编译原理实验报告t();e1();}elseif(ch[i]=='#'
30、
31、ch[i]==')')return;elseright=0;}voidf(){if(ch[i]>='0'&&ch[i]<='9')isnumber();elseif(
32、ch[i]=='('){i++;e();if(ch[i]==')'){i++;}共9页第9页6/22/2021河北大学工商学院编译原理实验报告elseright=0;}elseright=0;}voidisnumber(){while(ch[i]>='0'&&ch[i]<='9'){i++;}}File.h中的代码:voide();voidf();voidt();voidt1();voide1();voidisnumber();实验结果分析