Удаление сложного болтающегося зубра зубра
Я пытаюсь избавиться от лишнего в моей грамматике. Терминалы - это слова с заглавной буквы. У меня есть:
statement:
expression_statement (not important now )
| compound_statement (not important now )
| selection_statement
| iteration_statement (not important now but maybe yes ? it contains statement non-terminal )
| jump_statement (not important now )
;
selection_statement:
IF LPAR expression RPAR statement
| IF LPAR expression RPAR statement ELSE statement
;
iteration_statement:
WHILE LPAR expression RPAR statement
| DO statement WHILE LPAR expression RPAR SEMIC
| FOR LPAR expression_opt SEMIC expression_opt SEMIC expression_opt RPAR statement
;
Я пробовал этот подход
statement:
expression_statement
| compound_statement
| selection_statement_o
| selection_statement_c
| iteration_statement
| jump_statement
;
selection_statement_o:
IF LPAR expression RPAR statement
| IF LPAR expression RPAR selection_statement_c ELSE selection_statement_o
;
selection_statement_c:
IF LPAR expression RPAR selection_statement_c ELSE selection_statement_c
;
Я застрял и не знаю, что делать. Как мне здесь правильно удалить болтающиеся детали? Спасибо за любую помощь.
РЕДАКТИРОВАТЬ 1: Я пробовал этот подход, и у меня было меньше конфликтов сдвига / уменьшения и больше конфликтов уменьшения / уменьшения, я думаю, это неправильно: D, но вот он
statement:
matched
| unmatched
| other
;
other:
expression_statement
| compound_statement
| jump_statement
;
matched:
selection_statement_c
| iteration_statement_c
;
unmatched:
selection_statement_o
| iteration_statement_o
;
selection_statement_o:
IF LPAR expression RPAR statement
| IF LPAR expression RPAR matched ELSE unmatched
;
selection_statement_c:
IF LPAR expression RPAR matched ELSE matched
;
iteration_statement_o:
WHILE LPAR expression RPAR unmatched
| DO statement WHILE LPAR expression RPAR SEMIC
| FOR LPAR expression_opt SEMIC expression_opt SEMIC expression_opt RPAR unmatched
;
iteration_statement_c:
WHILE LPAR expression RPAR matched
| DO statement WHILE LPAR expression RPAR SEMIC
| FOR LPAR expression_opt SEMIC expression_opt SEMIC expression_opt RPAR matched
;