编译原理-实现LR语法分析器——沐雨先生

实验任务:

实现LR语法分析器

实验要求:

根据编译原理理论课教材中例3.22给出的算术表达式文法以及该文法的LR分析表,用C语言编写接受算术表达式为输入的语法分析器,以控制台(或文本文件,也可以结合词法分析器完成)为输入,控制台(或文件)输出产生式序列形式的分析结果。

实验内容:

教材中例3.22给出的算术表达式文法只有+、运算,对应的LR分析表也比较单一,为了编写接受算术表达式为输入的语法分析器,我将文法完善为下列文法,然后先在纸上写出LR(0)项目集规范族来构造LR分析表,再将其写入程序作为该文法的LR分析表。然后再依据使用分析表对输入符号串做分析的过程编写程序,使得用LR分析法对任意输入的符号串进行分析。
(1)E-> E+T
(2)E- >E-T
(3)E- >T
(3)T- >T
F
(4)T- >T/F
(5)T- >F
(6)F- >(E)
(7)F- >i

主要代码:

运行示例:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验小结:

1.在看教材中的例3.22时,对于一个算术表达式而言绝不止+、*符号,故例3.22的文法具有一定的局限性,所以我们可以将文法进行拓展,即终结符有±*/,涵盖算术表示式应有的所有运算符,在此基础上我们还需要构造LR(0)项目集规范族,以构造出LR分析表,在确定正确的情况下将其输入程序中以作分析。

2.与上一个实验构造LL(1)语法分析器作对比,有很多的不同之处,LL(1)文法与LR(0)或LR(1)文法的分析技术就是不同的,所以本实验在汲取上个实验部分相同点的基础上需要改变分析思路,这样才能构造出正确的分析过程。

源程序

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<stack>
using namespace std;
 ///					   0		1		2		3		4		5		6		7		8		9		10
///表格数组                +       -        *       /       i      (      )       # 	    E	    T		 F
char 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沐雨先生

如果真的帮助到你了再打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值