编译原理语法分析程序设计.docx
《编译原理语法分析程序设计.docx》由会员分享,可在线阅读,更多相关《编译原理语法分析程序设计.docx(15页珍藏版)》请在冰点文库上搜索。
![编译原理语法分析程序设计.docx](https://file1.bingdoc.com/fileroot1/2023-5/11/6d1da2fb-2608-4769-b0ec-b0dd46cb5314/6d1da2fb-2608-4769-b0ec-b0dd46cb53141.gif)
编译原理语法分析程序设计
一、实验内容和目的
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)<关系运算符>→!
=
4.求改写后文法的非终结符号的FIRST集和FOLLOW集:
非终结符号
FIRST
FOLLOW
<程序>
main
#
<语句块>
{
#;
<语句串>
IDifwhileε
}
<语句>
IDifwhile
;
<赋值语句>
ID
;
<条件语句>
if
;
<循环语句>
while
;
<条件>
IDNUM(
)
<表达式>
IDNUM(
<<=>>===!
=);
<表达式`>
+-ε
<<=>>===!
=);
<项>
IDNUM(
+-<<=>>===!
=);
<项`>
*/ε
+-<<=>>===!
=);
<因子>
IDNUM(
*/
<关系运算符>
<<=>>===!
=
IDNUM(
5.根据求得的FIRST集和FOLLOW集构造LL
(1)分析表如下:
表格内空白的部分表示“出错”,非空白部分表示要压入分析栈中的文法符号,是按照对应产生式的逆序存放的,即当查找分析表时,表格内的内容从左至右依次入栈。
第3步中改写文法的LL
(1)分析表
main
if
while
ID
NUM
(
)
{
}
+
-
*
/
<
<=
>
>=
==
!
=
=
;
#
<程序>
<语句块>
)(main
<语句块>
}
<语句串>
{
<语句串>
<语句串>;<语句>
ε
<语句>
<条件语句>
<循环语句>
<赋值语句>
<赋值语句>
<表达式>
=ID
<条件语句>
<语句块>)
<条件>(if
<循环语句>
<语句块>)<条件>(while
<条件>
<表达式><关系运算符><表达式>
<表达式>
<表达式`><项>
<表达式`>
ε
<表达式`>
<项>+
<表达式`>
<项>-
ε
ε
ε
ε
ε
ε
ε
<项>
<项`><因子>
<项`>
ε
ε
ε
<项`>
<因子>*
<项`>
<因子>/
ε
ε
ε
ε
ε
ε
ε
<因子>
ID
NUM
)<表达式>(
<关系运算符>
<
<=
>
>=
==
!
=
二、所用仪器、材料(设备名称、型号、规格等)
操作系统:
MicrosoftWindows7
开发平台:
MicrosoftVisualStudio2010
三、实验方法、步骤
登录MicrosoftWindows7操作系统
→打开VisualStudio2010开发平台
→新建“项目”
→“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.程序中对文件的操作仍一些不足之处,如:
若关闭输入文件时失败,则会导致输出文件也无法关闭,占用系统资源。
另外,此程序只是对语法分析过程的一个演示,当真正进编译程序的编制时,需要配合专门的语法错误处理程序和中间代码转换程序等进行编译。