Я использую инструмент JavaCUP, чтобы создать парсер для моего языка. Я пытаюсь написать грамматику, которая соответствует вложенным и нескольким операторам if_else.Анализ переносимости смены-сдвига
входного файл
// matches
if()
if()
else
if()
else
else
// no match -> modifying grammar leads to shift/reduce conflict
if()
else
Грамматик
expr ::= if_then_else_statement;
if_then_else_statement ::= IF LPAREN RPAREN if_then_else_statement ELSE if_then_else_statement
| ;
Эта грамматика соответствует вложенному if_else заявления. Однако он распознает только первый вложенный оператор if_else моего входного файла.
Я изменил мою грамматику, чтобы соответствовать несколько инструкций, как это:
expr ::= expr if_then_else_statement;
| ;
if_then_else_statement ::= IF LPAREN RPAREN if_then_else_statement ELSE if_then_else_statement
| ;
В результате произошел сдвиг/свертка конфликт, вызванный пустого правила (я думаю). Как я могу изменить его для поддержки как вложенных, так и множественных операторов if_else без использования приоритета?
У вас есть правило, которое соответствует нескольким утверждениям? – rici
Да, после его модификации expr может уменьшиться до expr if_then_else_statement, который может свести к expr if_then_else_statement if_then_else_statement и, наконец, к if_then_else_statement if_then_else_statement. Но это работает только в теории – pirox22