北邮大三上编译原理语法分析实验报告.docx
《北邮大三上编译原理语法分析实验报告.docx》由会员分享,可在线阅读,更多相关《北邮大三上编译原理语法分析实验报告.docx(13页珍藏版)》请在冰豆网上搜索。
北邮大三上编译原理语法分析实验报告
编译原理
第四章语法分析
班级:
09211311
学号:
姓名:
schnee
1.消除左递归……………………………………………………………………………………………………………………….2
2.画状态转移图………………………………………………………………………………………………………………3
3.编程实现递归调用自顶向下分析……………………………………………………………………….3
1.构造识别所有活前缀的DFA…………………………………………………………………………………………………………….6
2.构造LR分析表…………………………………………………………………………………………………………………….7
3.编程实现算法4.3,实现自底向上LR分析…………………………………………………………………………………..8
4.运行结果截图………………………………………………………………………………………………………………………….11
1.实验题目和要求
题目:
语法分析程序的设计与实现。
实验内容:
编写语法分析程序,实现对算术表达式的语法分析。
要求所分析算术表达式由如下的文法产生。
实验要求:
在对输入表达式进行分析的过程中,输出所采用的产生式。
方法1:
编写递归调用程序实现自顶向下的分析。
方法2:
编写LL
(1)语法分析程序,要求如下。
(1)编程实现算法4.2,为给定文法自动构造预测分析表。
(2)编程实现算法4.1,构造LL
(1)预测分析程序。
方法3:
编写语法分析程序实现自底向上的分析,要求如下。
(1)构造识别所有活前缀的DFA。
(2)构造LR分析表。
(3)编程实现算法4.3,构造LR分析程序。
方法4:
利用YACC自动生成语法分析程序,调用LEX自动生成的词法分析程序。
2.递归调用预测分析实现自顶向下分析(方法1)
(1)消除文法左递归。
文法改写为:
(2)画出状态图得
化简得
(3)预测分析程序的实现
1说明
定义函数error()为错误处理子程序。
定义函数forward_pointer()为指向输入串的指针前进一位的相关子程序。
定义字符cur_token为当前记号,即语法分析时的终结符。
对应三个非终结符,各定义一个子程序。
主函数从开始符出发。
②源程序
3.LR实现自底向上分析(方法三)
(1)构造识别所有活前缀的DFA。
构造扩展文法
FIRST和FOLLOW集如下
E
T
F
FIRST
id,(,num
id,(,num
id,(,num
FOLLOW
$,),+,-
$,),+,-,*,/
$,),+,-,*,/
构造识别所有活前缀的DFA如下
(2)构造LR分析表。
(1)
(4)
(7)
(2)
(5)
(8)
(3)
(6)
(9)
状态
action
goto
+
-
*
/
id
num
(
)
$
E
T
F
0
s4
S6
S5
1
2
3
1
s7
s8
acc
2
r3
r3
s9
s10
r3
r3
3
r6
r6
r6
r6
r6
r6
4
r7
r7
r7
r7
r7
r7
5
s4
s6
s5
11
2
3
6
r9
r9
r9
r9
r9
r9
7
s4
s6
s5
12
3
8
s4
s6
s5
13
3
9
s4
s6
s5
14
10
s4
s6
s5
15
11
s7
s8
s16
16
12
r1
r1
s9
s10
r1
r1
13
r2
r2
s9
s10
r2
r2
14
r4
r4
r4
r4
r4
r4
15
r5
r5
r5
r5
r5
r5
16
r8
r8
r8
r8
r8
r8
(3)编程实现算法4.3,构造LR分析程序。
(4)运行结果截图:
1输入符号串为id+id,即记号流为404时的运行结果
2输入符号串为(id+id)*num/(id-num),即记号流为token={6,4,0,4,7,2,5,3,6,4,1,5,7};时的运行结果
3错误处理示例,输入符号串为id+),即记号流为407时的运行结果