Проблема здесь заключается во взаимодействии операторов if
и операторов while
, что можно увидеть, если удалить оператор while
из non-if-statement
.
.
Проблема состоит в том, что целью оператора while
может быть оператор if
, а затем оператор while
может находиться в предложении then
другого оператора if
:
IF expression THEN WHILE expression IF expression THEN statement ELSE ...
Теперь у нас есть немного другое проявление исходной проблемы: else
в конце может быть частью вложенного if
или внешнего if
.
Решение состоит в том, чтобы расширить различие между утверждениями с ограничениями («тогда-заявления» в терминах вашей ссылки), чтобы также включить два различных вида операторов while
:
statement ::= IF expression THEN statement
| IF expression THEN then_statement ELSE statement
| WHILE expression statement
| non_if_statement ;
then_statement ::= IF expression THEN then_statement ELSE then_statement
| WHILE expression then_statement
| non_if_statement ;
non_if_statement ::= START_BLOCK statements END_BLOCK
| declaration | assignment ;
Конечно, если вы расширите свою грамматику, включив в нее другие типы составных операторов (например, циклы for
), вам придется сделать то же самое для каждого из них.