[html]<a href="https://en.wikipedia.org/wiki/Dangling_else">https://en.wikipedia.org/wiki/Dangling_else</a>
<br />
русской страницы в википедии такой нет[/html]
грамматика
оператор = ... | оператор-выбора оператор-выбора = ... | ЕСЛИ ( выражение ) ТО оператор | ЕСЛИ ( выражение ) ТО оператор ИНАЧЕ оператор
может дать два возможных дерева разбора:
ЕСЛИ усл1 ТО (ЕСЛИ усл2 ТО дел1) ИНАЧЕ дел2
ЕСЛИ усл1 ТО (ЕСЛИ усл2 ТО дел1 ИНАЧЕ дел2)
это канонический пример проблемы "сдвиг-свёртка" в грамматике
Грамматика может быть переписана так, что конфликт будет устранён.
оператор = ... | оператор-выбора оператор-выбора = ... | ЕСЛИ ( выражение ) ТО оператор | ЕСЛИ ( выражение ) ТО оператор-внутри-условия-с-иначе ИНАЧЕ оператор оператор-внутри-условия-с-иначе = ... | оператор-выбора-внутри-условия-с-иначе оператор-выбора-внутри-условия-с-иначе = ... | ЕСЛИ ( выражение ) ТО оператор-внутри-условия-с-иначе ИНАЧЕ оператор-внутри-условия-с-иначе
Determining whether a context-free grammar is ambiguous is unfortunately one of undecidable problems.
http://blog.reverberate.org/2013/09/ll- … tools.html
"You could ship your compiler only to learn, years later, that your grammar has had an unknown ambiguity in it all along.
This can actually happen in the real world;
it was not discovered that ALGOL 60 had a “dangling else” problem until the language had already been published in a technical report."
Отредактировано Лис (2017-11-08 12:46:59)