問題Sudkamp的語言和機具 19.5要求讀者驗證語法驗證是否一個語法是強LL(2)
G : S' -> S##
S -> aSa | bSb | λ
強LL(2)
。使用算法19.5.1被計算的FIRST
和FOLLOW
集可變S
(第583,第3版):
FIRST(2)(S) = {λ,aa,bb,ab,ba}
FOLLOW(2)(S) = {##,a#,b#,aa,bb,ab,ba}
清楚的是,長度-2先行設置針對S
規則將不分區長度-2先行設置S
,由於規則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}
現在是可能的,我已經在計算犯了一個錯誤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
,那麼文法應該爲而不是爲強LL(2)
。但我無法達成書中預期的結論。我不瞭解什麼?
我使用[給予我的學生的算法]進行了計算(http://www.suigeneris.org/UCABTI/Analisis%20Sintactico%20Descendente%20Predictivo.html),並且我獲得了相同的結果。查找勘誤表或聯繫作者。 – Apalala
我可能會那樣做。您給學生的算法與Sudkamp的算法類似。我找到了另一組算法,並再次獲得了相同的結果。我會在稍後看看這個定義,看看我能否證明這個語法是否是LL(2)。儘管感謝您的檢查。 – danportin