编译原理(语法分析程序设计)

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

一、实验内容和目的

1. 已知待分析的C语言子集的语法,用EBNF表示如下:

(1)<程序>→main()<语句块>

(2)<语句块>→“{” <语句串>“}”

(3)<语句串>→<语句>{;<语句>} ;

(4)<语句>→<赋值语句>|<条件语句>|<循环语句>

(5)<赋值语句>→ID=<表达式>

(6)<条件语句>→if(条件)<语句块>

(7)<循环语句>→while(<条件>)<语句块>

(8)<条件>→<表达式><关系运算符><表达式>

(9)<表达式>→<项>{+<项>}|<项>{-<项>}

(10)<项>→<因子>{*<因子>}|<因子>{/<因子>}

(11)<因子>→ID|NUM|(<表达式>)

(12)<关系运算符>→<|<=|>|>=|==|!=

2. 实验目的、要求实现的功能

实验目的:编制一个语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析。

实验要求:在上机(一)词法分析的基础上,采用递归子程序法或其他适合的语法分析方法,实现其语法分析程序。要求编译后能检查出语法错误。

3. 将实验方法改写为适合预测分析法的文法如下:

(1) <程序>→main()<语句块>

(2)<语句块>→{ <语句串>}

(3)<语句串>→<语句>; <语句串>

(3_1) <语句串>→ε

(4)<语句>→<赋值语句>

(5)<语句>→<条件语句>

(6) <语句>→<循环语句>

(7)<赋值语句>→ID=<表达式>

(8)<条件语句>→if(<条件>)<语句块>

(9)<循环语句>→while(<条件>)<语句块>

(10)<条件>→<表达式><关系运算符><表达式>

(11)<表达式>→<项><表达式`>

(11_1)<表达式`>→+<项><表达式`>

(11_2)<表达式`>→-<项><表达式`>

(11_3)<表达式`>→ε

(12) <项>→<因子><项`>

(12_1) <项`>→*<因子><项`>

(12_2)<项`>→/<因子><项`>

(12_3)<项`>→ε

(13) <因子>→ID

(14) <因子>→NUM

(15) <因子>→(<表达式>)

(16) <关系运算符>→<

(17) <关系运算符>→<=

(18) <关系运算符>→>

(19) <关系运算符>→>=

(20) <关系运算符>→==

(21) <关系运算符>→!=

表格内空白的部分表示“出错”,非空白部分表示要压入分析栈中的文法符号,是按照对应产生式的逆序存放的,即当查找分析表时,表格内的内容从左至右依次入栈。

第3步中改写文法的LL(1)分析表

二、所用仪器、材料(设备名称、型号、规格等)

操作系统:Microsoft Windows 7

开发平台:Microsoft Visual Studio 2010

三、实验方法、步骤

登录Microsoft Windows 7操作系统

→打开Visual Studio 2010开发平台

→新建“项目”

→“Win32控制台应用程序”

→输入项目名称

→“应用程序设置”

→勾选“空项目”复选框

→右击左侧“解决方案资源管理器”下的“源文件”

→“添加”

→“新建项…”

→新建一个“C++文件(.cpp)”

→在新建的.cpp文件中输入语法分析代码

→调试

→运行

→记录结果

→完成实验报告。

四、实验过程原始记录(数据、图表、计算等)

源代码见实验报告所在目录下的yangdongdong_2.cpp,以下是部分程序代码的截图:

五、实验结果

测试一:输入文本1(input1.cpp):

调用语法分析程序后的运行情况:

输出output1.txt文件:

output1.txt文件中的内容如下:

①②

③④

注:语法分析程序本身只要求输出分析结果,此处暂时将每一步推导所用的产生式输出,方便对照检查,LINE[N]表示第N行,以下测试类似,不再说明。

测试二:输入文本2(input2.cpp):

调用语法分析程序后的运行情况:

输出output2.txt文件

Output2.txt文件中的内容如下:

①②

③④

六、分析和结论

1. 本程序先用预先分析法进行语法分析,基本思路是:(1)首先初始化分析栈和输入单词指示器(即读取当前输入串中的第一个单词);(2)然后查看当前分析栈的栈顶符号:①如果是终结符号,则查看是否与当前输入单词匹配,若匹配则将之出栈,输入指示器指向下一个单词,进行下一轮扫描,若不匹配则报错,②如果是非终结符号,则根据当前输入单词查找分析表,若查到,则将当前栈顶符号出栈,并将查到的产生式逆序入栈,进入下一轮扫描,若没有查到,则报错;(3)最后,若分析栈和输入单词同时为结束符(#)时,表示语法分析成功,程序结束。

2. 本程序对语法分析中的错误处理和识别有很多问题,如某些错误可能导致程序进入死循环,因此在语法错误处理方面仍有待改进

3. 程序中对文件的操作仍一些不足之处,如:若关闭输入文件时失败,则会导致输出文件也无法关闭,占用系统资源。另外,此程序只是对语法分析过程的一个演示,当真正进编译程序的编制时,需要配合专门的语法错误处理程序和中间代码转换程序等进行编译。

相关文档
最新文档