LL (1) грамматика для зависания еще

В построении компилятора одной из основных проблем двусмысленности является dangling else. Как упоминалось в сборниках компиляторов: "Принципы, методы и инструменты" Ахо, Лама, Сети и Ульмана, грамматика для зависания еще не может использоваться с парсерами LL (1).

Верно ли, что его нельзя обрабатывать как LL (1)?

1 ответ

Истинно, он не может быть проанализирован LL (k) или LALR (k) в их чистых формах. Проблема состоит в том, что возможны две возможные интерпретации болтанинга else; его проблема двусмысленности ( "else" относится к ближайшему "если" или не принадлежит).

Обычно он излечивается, настаивая только на одной из двух интерпретаций, например, "else принадлежит ближайшему, если".

Многие генераторы парсеров могут получить это "прямо по ошибке"; решение с LL состоит в том, чтобы принять первый синтаксический анализ, который работает, и сначала попытаться "еще подключиться к ближайшему". Решение с LR - это "shift on else", которое легко вызвать, просто проверяя действия "сдвига" перед "уменьшением" действий.

Возникает проблема с парсером, который действительно будет воспринимать неоднозначные анализы, такие как GLR. Здесь можно дать дополнительные грамматические подсказки, например, "сдвинуть на другое".

licensed under cc by-sa 3.0 with attribution.