Sudkamp のLanguages and Machinesの問題 19.5では、文法が
G : S' -> S##
S -> aSa | bSb | λ
強いLL(2)
です。変数のFIRST
およびFOLLOW
セットは、S
アルゴリズム 19.5.1 (p. 583、第 3 版) を使用して計算されます。
FIRST(2)(S) = {λ,aa,bb,ab,ba}
FOLLOW(2)(S) = {##,a#,b#,aa,bb,ab,ba}
S
ルールの長さ 2 の先読みセットが、 の長さ 2 の先読みセットを分割しないことは明らかです。これは、 で構成される長さ 2 の先読みセットを生成S
するルールによります。S -> λ
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}
FIRST
の、FOLLOW
、またはLA(2)
セットの計算でエラーが発生した可能性がありますG
。ただし、アルゴリズムを正しく実行したことにはかなりの自信があります。特に、それらの定義に戻ることができます。
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 の先読みセットが の長さ 2 の先読みセットを分割しない場合S
、文法はstrongであってはなりませんLL(2)
。しかし、本が期待する結論に達することはできません。私は何を理解していませんか?