Неясности BNF

Книга "Конструирование компилятора" дает пример оригинального определения Алгола 60. Они содержат двусмысленность.

Найдите хотя бы две разные структуры для

IF a THEN b ELSE c=d

Есть часть определения

unconditional Statement = basicStatement | forStatement | compoundStatement | ... .
ifStatement = "IF" BooleanExpression "THEN" unconditionalStatement.
conditionalStatement = ifStatement | ifStatement "ELSE" statement.

statement = unconditionalStatement | conditionalStatement. 

Итак, так как:

A "else" B, and A => "if" a "then" b

мы получаем:

if a then b else B

и кажется, B это c=d

Где неясности? Как найти две разные конструкции?


person demsee    schedule 26.05.2020    source источник
comment
Вы уверены, что цитируете это правильно? Как и вы, я не вижу здесь двусмысленности, но этот вопрос напоминает мне о висящем еще проблема.   -  person 500 - Internal Server Error    schedule 26.05.2020
comment
я тоже, может быть, это ответ; тогда как в БНФ скобки складывать?   -  person demsee    schedule 26.05.2020
comment
Здесь нет никаких болтающихся моментов. else присутствует и должен присутствовать, потому что условные выражения требуют предложений else; таким образом, условные выражения - в отличие от условных операторов - не демонстрируют неопределенности висящего else.   -  person rici    schedule 26.05.2020
comment
Большое спасибо за помощь   -  person demsee    schedule 27.05.2020


Ответы (1)


IF a THEN b ELSE c=d не является утверждением. Это какое-то выражение; какой это вид зависит от типа b. (Это выражение будет IF a THEN b ELSE c:=d.. Вспомните, что в Algol := - это присваивание, = - сравнение на равенство, а == - синтаксическая ошибка.)

Если b - логическое, то это логическое условное выражение, альтернативы которого - b и c=d; в этом случае c и d должны иметь арифметический тип, потому что грамматика не позволяет сравнивать логические значения с =.

Но если b является арифметическим, то это сравнение между арифметическим условным выражением IF a THEN b ELSE c и d (и, опять же, c и d должны иметь арифметический тип).

По крайней мере, это мое чтение грамматики. Это не совсем двусмысленно, но BNF недостаточно для разрешения синтаксического анализа, потому что язык не является контекстно-независимым. Для выбора правильного синтаксического анализа требуется предыдущее объявление b, чего можно добиться только с помощью контекстно-зависимой грамматики.

person rici    schedule 26.05.2020