编译原理语法分析实验报告

合集下载

编译原理语法分析实验报告

编译原理语法分析实验报告

编译原理语法分析实验报告编译原理语法分析实验报告引言编译原理是计算机科学中的重要课程,它研究的是如何将高级语言转化为机器语言的过程。

语法分析是编译过程中的一个关键步骤,它负责将输入的源代码转化为抽象语法树,为后续的语义分析和代码生成提供便利。

本实验旨在通过实践,加深对语法分析的理解,并掌握常见的语法分析算法。

实验环境本次实验使用的是Python编程语言,因为Python具有简洁的语法和强大的库支持,非常适合用于编译原理的实验。

实验步骤1. 词法分析在进行语法分析之前,需要先进行词法分析,将源代码划分为一个个的词法单元。

词法分析器的实现可以使用正则表达式或有限自动机等方式。

在本实验中,我们选择使用正则表达式来进行词法分析。

2. 文法定义在进行语法分析之前,需要先定义源代码的文法。

文法是一种形式化的表示,它描述了源代码中各个语法成分之间的关系。

常见的文法表示方法有巴科斯范式(BNF)和扩展巴科斯范式(EBNF)。

在本实验中,我们选择使用BNF来表示文法。

3. 自顶向下语法分析自顶向下语法分析是一种基于产生式的语法分析方法,它从文法的起始符号开始,逐步展开产生式,直到生成目标字符串。

自顶向下语法分析的关键是选择合适的产生式进行展开。

在本实验中,我们选择使用递归下降分析法进行自顶向下语法分析。

4. 自底向上语法分析自底向上语法分析是一种基于移进-归约的语法分析方法,它从输入串的左端开始,逐步将输入符号移入分析栈,并根据产生式进行归约。

自底向上语法分析的关键是选择合适的归约规则。

在本实验中,我们选择使用LR(1)分析法进行自底向上语法分析。

实验结果经过实验,我们成功实现了自顶向下和自底向上两种语法分析算法,并对比了它们的优缺点。

自顶向下语法分析的优点是易于理解和实现,可以直接根据产生式进行展开,但缺点是对左递归和回溯的处理比较困难,而且效率较低。

自底向上语法分析的优点是可以处理任意文法,对左递归和回溯的处理较为方便,而且效率较高,但缺点是实现相对复杂,需要构建分析表和使用分析栈。

编译原理语法分析试验报告

编译原理语法分析试验报告

编译原理语法分析试验报告语法分析是编译原理中的重要内容之一,主要用于对源程序进行语法检查,判断其是否符合给定的语法规则。

本次试验通过使用ANTLR工具,对C语言的子集进行了语法分析的实现。

一、实验目的:1.了解语法分析的基本概念和方法;2.使用ANTLR工具生成语法分析器;3.掌握ANTLR工具的基本使用方法;4.实现对C语言子集的语法分析。

二、实验内容:本次试验主要内容是使用ANTLR工具生成C语言子集的语法分析器,并对给定的C语言子集进行语法分析。

三、实验步骤:1.学习ANTLR工具的基本概念和使用方法;2.根据C语言子集的语法规则,编写ANTLR的语法文件(.g文件);3.使用ANTLR工具生成语法分析器;4.编写测试代码,对给定的C语言子集进行语法分析。

四、实验结果:经过以上的步骤,得到了一个完整的C语言子集的语法分析器,并且通过测试代码对给定的C语言子集进行了语法分析。

五、实验总结:通过本次实验,我对语法分析有了更深入的了解,掌握了使用ANTLR工具生成语法分析器的基本方法,同时也巩固了对C语言的基本语法规则的理解。

在实验过程中,遇到了一些问题,例如在编写ANTLR的语法文件时,对一些特殊语法规则的处理上有些困惑,但通过查阅资料和与同学的探讨,最终解决了这些问题。

本次试验对于我的学习有很大的帮助,我了解到了编译原理中的重要内容之一,也更深入地理解了语法分析的基本原理和方法。

通过实验,我发现使用ANTLR工具能够更方便地生成语法分析器,大大提高了开发效率。

总之,本次试验让我对编译原理中的语法分析有了更深入的了解,并且提高了我的编程能力和分析问题的能力。

在今后的学习和工作中,我将继续深入研究编译原理相关的知识,并应用到实际项目中。

编译原理语法分析实验报告

编译原理语法分析实验报告

编译原理语法分析实验报告第一篇:编译原理语法分析实验报告实验2:语法分析1.实验题目和要求题目:语法分析程序的设计与实现。

实验内容:编写语法分析程序,实现对算术表达式的语法分析。

要求所分析算术表达式由如下的文法产生。

E→E+T|E-T|TT→T*F|T/F|F F→id|(E)|num实验要求:在对输入表达式进行分析的过程中,输出所采用的产生式。

方法1:编写递归调用程序实现自顶向下的分析。

方法2:编写LL(1)语法分析程序,要求如下。

(1)编程实现算法4.2,为给定文法自动构造预测分析表。

(2)编程实现算法4.1,构造LL(1)预测分析程序。

方法3:编写语法分析程序实现自底向上的分析,要求如下。

(1)构造识别所有活前缀的DFA。

(2)构造LR分析表。

(3)编程实现算法4.3,构造LR分析程序。

方法4:利用YACC自动生成语法分析程序,调用LEX自动生成的词法分析程序。

实现(采用方法1)1.1.步骤:1)对文法消除左递归E→TE'E'→+TE'|-TE'|εT→FT'T'→*FT'|/FT'|εF→id|(E)|num2)画出状态转换图化简得:3)源程序在程序中I表示id N表示num1.2.例子:a)例子1 输入:I+(N*N)输出:b)例子2 输入:I-NN 输出:第二篇:编译原理实验报告编译原理实验报告报告完成日期 2018.5.30一.组内分工与贡献介绍二.系统功能概述;我们使用了自动生成系统来完成我们的实验内容。

我们设计的系统在完成了实验基本要求的前提下,进行了一部分的扩展。

增加了声明变量类型、类型赋值判定和声明的变量被引用时作用域的判断。

从而使得我们的实验结果呈现的更加清晰和易懂。

三.分系统报告;一、词法分析子系统词法的正规式:标识符(|)* 十进制整数0 |(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)* 八进制整数0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)* 十六进制整数0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)* 运算符和分隔符 +| * | / | > | < | = |(|)| <=|>=|==;对于标识符和关键字: A5—〉 B5C5 B5—〉a | b |⋯⋯| y | z C5—〉(a | b |⋯⋯| y | z |0|1|2|3|4|5|6|7|8|9)C5|ε综上正规文法为: S—〉I1|I2|I3|A4|A5 I1—〉0|A1 A1—〉B1C1|ε C1—〉E1D1|ε D1—〉E1C1|εE1—〉0|1|2|3|4|5|6|7|8|9 B1—〉1|2|3|4|5|6|7|8|9 I2—〉0A2 A2—〉0|B2 B2—〉C2D2 D2—〉F2E2|ε E2—〉F2D2|εC2—〉1|2|3|4|5|6|7 F2—〉0|1|2|3|4|5|6|7 I3—〉0xA3 A3—〉B3C3 B3—〉0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f C3—〉(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)|C3|εA4—〉+ |-| * | / | > | < | = |(|)| <=|>=|==; A5—〉 B5C5 B5—〉a | b |⋯⋯| y | z C5—〉(a | b |⋯⋯| y | z |0|1|2|3|4|5|6|7|8|9)C5|ε状态图流程图:词法分析程序的主要数据结构与算法考虑到报告的整洁性和整体观感,此处我们仅展示主要的程序代码和算法,具体的全部代码将在整体的压缩包中一并呈现另外我们考虑到后续实验中,如果在bison语法树生成的时候推不出目标的产生式时,我们设计了报错提示,在这个词的位置出现错误提示,将记录切割出来的词在code.txt中保存,并记录他们的位置。

国开电大 编译原理 实验4:语法分析实验报告

国开电大 编译原理 实验4:语法分析实验报告

国开电大编译原理实验4:语法分析实
验报告
1. 实验目的
本实验的目的是研究和掌握语法分析的原理和实现方法。

2. 实验内容
本次实验主要包括以下内容:
- 设计并实现自顶向下的LL(1)语法分析器;
- 通过语法分析器对给定的输入串进行分析,并输出相应的分析过程;
- 编写测试用例,验证语法分析器的正确性。

3. 实验步骤
3.1 设计LL(1)文法
首先,根据实验要求和给定的语法规则,设计LL(1)文法。

3.2 构建预测分析表
根据所设计的LL(1)文法,构建预测分析表。

3.3 实现LL(1)语法分析器
根据预测分析表,实现自顶向下的LL(1)语法分析器。

3.4 对输入串进行分析
编写程序,通过LL(1)语法分析器对给定的输入串进行分析,并输出相应的分析过程和结果。

3.5 验证语法分析器的正确性
设计多组测试用例,包括正确的语法串和错误的语法串,验证语法分析器的正确性和容错性。

4. 实验结果
经过实验,我们成功设计并实现了自顶向下的LL(1)语法分析器,并对给定的输入串进行了分析。

实验结果表明该语法分析器具有较好的准确性和容错性。

5. 实验总结
通过本次实验,我们对语法分析的原理和实现方法有了更深入的了解。

同时,我们也学会了如何设计并实现自顶向下的LL(1)语
法分析器,并验证了其正确性和容错性。

这对于进一步研究编译原理和深入理解编程语言的语法结构具有重要意义。

6. 参考资料
- 《编译原理与技术》
- 课程实验文档及代码。

编译原理-语法分析程序报告

编译原理-语法分析程序报告

编译原理实验实验二语法分析器实验二:语法分析实验一、实验目的根据给出的文法编制LR(1)分析程序,以便对任意输入的符号串进行分析。

本次实验的目的主要是加深对LR(1)分析法的理解。

二、实验预习提示1、LR(1)分析法的功能LR(1)分析法的功能是利用LR(1)分析表,对输入符号串自下而上的分析过程。

2、LR(1)分析表的构造及分析过程。

三、实验内容对已给语言文法,构造LR(1)分析表,编制语法分析程序,要求将错误信息输出到语法错误文件中,并输出分析句子的过程(显示栈的内容);实验报告必须包括设计的思路,以及测试报告(输入测试例子,输出结果)。

语法分析器一、功能描述:语法分析器,顾名思义是用来分析语法的。

程序对给定源代码先进行词法分析,再根据给定文法,判断正确性。

此次所写程序是以词法分析器为基础编写的,由于代码量的关系,我们只考虑以下输入为合法:数字自定义变量+ * ()$作为句尾结束符。

其它符号都判定为非法。

二、程序结构描述:词法分析器:class wordtree;类,内容为字典树的创建,插入和搜索。

char gettype(char ch):类型处理代入字串首字母ch,分析字串类型后完整读入字串,输出分析结果。

因读取过程会多读入一个字母,所以函数返回该字母进行下一次分析。

bool isnumber(char str[]):判断是否数字代入完整“数字串”str,判断是否合法数字,若为真返回1,否则返回0。

bool isoperator(char str[]):判断是否关键字代入完整“关键字串”str,搜索字典树判断是否存在,若为存在返回1,否则返回0。

语法分析器:int action(int a,char b):代入当前状态和待插入字符,查找转移状态或归约。

node2 go(int a):代入当前状态,返回归约结果和长度。

void printstack():打印栈。

int push(char b):将符号b插入栈中,并进行归约。

编译原理语法分析实验报告

编译原理语法分析实验报告

编译原理语法分析实验报告编译原理实验报告一、实验目的本实验的主要目的是熟悉编译原理中的语法分析算法及相关知识,并通过实际编码实现一个简单的语法分析器。

二、实验内容1.完成一个简单的编程语言的语法定义,并用BNF范式表示;2.基于给定的语法定义,实现自顶向下的递归下降语法分析器;3.实验所用语法应包含终结符、非终结符、产生式及预测分析表等基本要素;4.实现语法分析器的过程中,需要考虑文法的二义性和优先级等问题。

三、实验步骤1.设计一个简单的编程语言的语法,用BNF范式进行表达。

例如,可以定义表达式文法为:<exp> ::= <term> { + <term> , - <term> }<term> ::= <factor> { * <factor> , / <factor> }<factor> ::= <digit> , (<exp>) , <variable><digit> ::= 0,1,2,3,4,5,6,7,8,9<variable> ::= a,b,c,...,z2. 根据所设计的语法,构建语法分析器。

首先定义需要用到的终结符、非终结符和产生式。

例如,终结符可以是+、-、*、/、(、)等,非终结符可以是<exp>、<term>、<factor>等,产生式可以是<exp> ::= <term> + <term> , <term> - <term>等。

3.实现递归下降语法分析器。

根据语法的产生式,编写相应的递归函数进行递归下降分析。

递归函数的输入参数通常是一个输入字符串和当前输入位置,输出结果通常是一个语法树或语法分析错误信息。

4.在语法分析的过程中,需要处理语法的二义性和优先级问题。

编译原理 语法分析实验报告

编译原理 语法分析实验报告
}
h=copy[1]-'0';//因为状态从0开始
strcpy(copy1,LR[h]);
while(copy1[0]!=vn[k]) //获取当前k值
k++;
l=strlen(LR[h])-4;
top1=top1-l+1;
top2=top2-l+1;
y=a[top1-1];
p=goto1[y][k];
T->T*F|F
F->(E)|i
2设计及实现能够识别表达式的LR分析程序。
文法如下:
G[E]:E->E+T|T
T->T*F|F
F->(E)|i
③ 设计及实现能够识别表达式的算符优先分析程序。
文法如下:
G[E]:E->E+T|T
T->T*F|F
F->P↑F|P
P->(E)|i
④设计及实现计算表达式的计算器。
{
printf("%c",copy[i])
return 0;
i++;
}
printf("\n");
}
if(copy[0]=='r')
{ /*处理归约*/
i=0;
while(copy[i]!='#')//例 "S3#" 输出ACTION
{
printf("%c",copy[i])
return 0;
i++;
{ /*输出符号栈*/
printf("%c",b[n]);
n=n+1;

编译原理语法分析实验报告

编译原理语法分析实验报告

编译原理语法分析实验报告编译原理实验报告-语法分析班级:XXX学号:XXX姓名:XXX年⽉⽇1、摘要:⽤递归⼦程序法实现对pascal的⼦集程序设计语⾔的分析程序2、实验⽬的:通过完成语法分析程序,了解语法分析的过程和作⽤3、任务概述实验要求:对源程序的内码流进⾏分析,如为⽂法定义的句⼦输出”是”否则输出”否”,根据需要处理说明语句填写写相应的符号表供以后代码⽣成时使⽤4、实验依据的原理递归⼦程序法是⼀种⾃顶向下的语法分析⽅法,它要求⽂法是LL(1)⽂法。

通过对⽂法中每个⾮终结符编写⼀个递归过程,每个过程的功能是识别由该⾮终结符推出的串,当某⾮终结符的产⽣式有多个候选式时,程序能够按LL(1)形式唯⼀地确定选择某个候选式进⾏推导,最终识别输⼊串是否与⽂法匹配。

递归⼦程序法的缺点是:对⽂法要求⾼,必须满⾜LL(1)⽂法,当然在某些语⾔中个别产⽣式的推导当不满⾜LL(1)⽽满⾜LL(2)时,也可以采⽤多向前扫描⼀个符号的办法;它的另⼀个缺点是由于递归调⽤多,所以速度慢占⽤空间多,尽管这样,它还是许多⾼级语⾔,例如PASCAL,C等编译系统常常采⽤的语法分析⽅法。

为适合递归⼦程序法,对实验⼀词法分析中的⽂法改写成⽆左递归和⽆左共因⼦的BNF如下:<程序>→<程序⾸部><分程序>。

<程序⾸部>→PROGRAM标识符;<分程序>→<常量说明部分><变量说明部分><过程说明部分> <复合语句><常量说明部分>→CONST<常量定义><常量定义后缀>;|ε<常量定义>→标识符=⽆符号整数<常量定义后缀>→,<常量定义><常量定义后缀> |ε<变量说明部分>→V AR<变量定义><变量定义后缀> |ε<变量定义>→标识符<标识符后缀>:<类型>;<标识符后缀>→,标识符<标识符后缀> |ε<变量定义后缀>→<变量定义><变量定义后缀> |ε<类型>→INTEGER | LONG<过程说明部分>→<过程⾸部><分程序>;<过程说明部分后缀>|ε<过程⾸部>→PROCEDURE标识符<参数部分>;<语句>→<赋值或调⽤语句>|<条件语句>|<当型循环语句>|<读语句>|<写语句>|<复合语句>|ε<赋值或调⽤语句>→标识符<后缀><后缀>→:=<表达式>|(<表达式>)|ε<条件语句>→IF<条件>THEN<语句><当型循环语句>→WHILE<条件>DO <语句><读语句>→READ(标识符<标识符后缀>)<写语句>→WRITE(<表达式><表达式后缀>)<表达式后缀>→,<表过式><表达式后缀>|ε<复合语句>→BEGIN<语句><语句后缀>END<语句后缀>→;<语句><语句后缀>|ε<条件>→<表达式><关系运算符><表达式>|ODD<表达式><表达式>→+<项><项后缀>|-<项><项后缀>|<项><项后缀><项后缀>→<加型运算符><项><项后缀>|ε<项>→<因⼦><因⼦后缀><因⼦后缀>→<乘型运算符><因⼦><因⼦后缀>|e<因⼦>→标识符|⽆符号整数|(<表达式>)<加型运算符>→+|-<乘型运算型>→*|/<关系运算符>→=|<>|<|<=|>|>=5、程序设计思想为每个⾮终结符设计⼀个识别的⼦程序,寻找该⾮终结符也就是调⽤相应的⼦程序。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编译原理实验报告实验名称:编写语法分析程序实验类型:设计性实验指导教师:蒋*专业班级:软件工程1401姓名:****学号:**********实验地点:东六E座301实验成绩:_________________日期:2016年5月17日实验一编写词法分析程序一、实验目的:1.设计、编写、调试一个递归下降分析程序,实现对词法分析程序提供的单词序列进行语法检查和结构分析。

2.掌握递归下降语法分析方法。

3.巩固理论知识。

二、实验设计:1.设计原理:1)对于文法的每一个非终结符U的文法规则是一个识别U的过程定义,为每一个非终结符构造子程序。

2)如果U的右部符号串只有一个候选式则从左到右依次构造U的识别代码。

3)如果U的右部符号串有终结符号,则判断输入的符号是否匹配终结符号,如果相等,则读入下一个符号;如果不相等,则有语法错误,应当报错。

4)如果是非终结符号,则调用非终结符号的子程序即可。

5)如果U的右部有多个候选式,应该根据每个候选式的第一个符号来确定该分支。

6)对于含有ε表达式的文法规则需要判断输入的符号是否在U的FOLLOW集里面。

2.设计方法:(1)文法改造,消除二义性;(2)对含有左递归或者左公因子的文法消除左递归,提取左公因子;(3)求每一个右部符号串的FIRST集合,如果右部含有ε,则需要求出其产生式左部非终结符的FOLLOW集。

判断文法是否是LL(1)文法,若不是LL(1)文法,说明文法的复杂性超过自顶向下方法的分析能力。

(4)根据改写后的文法设计程序,依据设计原理构造每一个非终结符的子程序。

3.设计过程:(1)改写文法、消除左递归(将左递归改为右递归)、提取左公因子;(2)求出相应的First集和Follow集;(3)设计程序流程图,设计程序;(4)编写程序;4.框架思路,错误信息输出:对每一个非终结符构造其子程序,设定一个返回值。

如果语法分析有错则返回1,没有错误就返回0;对于错误,在程序的相应行数报错。

各个非终结符之间依据文法规则调用。

每次遇到终结符函数都判断是否匹配当前终结符号,如果不匹配则报错,返回1。

如果匹配,则读入下一个符号。

三、实验过程(一)本次实验的TEST语言语法规则:1) <program>→{<declaration_list><statement_list>}2) <declaration_list>→<declaration_list><declaration_stat> | ε3) <declaration_stat>→int ID;4) <statement_list>→<statement_list><statement>| ε5) <statement>→<if_stat>|<while_stat>|<for_stat>|<read_stat>|<write_stat>|< compound_stat > |<expression_stat>6) <if_stat>→if (<expr>) <statement >| if (<expr>) <statement >else < statement >7) <while_stat>→while (<expression>) < statement >8) <for_stat>→for (<expression>;<expression>;<expression>)<statement>9) <write_stat>→write <expression>;10) <read_stat>→read ID;11)<compound_stat>→{<statement_list>}12)<expression_stat>→< expression >;|;13)< expression >→ID=<bool_expr>|<bool_expr>14)<bool_expr>→<additive_expr> |< additive_expr >(>|<|>=|<=|==|!=)<additive_expr >15)< additive_expr>→< additive_expr>+<term>|< additive_expr>-<term>|< term >16)< term >→< term >*<factor>|< term >/<factor>|< factor >17)< factor >→(< expression >)|ID|NUM1.将左递归改为右递归:2) <declaration_list>→<declaration_list><declaration_stat> | ε改写后:<declaration_list>::=<declaration_list1><declaration_list1>:=<declaration_stat><declaration_list1>|ε4) <statement_list>→<statement_list><statement>| ε改写后:<statement_list>::=<statement_list1><statement_list1>::=<statement><statement_list1>|ε15)< additive_expr>→< additive_expr>+<term>|< additive_expr>-<term>|< term >改写后:<additive_expr>::=<term><additive_expr1><additive_expr>::=+<term><additive_expr1>|-<term><additive_expr1>|ε16)< term >→< term >*<factor>|< term >/<factor>|< factor >改写后:<term>::=<factor><term1><term1>::=*<factor><term1>|/<factor><term1>|ε2.提取公因式:14)<bool_expr>→<additive_expr> |<additive_expr>(>|<|>=|<=|==|!=)< additive_expr >改写后:<bool_expr> ::= <additive_expr><bool_expr1><bool_expr1> ::=ε|(>|<|>=|<=|==|!=)<additive_expr>3.是否可以提取公因式6) <if_stat>→if (<expr>) <statement >| if (<expr>) <statement >else < statement >不可以提取公因式,if语句和if…else语句是相互独立的,并没有必然的联系。

4.规则13超前读入符号解决方案:如果识别出标识符的符号ID后,在读入一个符号,如果这个符号时=,说明选择的是赋值表达式,如果不是=,则说明选择是布尔表达式。

(二)、求出右部符号串的FIRST集和含有ε产生式的左部非终结符的FOLLOW集1)<program>→{<declaration_list><statement_list>}FIRST({<declaration_list><statement_list>}) = { { };2) <declaration_list>::=<declaration_list1><declaration_list1>:=<declaration_stat><declaration_list1>|εFIRST(<declaration_list1>) = { int,ε};FIRST(<declaration_stat><declaration_list1>) = { int };FOLLOW(<declaration_list1>) = {if,while,for,read,write,{,},;,ID,(,NUM};3) <declaration_stat>→int ID;FIRST(int ID;) = { int };4)<statement_list>::=<statement_list1><statement_list1>::=<statement><statement_list1>|εFIRST(<statement_list1>) = {if,while,for,read,write,{,;,ID,NUM,(};FIRST(<statement><statement_list1>) = {if,while,for,read,write,{,;,ID,NUM,(};FOLLOW(<statement_list1>) = {}};5) <statement>→<if_stat>|<while_stat>|<for_stat>|<read_stat>|<write_stat>|<compound_stat > |<expression_stat>FIRST(<if_stat>) = {if};FIRST(<while_stat>)= {while}FIRST(<for_stat>) = {for}FIRST(<read_stat>) = {read};FIRST(<write_stat>) = {write}FIRST(<compound_stat>)={{}FIRST(<expression_stat>)={ID,NUM,;,(}6) <if_stat>→if (<expr>) <statement >| if (<expr>) <statement >else < statement >FIRST(if (<expr>) <statement >) = {if}FIRST(if (<expr>) <statement >else < statement >)={if}7) <while_stat>→while (<expression>) < statement >FIRST(while (<expression>) < statement >) = {while}8) <for_stat>→for (<expression>;<expression>;<expression>)<statement>FIRST(for (<expression>;<expression>;<expression>)<statement> = {for}9) <write_stat>→write <expression>;FIRST(write <expression>;) = {write}10) <read_stat>→read ID;FIRST(read ID;) = {read}11)<compound_stat>→{<statement_list>}FIRST({<statement_list>}) = {{}12)<expression_stat>→< expression >;|;FIRST(< expression >;) = {(,ID,NUM};FIRST(;) = {;};13)< expression >→ID=<bool_expr>|<bool_expr>FIRST(ID=<bool_expr>) = {ID};FIRST(<bool_expr>) = {ID,NUM,(};14)<bool_expr>→<additive_expr> |<additive_expr>(>|<|>=|<=|==|!=)< additive_expr > <bool_expr> ::= <additive_expr><bool_expr1><bool_expr1> ::=ε|(>|<|>=|<=|==|!=)<additive_expr>FIRST(<additive_expr><bool_expr1>)={(,ID,NUM}FIRST((>|<|>=|<=|==|!=)< additive_expr >)={>,<,>=,<=,==,!=}FOLLOW(<bool_expr1>)={),;}15)< additive_expr>→< additive_expr>+<term>|< additive_expr>-<term>|< term ><additive_expr>::=<term><additive_expr1><additive_expr1>::=+<term><additive_expr1>|-<term><additive_expr1>|εFIRST(< term ><additive_expr1>)={ (,ID,NUM }FIRST(+<term><additive_expr1>)={+}FIRST(-<term><additive_expr1>)={-}FOLLOW(<additive_expr1>)={>,<,>=,<=,==,!=,;,)}16)< term >→< term >*<factor>|< term >/<factor>|< factor ><term>::=<factor><term1><term1>::=*<factor><term1>|/<factor><term1>|εFIRST(<factor>) = {(,ID,NUM};FIRST(*<factor><term1>)={*};FIRST(/<factor><term1>)={/};FOLLOW(<term1>) = {+,-,;,},>,<,>=,<=,==,!=}17)< factor >→(< expression >)|ID|NUMFIRST((<expression>))= {(}:FIRST(ID) ={ID};FIRST(NUM) = {NUM};(三)、<statement>程序流程图(四)、<expression>程序流程图四、试验调试记录:1、问题表现:当语法分析到最后一行时进入死循环。

相关文档
最新文档