欢迎来到天天文库
浏览记录
ID:12328036
大小:258.50 KB
页数:36页
时间:2018-07-16
《语法分析器(含完整源码)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、语法分析实验报告一、实验目的:1.了解单词(内部编码)符号串中的短语句型结构形成规律。2.理解和掌握语法分析过程中语法分析思想(LL,LR)的智能算法化方法。二、实验内容:构造自己设计的小语言的语法分析器:1.小语言的语法描述(语法规则)的设计即文法的设计;2.把文法形式符号中所隐含的信息内容挖掘出来并用LL或LR的资料形式(分析表)表示出来;3.语法分析的数据输入形式和输出形式的确定;4.语法分析程序各个模块的设计与调试。主要设备和材料:电脑、win7操作系统、VC语言系统三、实验步骤:1、语法规则①<程序>::={<变量定义语句>
2、
3、<赋值语句>
4、<条件语句>
5、<循环语句>}②<变量定义语句>::=var变量{,变量};③<赋值语句>::=变量:=<表达式>;④<表达式>::=标识符{运算符标识符};⑤<标识符>::=变量
6、常量⑥<运算符>::=+
7、-
8、*
9、/
10、>=
11、<=⑦<条件语句>::=[]⑧::=if(表达式)then[begin]{赋值语句
12、条件语句
13、循环语句}[end]⑨::=[begin]{赋值语句
14、条件语句
15、循环语句}[end]⑩<循环语句>::=while(表达式)[begin]{赋值语句
16、条件
17、语句
18、循环语句}[end]<输出语句>::=prn表达式--注1:若if语句、else语句、循环语句中出现begin,后面的end必须出现,即begin与end同对出现--注2:if、while后的"(",")"表示终结符,而不是定义成分优先的说明符号2、分析表::=变量常量,;运算符()变量定义->②->②->②->②赋值语句->③->③->③->③->③条件语句->⑦->⑦->⑦->⑦->⑦->⑦->⑦循环语句->⑩->⑩->⑩->⑩->⑩->⑩->⑩输出语句->->->分析表(续):whilevarbeginendifthenpr
19、n变量定义->②赋值语句条件语句->⑦->⑦->⑦->⑦循环语句->⑩->⑩->⑩输出语句->3、调试和测试四、源代码(见附录):五、实验总结:本实验在词法分析的基础上,对提取出的标识符进行语法判断。对已有的语法规则运用LL(1)文法判别并进行构造分析表时,遇到的最大困难是:当发生规约冲突时,该如何处理。如对于产生式s-->aAb,当对a进行规约时,满足语法规则的β(用户输入串中当前要进行规约的标识符)只有有限种,而不满足的却有无限种情况。当发生规约冲突时,如何在这无限种情况中,确定冲突的具体信息,以便用户查找。在反复的尝试和验证中,我
20、们发现发生冲突的用户输入串满足一定的规律,且按这种规律可以把这无限种情况化归为有限类,于是我们找出其中规律并进行划分,然后再对这些有限类冲突进行处理。六、实验心得:通过这次实验有以下几点收获:1.LR(1)的构造使得对理论的知识理解的更加透彻。其中LR(1)分析表构造了很多遍,一直无法得到正确结果,这是恒心的考验。2.在写程序中用类数组来存放单词属性使得对单词各项值的调用更加方便,特别是对出错信息的检测有很大的作用。3.本实验是在词法基础上的更进一步,在词法程序上添加语法程序,更加理解二者之间的关系。词法分析为语法分析提供了词法单元,方
21、便分析,使程序模块化,易于读懂。附录:#include#include#include#include#include#includeusingnamespacestd;#defineMax655//最大代码长度#defineWordMaxNum256//变量最大个数#defineDigitNum256//常量最大个数#defineMaxKeyWord33//关键字数量#defineMaxOptANum8//运算符最大个数#defi
22、neMaxOptBNum4//运算符最大个数#defineMaxEndNum11//界符最大个数typedefstructDisplayTable{intIndex;//标识符所在表的下标inttype;//标识符的类型intline;//标识符所在表的行数charsymbol[20];//标识符所在表的名称}Table;intTableNum=0;//display表的表项总数charWord[WordMaxNum][20];//标识符表charDigit[WordMaxNum][20];//数字表intWordNum=0;//变量表
23、的下标intDigNum=0;//常量表的下标boolerrorFlag=0;//错误标志intTableIndex=-1;//display表的下标索引intbeginCount=0;//遇到begin加
此文档下载收益归作者所有