欢迎来到天天文库
浏览记录
ID:47569071
大小:211.54 KB
页数:12页
时间:2019-09-19
《语法分析报告》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、编译原理语法分析报告院(系)计算机学院专业班级计科0703班姓名李国强学号(班内序号)04071082(12)1•实验目的1、了解形式语言基础及其文法运算;2、熟悉语法分析原理及3种常用的语法分析方法;其中,三种算法为:(1)设计算术表达式的LL⑴分析算法(2)设计算术表达式的算符优先分析算法(3)设计算术表达式的SLR(l)分析算法3、选择上述一种方法并设计一个表达式的语法分析器运行环境:windowsxpvisualC++6.0任务分工:李国强负责:总体构思,以及问题处理,适用性测试。马彦辉负责:编写输入,以及求first,follow集,判断是否为LL(1)文法聂敏天负责:
2、编写判断一个字符串是否为输入文法的合法句型2•实验要求1、(必做)对于如下的文法,试编写调试一个语法分析程序E->E+T
3、TT->T*F
4、FF-P"F
5、PP-(E)
6、i要求:1)选择一种语法分析方法(LL(1)、算符优先、SLR仃))作为编制语法分析程序的依据。2)对于所选定的分析方法,如有需要,应选择一种合适的数据结构,以构造所给文法的机内表示。3)能进行分析过程模拟。如输入一个句子,能输岀与句子对应的语法树,能对语法树牛成过程进行模拟;能够输岀分析过程每一步符号栈的变化情况。(2、3选做一题)2、FIRST集和FOLLOW集生成算法模拟基本要求:1)输入一个文法G;2)输岀由
7、文法G构造FIRST集的算法;3)输出FIRST集;4)输出由文法G构造FOLLOW集的算法;5)输岀FOLLOW集。测试数据:文法G[E]:E->TE,E9->+TE,
8、eT->FT,『->*F『
9、sF->(E)
10、i3、F1RSTVT集和LASTVT集生成算法模拟基本要求:1)输入一个文法G;2)输岀由文法G构造FTRSTVT集的算法;3)输岀FIRSTVT集;4)输出由文法G构造LASTVT集的算法;5)输岀LASTVT集。测试数据:文法G[E]:E->TE,E,->+TE,
11、eT-〉FT'『-〉*FT,
12、eF->(E)Ii3.实验内容和步骤1.设计表达式的语法语法分析器算法
13、2.编写代码并上机调试运行通过要求:输入表达式输岀表达式语法是否正确运用算术表达式的LL(1)分析算法来设计的表达式的语法分析器。LL(1)文法是一种自上而下的语法分析方法,它是从文法的识别符号出发,生成句子的最左推导,从左到右扫描源程序,每次向前查看1个字符,便能确定当前应该选择的产生式。LL(1)分析需要用到一个分析表M和一个符号栈S,分析表M是一个矩阵,它的元素可以存放一个非终结符的产生式,表明当符号栈S的栈顶元素非终结符遇到当前输入字符时,所应选择的产生式;M的元素还可以是存放一个出错标志,说明符号栈S的栈顶元素非终结符不应该遇到当前输入字符(终结符)O重复调用LL(1)
14、分析方法对每一个输入字符进行分析,直到输入栈为空为止。数据定义intcount^O;/*分解的产生式的个数*/intnumber;/*所有终结符和非终结符的总数*/charstart;chartermin[50];charnon_ter[50];charv[50];charIeft[50];charright[50][50];/*开始符号*//*终结符号*//*非终结符号*//*所有符号*//*左部*//*右部*/charfirst[50][50],foIIow[50][50];/*各产生式右部的FIRST和左部的FOLLOW集合*/charfirst1[50][50];char
15、seIect[50][50];charf[50],F[50];charempty[20];charTEMP[50];/*所有单个符号的FIRST集合*//*各单个产生式的SELECT集合*//*记录各符号的FIRST和FOLLOW是否已求过*//*记录可直接推出@的符号*//*求FOLLOW时存放某一符号串的FIRST集合*/intvaIidity=1;intII二1;intM[20][20];/*表示输入文法是否有效*//*表示输入文法是否为LL(1)文法*//*分析表*/charchoose;charempt[20];charfo[20];/*用户输入时使用*//*求_emp
16、()时使用*//*求FOLLOW集合时使用*/求单个符号的FIRSTvoidfirst2(inti){/*i为符号在所有输入符号中的序号*/charcTtemp[20];intj,k,m;c二V[订;charch=@;emp(ch);if(in(c,termin)==1)/*若为终结符*/first1[i][0]=c;firs廿[i]⑴二‘ ‘;}eIseif(in(c,non_ter)==1)/*若为非终结符*/{for(j二0;j<=count-1;j++){if(left
此文档下载收益归作者所有