Удаление сложного болтающегося зубра зубра

Я пытаюсь избавиться от лишнего в моей грамматике. Терминалы - это слова с заглавной буквы. У меня есть:

      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
    ;

0 ответов

Другие вопросы по тегам