Остальные же символы необходимо сохранить, чтобы
использовать для формирования новых проверок на последующих шагах.
Понятно также, что сохранение должно осуществляться в стеке (нет
другой рабочей памяти) и в реверсивном порядке (так как самый левый
символ правила должен разбираться первым, чтобы было соответствие с
левым выводом). Отсюда также понятно, что терминалы, расположенные
в середине правила, будут заноситься в стек и поэтому должны являться
магазинными символами. Ясно также, что когда на вершине стека
располагается терминал, он не может являться левой частью правила.
Поэтому его необходимо просто вытолкнуть из стека, нейтрализуя
эквивалентным входным символом.
9.3.2 S-грамматика и распознавание вложенности скобок
Обладая методами создания АМП по S-грамматике, вернемся к
задаче распознавания вложенности скобок. Раньше соответствующий
автомат был построен эвристически. Между тем, грамматика G
9.1
не
является S-грамматикой и мы не можем ее преобразовать к S-грамматике
даже для этой простой задачи. Попытаемся разобраться с возникшими
проблемами.
Нет ничего сложного в построении правила S-грамматики для
начального нетерминала, правая часть которого всегда начинается с
открывающейся скобки:
S → (B .
Но, при определении B, возникает ряд проблем. Правая часть B
может начинаться с закрывающейся скобки, за которой не будет
следовать ничего:
B → ) .
Но, вместе с тем, вслед за закрывающейся скобкой может вновь
следовать произвольный набор вложенных скобок, полностью
повторяющий цепочку, порождаемую из начального нетерминала:
B → ) S .
Возникает противоречие условию 2, которое в S-грамматике
разрешить невозможно. Это противоречие не позволяет осуществить
порождение произвольных цепочек. Остается только генерировать
разнообразные варианты внутри охватывающих круглых скобок. Для
этого правило B, начинающееся с открывающейся круглой скобки,
должно выглядеть следующим образом:
B → ( B B .