может ли кто-нибудь помочь мне написать правильные правила грамматики для вложенных операторов if? На моем языке я могу написать такие конструкции:
(IF CONDITION)
some statements
(IF CONDITION)
some statements
(ELSE IF CONDITION)
some statements
(ELSE IF CONDITION)
some statements
(ELSE IF CONDITION)
some statements
(ELSE)
some statements
(END)
some statements
(ELSE IF CONDITION)
some statements
(ELSE)
some statements
(END)
Я написал лексер так, что левая и правая скобки являются токенами RULE_OPEN
и RULE_CLOSE
, "IF" - это токен IF
, "END" - это токен END
, "ELSE" - это токен ELSE
, "УСЛОВИЕ" - это токен CONDITION
.
Предположим, что «некоторые операторы» могут быть чем угодно, что разрешено в моем языке (например, в обычном языке программирования). Важно, что можно бесконечно вкладывать операторы IF.
Надеюсь, это понятно, пожалуйста, дайте мне знать, если я плохо объяснил.
Как бы я ни старался. Я всегда получаю конфликты сдвига/уменьшения, и синтаксический анализатор не принимает правильный ввод.
Несмотря на это, я успешно написал правила без else-if. Когда я добавляю правила для else-if, код становится для меня очень сложным.
Ниже приведен мой успешный подход без части else-if (я перечислил только соответствующие правила):
statements: statement
statements: statements statement
statement: code
| data_out
| rule
rule: inline_if_statement
| block_if_statement
block_if_statement: RULE_OPEN IF CONDITION RULE_CLOSE statements RULE_OPEN END RULE_CLOSE
block_if_statement: RULE_OPEN IF CONDITION RULE_CLOSE statements block_else_statement
block_else_statement: RULE_OPEN ELSE RULE_CLOSE statements RULE_OPEN END RULE_CLOSE
block_else_statement: empty
empty :
Я думаю, что это очень распространенная проблема при разборе, и я надеюсь, что кто-то здесь уже решил ее :-) Спасибо за помощь!