【发布时间】:2011-09-17 22:29:13
【问题描述】:
Sudkamp 的语言和机器的问题 19.5 要求读者验证语法
G : S' -> S##
S -> aSa | bSb | λ
很强大LL(2)。变量 S 的 FIRST 和 FOLLOW 集是使用算法 19.5.1 计算的(第 583 页,第 3 版):
FIRST(2)(S) = {λ,aa,bb,ab,ba}
FOLLOW(2)(S) = {##,a#,b#,aa,bb,ab,ba}
很明显,S 规则的长度为 2 的前瞻集不会分割S 的长度为 2 的前瞻集,因为S -> λ 规则导致了长度为 2 的前瞻由FOLLOW(2)(S)组成的集合:
LA(2)(S) = {##,a#,b#,aa,bb,ab,ba}
LA(2)(S -> aSa) = {a#,aa,ab}
LA(2)(S -> bSb) = {b#,bb,ba}
LA(2)(S -> λ) = {##,a#,b#,aa,bb,ab,ba}
现在我可能在计算G 的FIRST、FOLLOW 或LA(2) 集时出错。但是,我相当有信心我已经正确执行了算法。特别是,我可以回到他们的定义:
FIRST(2)(S) = trunc(2)({x : S =>* x AND x IN Σ*})
= trunc(2)({uu^R : u IN {a,b}^*})
= {λ,aa,bb,ab,ba}
FOLLOW(2)(S) = trunc(2)({x : S' =>* uSv AND x IN FIRST(2)(v)})
= trunc(2)({x : x IN FIRST(2)({a,b}^*{##})})
= trunc(2)({##,a#,b#,aa,bb,ab,ba})
= {##,a#,b#,aa,bb,ab,ba}
现在的问题是:为什么语法强 LL(2)。如果 S 规则的长度为 2 的前瞻集没有对 S 的长度为 2 的前瞻集进行分区,则语法应该不强LL(2)。但我无法得出本书所期望的结论。我不明白什么?
【问题讨论】:
-
我使用algorithms I gave to my students 进行了计算,得到了与您相同的结果。查找勘误表或联系作者。
-
我可能会这样做。您提供给学生的算法与 Sudkamp 的相似。我找到了一组替代算法并再次获得了相同的结果。稍后我将查看定义,看看我是否可以证明语法是或不是 LL(2)。不过,感谢您的检查。
标签: computer-science theory grammar formal-languages