Если грамматика неоднозначна, то для каждой формы предложения существует ровно один дескриптор.
Может быть два производства, из которых мы можем сделать сокращение. После предоставления приоритета и ассоциаций, как требуется, будет только один дескриптор. Так это утверждение верно?
2 ответа
Это отчасти верно, конфликт уменьшения / уменьшения обычно разрешается путем указания приоритета или разрешения сборщику синтаксического анализатора выбирать, какое правило применять перед другим.
Это означает, что конфликт разрешен, но не то, что синтаксический анализатор будет вести себя точно так, как задумано. Удобно изучить, что вызывает конфликт, и подумать, нужен ли рефакторинг грамматики для выражения того, что вы пытаетесь проанализировать, или достаточно автоматического выбора / приоритета.
Если у вас есть грамматика, которая имеет неоднозначные правила, вы получите несколько толкований. Вы не должны настаивать на том, что грамматика устраняет двусмысленность; Вы можете просто согласиться с тем, что что-то неоднозначно, и проанализировать это несколькими способами:
fruit flies like an arrow.
Результат разбора - множественные интерпретации.
Теперь, чтобы такой язык был полезен для читателя, либо он должен быть доволен двусмысленностью, либо вы должны дать ему способ ее разрешить. (В этом примере я решил для вас, что вы рады двусмысленности, потому что я не дал вам способа решить эту проблему!). Или можно предоставить читателю что-то с неоднозначным анализом, способом выбрать, какой анализ имеет смысл, и он отвергает неуместные анализы.
Я могу сделать это для приведенного выше случая, сказав, что я имею в виду "фрукты => арбуз".
Компьютерные грамматики не отличаются, но большинство программистов не хотят неоднозначного кода. Так что, в общем, разработчики языка любят определять однозначные грамматики. На практике они не достигают успеха, и вы получаете забавные языковые правила, такие как "Если это можно интерпретировать неоднозначно, то интерпретируйте это так".