目录
1、拓广文法,加入一个用于产生开始符号的产生式,并从0开始编号
建议
可以使用PixPin截图软件将多个截图固定在屏幕上方,方便后面边看边理解
一、 什么是LR(0)文法
1、概念
若一个文法 G 的拓广文法 G’ 的识别活前缀的自动机中的每个状态(项目集)均不存在下述情况:
- 既有移进项目又有规约项目(移进-规约冲突);
- 含有多个规约项目(规约-规约冲突),
则称 G 为一个 LR(0) 文法
2、解释
项目分类如下:
①基本项目:圆点在最左边 例:E→ •S
②移进项目:圆点后边是终结符 例:E→•aS
③待约项目:圆点后边是非终结符 例:E→a•S
④规约项目:圆点在最右边 例:E→aS•
二、实现步骤
例:已知文法
G[E]: E→aA
A→cA
A→d
1、拓广文法,加入一个用于产生开始符号的产生式,并从0开始编号
0 S→E 产生E的符号随意(除E以外)
1 E→aA
2 A→cA
3 A→d
2、构造识别活前缀的DFA
(1)第一个项目集(或状态)
①项目集解释
从第0个产生式出发构造基本项,若圆点右侧有非终结符,则写出该非终结符的基本项
(2)完整活前缀的DFA如下
解释
每接受一个符号,产生一个新的状态(保留的为可接受该符号的项目),且圆点向前进一位。
同样,若圆点后为非终结符,需写出该非终结符的基本项。
直到出现规约状态(圆点在最右侧)
检查DFA是否正确,可通过判断规约项的个数是否等于拓广后产生式的个数
例如
I2中A→•cA接受c进入到I4状态,圆点向前一位:A→c•A
圆点后为非终结符A,写出A的基本项,即A→•cA A→•d
之后写出I4接受符号后产生的状态,直到出现规约项(即I5、I6)
其中I4接受c还是它本身,不用再写新状态,指向它本身即可
3、构造LR(0)分析表
由上图DFA可得,同一个项目集不存在移进与规约,规约与guiyue
(1)说明
①状态中写DFA的几个状态
②ACTION中写终结符,包括#
③ACTION中Sn ,代表接受符号后转向哪个状态,n代表第n个状态
④ACTION中Rn,代表规约成第n个产生式,且Rn占整个ACTION
⑤ACTION中产生开始符号的规约项,在#处写acc
⑥GOTO中写非终结符,不包括新加进去的那个,即S
⑦GOTO中转向哪个状态直接写状态号即可
(2)LR(0)分析表如下
4、对于输入串acd#的分析过程
说明:转向,则余留输入串分析出一个,余留输入串栈-1,而符号栈+1
规约,则余留输入串不变,符号栈进行规约
步骤 | 状态栈 | 符号栈 | 余留输入串栈 | ACTION | GOTO |
1 | 0 | # | acd# | 2 | |
2 | 02 | #a | cd# | 4 | |
3 | 024 | #ac | d# | 6 | |
4 | 0246 | #acd | # | 3 | 5 |
5 | 0245 | #acA | # | 2 | 3 |
6 | 023 | #aA | # | 1 | 1 |
7 | 01 | #E | # | acc |
解释
步骤1
状态栈:0
符号栈:#
余留输入串栈:acd#
ACTION:0接受a,转向2状态
分析出c
步骤2
状态栈:0转向2,为02
符号栈:上步分析出a,即符号栈为:#a
余留输入串栈:a被分析,出栈,剩余cd#
ACTION:2接受c,转向4状态
分析出c
步骤3
状态栈:2转向4,为024
符号栈: 上步分析出c,即符号栈为#ac
余留输入串栈:c被分析,出栈,剩余#d
ACTION:4接受d,转向6
分析出d
步骤4
状态栈:4转向6,为0246
符号栈:上步分析出d,即符号栈为#acd
余留输入串栈:d被分析,出栈,剩余#
ACTION:6接受#,规约为产生式3
GOTO:
3产生式如下: A→d
d规约成A
len(3产生式)=|d|=1
出栈1个状态,即状态栈此时为024
GOTO[状态,规约成的非终结符
=GOTO[4,A]=5 4状态接受A为5状态
步骤5
状态栈:上步出栈一个状态,进入状态5,即0245
符号栈:d规约成A,即符号栈为#acA
余留输入串栈:不变,#
ACTION:5接受#规约为2产生式
GOTO:
2产生式如下:A→cA
cA规约成A
len(2产生式)=|cA|=2
出栈2个状态,及状态此时为02
GOTO[状态,规约成的非终结符]
=GOTO[2,A]=3
步骤6
状态栈:上步出栈2个状态,进入状态3,即023
符号栈:cA规约成A,即符号栈为#aA
余留输入串栈:不变,#
ACTION:3接受#规约成为1
GOTO:
1产生式如下:E→aA
aA规约成E
len(1产生式)=|aA|=2
出栈2个状态,及状态此时为0
GOTO[状态,规约成的非终结符]
=GOTO[0,E]=1
步骤7
状态栈:上步出栈2个状态,进入1状态,即01
符号栈:aA规约成E,即#E
余留输入串栈:不变,#
ACTION:1接受#,acc
至此,acc已出现,结束
三、练习
接下来,可以先自己练习一下,之后对答案
已知文法如下:
S→aAcBe
A→b
B→d
1、拓广文法并编号
0 E→S
1 S→aAcBe
2 A→b
3 B→d
2、构造活前缀的DFA
3、构造LR(0)分析表
状态 | ACTION | GOTO | |||||||
a | b | c | d | e | # | S | A | B | |
0 | S2 | 1 | |||||||
1 | acc | ||||||||
2 | S4 | 3 | |||||||
3 | S6 | ||||||||
4 | r2 | r2 | r2 | r2 | r2 | r2 | |||
5 | r3 | r3 | r3 | r3 | r3 | r3 | |||
6 | S5 | 7 | |||||||
7 | S8 | ||||||||
8 | r1 | r1 | r1 | r1 | r1 | r1 |
4、对于输入串abcde的分析过程
步骤 | 状态栈 | 符号栈 | 余留输入串栈 | ACTION | GOTO |
0 | 0 | # | abcde# | 2 | |
1 | 02 | #a | bcde# | 4 | |
2 | 024 | #ab | cde# | 2 | 3 |
3 | 023 | #aA | cde# | 6 | |
4 | 0236 | #aAc | de# | 5 | |
5 | 02365 | #aAcd | e# | 3 | 7 |
6 | 02367 | #aAcB | e# | 8 | |
7 | 023678 | #aAcBe | # | 1 | 1 |
8 | 01 | #S | # | acc |
至此,分析成功
另外:内容较多,若有纰漏,请提醒,感谢