【C++】手动编写语法分析器(LR分析表)

已知文法G[E]:

E → E + T | T
T → (E) | id | id[E]

设计LR分析表,使用用C++编写语法分析器。

需要构造LR分析表,因此首先写出DFA:
根据DFA,可以看出如果使用LR(0),会产生冲突,使用SLR(1).
构造SLR(1)分析表:

  • 增广文法

0:S → E
1:E → E + T
2:E → T
3:T → (E)
4:T → id
5:T → id[E]

  • DFA
    在这里插入图片描述图画得好丑,将就看一下
    由图所知,使用LR(0)将会有冲突,求出冲突的FOLLOW集,没有交集,所以可以使用SLR(0)。

  • SLR(1)分析表

0:表示error,使用16代表acc

状态 id + ( ) [ ] # T E
0 S4 0 S3 0 0 0 0 2 1
1 0 S5 0 0 0 0 acc 0 0
2 0 R2 0 R2 0 R2 R2 0 0
3 S4 0 S3 0 0 0 0 2 6
4 0 R4 0 R4 S7 R4 R4 0 0
5 S4 0 S3 0 0 0 0 8 0
6 0 S5 0 S9 0 0 0 0 0
7 S4 0 S3 0 0 0 0 2 10
8 0 R1 0 R1 0 R1 R1 0 0
9 S8 R3 0 R3 0 R3 R3 0 0
10 0 S5 0 0 0 S11 0 0 0
11 0 R5 0 R5 0 R5 R5 0 0
  • 源代码
#include<iostream>
#include<cstring>
#include<stack>
#include<regex>
using namespace std;
string terminal="@+()[]#";
string nonterminal="TE";
int action[12][7]={
   	//负数表示规约,正数表示移入,0表示error,16代表acc
		4,0,3,0,0,0,0,
		0,5,0,0,0,0,16,
		0,-2,0,-2,0,-2,-2,
		4,0,3,0,0,0,0,
		0,-4,0,-4,7,-4,-4,
		4,0,3,
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值