Проблема 19.5 из Языки и машины Судкампа просит читателя проверить, что грамматика
G : S' -> S##
S -> aSa | bSb | λ
сильно LL(2)
. Наборы FIRST
и FOLLOW
для переменной S
вычисляются с использованием алгоритма 19.5.1 (стр. 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)
. Если наборы предпросмотра длины 2 для правил S
не разбивают набор предпросмотра длины 2 для S
, то грамматика должна , а не быть сильной LL(2)
. Но я не могу прийти к выводу, ожидаемому книгой. Что я не понимаю?