I2:S->L·=R R→>L 考虑分析表达式id=id时,在工作到I2处已经 把第一个id归约到L了,看到下一个输入= 要作决策,第一个项目要设置Acon[2=]为 S6,即把赋值的其它部分找到.但=也是属于 Follow(R)的第二个项目要用R>L归约出 现 shift-reduce冲突 若将栈顶的符号序列归约到R会有问题!因 为不可能有规范句型以R=…开头(有以*R =…开头的规范句型)
I2: S –> L• = R R –> L• 考虑分析表达式 id = id时,在工作到 I2 处已经 把第一个 id 归约到 L了, 看到下一个输入 = 要作决策,第一个项目要设置Action[2,=] 为 S6, 即把赋值的其它部分找到. 但 =也是属于 Follow(R) 的. 第二个项目要用 R–>L归约.出 现 shift-reduce 冲突. 若将栈顶的符号序列归约到 R,会有问题!因 为不可能有规范句型以R = …开头 (有以 *R = ... 开头的规范句型)
SLR(1)的局限 follow集包含了在任何句型中跟在R后的符号但没 有严格地指出在一个特定的推导里哪些符号跟在 R后所以需要扩充状态以包含更多的信息: follow 集的哪些部分才是进到该状态最恰当的归约依据. 处在状态2时,试图构建句子有两条路: 1S→L=R或 2.S→R→L 如下一符号是三,那就不能用第二个选择,必须用 第一个即移进只有下一个符号是#时才能归约尽 管=属于Fo|oW(R),那是因为一个R可以出现 在别的上下文中,在现在这个特定的情况,它不 合适,因为在用S→R→L推导句子时,=不能跟 在R后
SLR(1)的局限 follow 集包含了在任何句型中跟在 R 后的符号但没 有严格地指出在一个特定的推导里哪些符号跟在 R后.所以需要扩充状态以包含更多的信息:follow 集的哪些部分 才是进到该状态最恰当的归约依据. 处在状态 2时,试图构建句子有两条路: 1.S L = R 或 2.S R L. 如下一符号是 =, 那就不能用第二个选择,必须用 第一个,即移进. 只有下一个符号是#时才能归约. 尽 管 = 属于 Follow(R) ,那是因为一个 R 可以出现 在别的上下文中,在现在这个特定的情况,它不 合适,因为在用S R L推导句子时, = 不能跟 在R后
讨论例2后有以下结果: 不是LR(0)文法 S→L.=RR→L.中存在移进/ 归约冲突 ☆SLR能否解决I中的冲突 FOLLOW(R)={#,}与{交不为空不 是SLR(1)文法 如早有信息告知:若用R→L归约则 形成R=而R=不是活前缀
. 讨论例2后有以下结果: ❖ 不是LR(0)文法 ∵ I2 S→L.=R R→L.中存在移进/ 归约冲突 ❖ SLR能否解决I2中的冲突 ∴FOLLOW(R)={#,=}与{=}交不为空 不 是SLR(1)文法 ❖ 如早有信息告知: 若用 R→L 归约 则 形成R=… 而 R=不是活前缀
SLR(1)的局限 在sLR分析中若项目集I含有项目A→β ,那么在相应的状态下只要当前输入符号a∈ fOllow(A)集就确 定采用A→进行归约但在某些情况下当状态k呈现于栈顶 时栈内的串?所构成的活前缀未必允许把β归约为A因为 可能没有一个规范句型含有前缀Aa即在这种情况下,用A →阝归约未必有效 所以需要扩充状态以包含更多的信息: follow集的哪些部分 才是进到该状态最恰当的归约依据 重新定义项目 LR(1)方法 若A→>aBβ∈I 则B (B→y是一产生式) 把 FIRST(B)中的符号作为用B→γ归约的搜索符,向前搜索符
SLR(1)的局限 在SLR 分析中,若项目集Ik含有项目 A →. ,那么在相应的状态下,只要当前输入符号afollow(A) 集,就确 定采用A →进行归约.但在某些情况下,当状态k呈现于栈顶 时,栈内的串所构成的活前缀未必允许把归约为A,.因为 可能没有一个规范句型含有前缀Aa.即在这种情况下,用A →归约未必有效. .所以需要扩充状态以包含更多的信息:follow 集的哪些部分 才是进到该状态最恰当的归约依据. 重新定义项目. LR(1)方法 若 A → .B I 则 B → . I ( B → 是一产生式) 把FIRST( )中的符号作为用B → 归约的搜索符,向前搜索符
LR(1)项目(配置)的一般形式 IA→>0.β,a a称作该项目(配置)的向前搜索符( lookahead) 向前搜索符( lookahead)只对圆点在最后的项月起 作用 A->αβ 意味着处在栈中是aβ的相应状态,但只有当下一个 输入符是a时才能进行归约.a是一个终结符,或是 输入结束标记# 有多个向前搜索符,比如ab,c时,可写作A→>u, a/b/c
LR(1)项目( 配置)的一般形式 – [ A → . , a ] a 称作该项目( 配置) 的向前搜索符( lookahead ) 向前搜索符( lookahead )只对圆点在最后的项目起 作用 A –> •, a .意味着处在栈中是 的相应状态,但只有当下一个 输入符是a时才能进行归约. a 是一个终结符,或是 输入结束标记# 有多个向前搜索符,比如a,b,c时,可写作 A –> u•, a/b/c