为什么需要LR(1)分析?
什么是LR(1)分析?
LR(1)分析表的构造
① 写出文法G[S]的拓广文法G'[S]。
拓广文法G'[S]为:
S' ---> S
S ---> L=R
S ---> R
L ---> *R
L ---> i
R ---> L
② 构造LR(1)项目集规范族。
如果拓广文法G'[S]中,有产生式直接能推导到ε,则该产生式在项目集中直接推导 点。
例如:G'[S]中 A ---> ε ,则 Ⅰ0中对应 A ---> .
只有当两个项目的产生式全部相同,与之对应的向前搜索符也相同时,这两个项目才是同一个项目。
产生式相同的两个项目,只要它们的向前搜索符不同,就是完全不同的两个项目!
③ 如何添加向前搜索符?
1. 对于拓广文法的最开始产生式 S' ---> S,加上向前搜索符 “#”。得到 S' ---> S,#
2. 对于其他产生式,先看左,再看右。
即:先看产生式的左部,假定为S。再看哪些产生式右部中,点的右侧刚好就是S。
如果存在产生式 A ---> α.Sβ,a (β不为空),则 FIRST(β)为 S 的 向前搜索符。
如果存在产生式 A ---> α.Sβ,a (β为空),即 A ---> α.S,a 则 a 为 S 的 向前搜索符。
3. 对于新项目,除了通过识别得到的新产生式的向前搜索符照抄以外,其余的都要按照规则重新计算。
对于第一个产生式,直接加#号,S' ---> .S,# 。
接着,对于产生式 S ---> .L=R , 产生式左部为S,我们找产生式右部为 .Sβ的。
发现有S' ---> .S,# ,符合 存在产生式 A ---> α.Sβ,a (β为空),即 A ---> α.S,a 则 a 为 S 的 向前搜索符。 因此,我们直接把 产生式S' ---> .S的向前搜索符 # 加入到 S的向前搜索符中。
同样的,对于L,我们找到 R--->.L 和 S--->.L=R两个式子,因此 L的向前搜索符 等于 R的向前搜索符 + “=” , 即 { #,= } ,写作 #/= 。
对于R,找到 S ---> .R,# 所以R的向前搜索符就是 S的向前搜索符, 即 # 。
项目集Ⅰ0构造完毕。
同理,推导其余的项目集。
④ 根据LR(1)项目集规范族,构建LR(1)分析表。
其他都一样,只有在规约的时候,和其他分析方法不同。
只有对应产生式的向前搜索符中存在该非终结符,该列才能被规约。
LALR(1)分析法
LR分析的错误处理
本章小结