Русскоязычное программирование

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Русскоязычное программирование » контекстно-свободные грамматики » Проблема "спорной альтернативы" (dangling else)


Проблема "спорной альтернативы" (dangling else)

Сообщений 1 страница 7 из 7

1

[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)

0

2

:D
Это не устраняет проблему разбора. А просто смещает фокус проблемы с конфликта сдвиг-свёртка в сторону конфликта свёртка-свёртка.

Отредактировано Павиа (2017-11-07 06:42:07)

0

3

[html]<img src="https://orig00.deviantart.net/2e36/f/2013/291/9/9/gold_by_kenket-d6qxr8w.jpg" wisth="300" />[/html]

0

4

Классические грабли всех начинающих языкоделов :). Нормальные люди давно решают эту проблему использованием программных блоков. Запретите использовать однооператорные IF и проблема исчезает как дым.
Просто два варианта в одном флаконе:

IF <условие> THEN
Begin

     IF <условие> THEN
     Begin

          чето там
     End
     ELSE
     Begin

          тогда не чето там
     End
End
ELSE
Begin

     чето другое здесь
End

Ситуации описанной Вами просто не существует в таком ключе. Эти вещи давно уже обсосаны, наравне и с другими мелочами (типа представления унарного минуса).

Отредактировано utkin (2017-11-07 07:29:02)

0

5

Лис написал(а):

ЕСЛИ усл1 ТО (ЕСЛИ усл2 ТО дел1) ИНАЧЕ дел2
ЕСЛИ усл1 ТО (ЕСЛИ усл2 ТО дел1 ИНАЧЕ дел2)

Всё правильно, так и надо писать :rolleyes:

Нормальные люди давно решают эту проблему использованием программных блоков. Запретите использовать однооператорные IF и проблема исчезает как дым.

А зачем городить огород ради соблюдения инвалидной теории с ограниченными возможностями? Можно же просто выдать: "Ай-ай-ай, неоднозначность, ограничьте действие условия скобками!".

Отредактировано MihalNik (2017-11-07 10:36:37)

0

6

Ну кому как, можно просто запретить использовать IF  в однострочных IF да и все проблемы :)

А зачем городить огород ради соблюдения инвалидной теории с ограниченными возможностями?

Потому что это уменьшает расходы на отладку и поиск логических ошибок.

0

7

utkin написал(а):

Потому что это уменьшает расходы на отладку и поиск логических ошибок.

Это узкий подход, который заставляет парится ради формальных, но бесполезных правил, замедляя создание и отладку самого языка.
Запрет неоднозначности более универсален и оставляет выбор решать нужно ли исправлять конкретное применение или язык вообще.

Отредактировано MihalNik (2017-11-07 10:58:53)

0


Вы здесь » Русскоязычное программирование » контекстно-свободные грамматики » Проблема "спорной альтернативы" (dangling else)