方法描述
自作向右逐个扫描输入串,一边把输入符号
移进
分析栈
,一边检查位于栈顶的一串符号是
否与某个产生式的右部相同,如果相同,就把
栈顶的这串符号
归约
为左部的非终结符;如果
不同,则继续移入输入符号,进行判断。上述
过程一直重复到
输入串结束
,栈内
恰好为
S
。
LR(K)
L
:
自左向右扫描输入串
R
:
最右推导的逆过程
(
规范归约,最左规约
)
K
:
向右查看
输入串符号的个数
(K
省略时
,
表
示
K
等于
1
,
当
K=1
时,能满足当前绝大多数
高级语言编译程序的需要
)
LR
分析过程是规范归约过程。
LR
分析法的特点
LR
分析器(程序)基本上
可以识别所有
上下
文无关文法写的编程设计语言的结构,分析能
力强且适用范围广
LR
分析法是当前
最一般
“
移进
-
归约
”分析方
法
LR
分析法在
自左向右
扫描输入串时能収现其
中错误,并能
指出出错地点
LR
分析程序可以自动生成
LR
分析方法的基本思想
LR
分析器的每一步工作都是由
栈顶状态
和
现
行输入符号
所唯一决定的。
一个
LR
分析器实质上是一个
DFA
![](https://i-blog.csdnimg.cn/blog_migrate/03929dc824da183b2b59ac97f8aac0ab.png)
例题来进行举例如何使用:
G:
(1) E →
E+T
(2) E → T
(3) T → T*F
(4) T → F
(5) F → (E)
(6) F → i
分析表
我们需要根据这个分析表进行判断如何进行LR(0)分析现在讲一下这个表里面内容是什么意思
(1) 移进 –
s
j
(2) 归约 –
r
j
(3) 接受 –
acc
(4) 报错 –
空白 / ‘出错’ / ‘error’
(1)
移进
–
Action[s
n
, a
i
] =
s
j
把现行输入符号
a
i
和下一状态
j
分别移进状态栈和符号栈
(2)
归约
-
Action[s
n
, a
i
] =
r
j
用第
j
条产生式
A→
β
归约
.
|β| =r 需要对产生式进行编号
(3)
接受
–
Action[s
n
, a
i
] = acc,
宣布分析成功
(4)
报错
–
Action[s
n
, a
i
] =
空白,出错标识,报错
对
i*i+i#
进行移进-
归约分析
![](https://i-blog.csdnimg.cn/blog_migrate/db3a3e1972963fd896ef06419ee715b5.png)