递归下降语法分析程序设计

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

编译方法实验报告实验名称:简单的语法分析程序设计

实验要求

1.功能:对简单的赋值语句进行语法分析

随机输入赋值语句,输出所输入的赋值语句与相应的四元式

2.采用递归下降分析程序完成(自上而下的分析)

3.确定各个子程序的功能并画出流程图

4.文法如下:

5.编码、调试通过

采用标准输入输出方式。输入输出的样例如下:

【样例输入】

x:=a+b*c/d-(e+f)

【样例输出】(说明,语句和四元式之间用5个空格隔开)

T1:=b*c (*,b,c,T1)

T2:=T1/d (/,T1,d,T2)

T3:=a+T2 (+,a,T2,T3)

T4:=e+f (+,e,f,T4)

T5:=T3-T4 (-,T3,T4,T5)

x:=T5 (:=,T5,-,x)

【样例说明】程序除能够正确输出四元式外,当输入的表达式错误时,还应能检测出语法错误,给出相应错误提示。

6.设计3-5个赋值语句测试实例,检验程序能否输出正确的四元式;当输入错误

的句子时,检验程序能够给出语法错误的相应提示信息。

7.报告内容包括:

递归程序的调用过程,各子程序的流程图和总控流程图,详细设计,3-5个测试用例的程序运行截图及相关说明,有详细注释的程序代码清单等。

目录

1.语法分析递归下降分析算法............................... 错误!未定义书签。

背景知识............................................. 错误!未定义书签。

消除左递归........................................... 错误!未定义书签。

2.详细设计及流程图....................................... 错误!未定义书签。

函数void V( ) .|z ................................. 错误!未定义书签。

函数void A( ) 错误!未指定书签。错误!未指定书签。错误!未指定书签。错误!未指定书签。错误!未指定书签。试用例及截图........................ 错误!未定义书签。

测试用例1及截图..................................... 错误!未定义书签。

测试用例2及截图..................................... 错误!未定义书签。

测试用例3及截图..................................... 错误!未定义书签。

代码清单................................................. 错误!未定义书签。

1.语法分析递归下降分析算法

背景知识

无回溯的自上向下分析技术可用的先决条件是:无左递归和无回溯。

无左递归:既没有直接左递归,也没有间接左递归。

无回溯:对于任一非终结符号U的产生式右部x1|x2|…|xn,其对应的字的首终结符号两两不相交。

如果一个文法不含回路,也不含以ε为右部的产生式,那么可以通过执行消除文法左递归的算法消除文法的一切左递归(改写后的文法可能含有以ε为右部的产生式)。

文法的左递归消除算法:

1、将文法G的所有非终结符排序为U1 ,U2 ,… ,Un;

2、For(i=1;i++;i≥n)

{

for j→1 to i-1

把产生式Ui→Ujα替换成Ui→β1α| β2α|…|βmα;

其中:Uj→ β1| β2 |… |βm 消除Ui产生式中的直接左递归;

}

3.化简改写之后的文法,删除多余产生式。

文法的直接左递归消除公式:

直接左递归形式:

U→Ux|y;

其中:x,y∈(V∪V)* ,y不以U打头。

直接左递归的消除:

U→yU‟

U‟→xU‟|ε

直接左递归的一般形式:

U→Ux|Ux|…|Ux|y|y|…|y;

其中:x≠ε ,y都不以U打头。

一般形式直接左递归的消除:

U→yU‟| yU‟ |…| yU‟

U‟→xU‟| xU‟| …| xU‟|ε

回溯的消除的前提是文法不得含有左递归,可提左因子来消除回溯。

消除左递归

根据实验中给出的文法,进行消除左递归及回溯,得到下列的式子

A -> V:=E

E -> TE'

E'-> +TE'|-TE'|null

T -> FT'

T'-> *FT'|/FT'|null

F -> V|(E)

V -> a|b|c|d|e...|z

2.详细设计及流程图

根据消除左递归后的文法,可以编写相应的函数。

函数void V( ) .|z

v oid V() .|z函数设计主要用来识别小写字母的,如果是小写字母的话,放入字符表,不是的话,输出语法错误。函数比较简单,代码如下:

i f(islower(s[sym]))

{

Table[list_n][0] = s[sym];

开始

V( )

s[sym]==':'&&s[sym+1]=='='

sym+=2;

E( );

Y

输出表达式

N

输出错误结束

相关文档
最新文档