大佬教程收集整理的这篇文章主要介绍了解析 – 如何解决三元表达式(a?b:c)和“可能”表达式(a?)之间的LR(1)语法歧义?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
(0) exp1: ternary; (1) exp1: exp2; (2) ternary: exp2 "?" exp1 ":" exp1; (3) exp2: exp2 "+" exp3; (4) exp2: exp3; (5) exp3: maybe; (6) exp3: "1"; (7) maybe: exp3 "?";
我相信这种语言是明确的,应该是LR可解析的. (如果我错了,请告诉我!)
但是,当我尝试为这个语法生成一个LR(1)解析器时,我得到了shift / reduce冲突,因为当解析器看到带有lookahead的exp3时,它不知道是要移位还是减少:
Conflicts in state 3: Reduction using rule 4: exp2: exp3 · | "?" Shift to state 6 Conflicts in state 9: Reduction using rule 3: exp2: exp2 "+" exp3 · | "?" Shift to state 6 Conflicts in state 13: Reduction using rule 4: exp2: exp3 · | "?" Shift to state 16 Conflicts in state 20: Reduction using rule 4: exp2: exp3 · | "?" Shift to state 23 Conflicts in state 25: Reduction using rule 3: exp2: exp2 "+" exp3 · | "?" Shift to state 23 Conflicts in state 28: Reduction using rule 3: exp2: exp2 "+" exp3 · | "?" Shift to state 16
有没有合理的方法让我使这种语言LR(1) – 可分解(没有冲突)?
或者GLR(或LR(2)?)是我这样的语言的唯一现实选择?
(或者我甚至错误地认为语言首先是明确的?)
State 0: exp1: · ternary | {♦} → shift 1 ternary: · exp2 "?" exp1 ":" exp1 | {♦} → shift 2 exp2: · exp2 "+" exp3 | {"?","+"} → shift 2 exp2: · exp3 | {"?","+"} → shift 3 exp3: · maybe | {"?","+"} → shift 4 exp3: · "1" | {"?","+"} → shift 5 maybe: · exp3 "?" | {"?","+"} → shift 3 State 1: exp1: ternary · | {♦} → reduce 0 State 2: ternary: exp2 · "?" exp1 ":" exp1 | {♦} → shift 7 exp2: exp2 · "+" exp3 | {"?","+"} → shift 8 State 3: exp2: exp3 · | {"+"} → reduce 4 exp2: exp3 · | {"?"} → reduce 4 shift 6 maybe: exp3 · "?" | {"?","+"} → reduce 4 shift 6 State 4: exp3: maybe · | {"?","+"} → reduce 5 State 5: exp3: "1" · | {"?","+"} → reduce 6 State 6: maybe: exp3 "?" · | {"?","+"} → reduce 7 State 7: exp1: · ternary | {":"} → shift 10 exp1: · exp2 | {":"} → shift 11 ternary: · exp2 "?" exp1 ":" exp1 | {":"} → shift 11 ternary: exp2 "?" · exp1 ":" exp1 | {♦} → shift 12 exp2: · exp2 "+" exp3 | {"?",":","+"} → shift 11 exp2: · exp3 | {"?","+"} → shift 13 exp3: · maybe | {"?","+"} → shift 14 exp3: · "1" | {"?","+"} → shift 15 maybe: · exp3 "?" | {"?","+"} → shift 13 State 8: exp2: exp2 "+" · exp3 | {"?","+"} → shift 9 exp3: · maybe | {"?","+"} → shift 9 State 9: exp2: exp2 "+" exp3 · | {"+"} → reduce 3 exp2: exp2 "+" exp3 · | {"?"} → reduce 3 shift 6 maybe: exp3 · "?" | {"?","+"} → reduce 3 shift 6 State 10: exp1: ternary · | {":"} → reduce 0 State 11: exp1: exp2 · | {":"} → reduce 1 ternary: exp2 · "?" exp1 ":" exp1 | {":"} → shift 26 exp2: exp2 · "+" exp3 | {"?","+"} → shift 27 State 12: ternary: exp2 "?" exp1 · ":" exp1 | {♦} → shift 17 State 13: exp2: exp3 · | {":","+"} → reduce 4 exp2: exp3 · | {"?"} → reduce 4 shift 16 maybe: exp3 · "?" | {"?","+"} → reduce 4 shift 16 State 14: exp3: maybe · | {"?","+"} → reduce 5 State 15: exp3: "1" · | {"?","+"} → reduce 6 State 16: maybe: exp3 "?" · | {"?","+"} → reduce 7 State 17: exp1: · ternary | {♦} → shift 1 exp1: · exp2 | {♦} → shift 18 ternary: · exp2 "?" exp1 ":" exp1 | {♦} → shift 18 ternary: exp2 "?" exp1 ":" · exp1 | {♦} → shift 19 exp2: · exp2 "+" exp3 | {♦,"?","+"} → shift 18 exp2: · exp3 | {♦,"+"} → shift 20 exp3: · maybe | {♦,"+"} → shift 21 exp3: · "1" | {♦,"+"} → shift 22 maybe: · exp3 "?" | {♦,"+"} → shift 20 State 18: exp1: exp2 · | {♦} → reduce 1 ternary: exp2 · "?" exp1 ":" exp1 | {♦} → shift 7 exp2: exp2 · "+" exp3 | {♦,"+"} → shift 24 State 19: ternary: exp2 "?" exp1 ":" exp1 · | {♦} → reduce 2 State 20: exp2: exp3 · | {♦,"+"} → reduce 4 exp2: exp3 · | {"?"} → reduce 4 shift 23 maybe: exp3 · "?" | {♦,"+"} → reduce 4 shift 23 State 21: exp3: maybe · | {♦,"+"} → reduce 5 State 22: exp3: "1" · | {♦,"+"} → reduce 6 State 23: maybe: exp3 "?" · | {♦,"+"} → reduce 7 State 24: exp2: exp2 "+" · exp3 | {♦,"+"} → shift 25 exp3: · maybe | {♦,"+"} → shift 25 State 25: exp2: exp2 "+" exp3 · | {♦,"+"} → reduce 3 exp2: exp2 "+" exp3 · | {"?"} → reduce 3 shift 23 maybe: exp3 · "?" | {♦,"+"} → reduce 3 shift 23 State 26: exp1: · ternary | {":"} → shift 10 exp1: · exp2 | {":"} → shift 11 ternary: · exp2 "?" exp1 ":" exp1 | {":"} → shift 11 ternary: exp2 "?" · exp1 ":" exp1 | {":"} → shift 29 exp2: · exp2 "+" exp3 | {"?","+"} → shift 13 State 27: exp2: exp2 "+" · exp3 | {"?","+"} → shift 28 exp3: · maybe | {"?","+"} → shift 28 State 28: exp2: exp2 "+" exp3 · | {":","+"} → reduce 3 exp2: exp2 "+" exp3 · | {"?"} → reduce 3 shift 16 maybe: exp3 · "?" | {"?","+"} → reduce 3 shift 16 State 29: ternary: exp2 "?" exp1 · ":" exp1 | {":"} → shift 30 State 30: exp1: · ternary | {":"} → shift 10 exp1: · exp2 | {":"} → shift 11 ternary: · exp2 "?" exp1 ":" exp1 | {":"} → shift 11 ternary: exp2 "?" exp1 ":" · exp1 | {":"} → shift 31 exp2: · exp2 "+" exp3 | {"?","+"} → shift 13 State 31: ternary: exp2 "?" exp1 ":" exp1 · | {":"} → reduce 2
以上是大佬教程为你收集整理的解析 – 如何解决三元表达式(a?b:c)和“可能”表达式(a?)之间的LR(1)语法歧义?全部内容,希望文章能够帮你解决解析 – 如何解决三元表达式(a?b:c)和“可能”表达式(a?)之间的LR(1)语法歧义?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。