Сдвиг уменьшить и уменьшить уменьшить конфликты - PullRequest
6 голосов
/ 24 марта 2009

Мне трудно обдумать это, и мне нужна помощь в понимании сдвигов и сокращений конфликтов. У меня есть грамматика, которую я не могу понять, почему это проблематично. Я мог бы приложить грамматику, но я хочу узнать, как это действительно работает.

Первый вопрос, какой тип парсера создает MGrammer? Насколько я понимаю, сдвиги уменьшают и уменьшают уменьшают конфликты, зависит от типа синтаксического анализатора.

Второй вопрос: что означает конфликт с сокращением и сокращением и что означает конфликт с уменьшением?

Я знаю основы лексического анализа и формальной грамматики, но я давно работал с языковым дизайном, поэтому любая помощь здесь очень уместна.

Обновление:

Я работаю со значимым пробельным языком, и мне интересно узнать о возможностях сделать это в MGrammar. Нужно ли мне смотреть в голову, чтобы разрешить неясности?

1 Ответ

10 голосов
/ 24 марта 2009

Простой пример:

if cond
    if cond2
        cmd
    else
        cmd2

Вопрос: Куда относится else? Для человеческого глаза отступ говорит «второму if», но это ничего не значит для компьютера (кроме случаев использования Python ;)). Это конфликт сдвиг / уменьшение .

Элегантное решение состоит в том, чтобы трактовать else как оператор левой привязки с наивысшим приоритетом (что заставляет его "зависать" к ближайшему if).

A уменьшить / уменьшить конфликт - это двусмысленность. У меня нет хорошего удобного примера, но это означает, что в грамматике есть пути, где один токен может привести к сокращению двух правил одновременно, и нет никакой дополнительной информации, чтобы решить, какое правило должно иметь приоритет.

[EDIT] Документы бизонов имеют пример для уменьшения / уменьшения .

...