Уменьшить-уменьшить конфликты - PullRequest
0 голосов
/ 27 апреля 2018

как устранить конфликты уменьшения-уменьшения следующего файла yacc:

MATH_EXPRESSION   :   MATH_EXPRESSION PLUS MATH_EXPRESSION
                    | MINUS MATH_EXPRESSION   %prec UMINUS
                    | MATH_EXPRESSION MINUS MATH_EXPRESSION
                    | MATH_EXPRESSION MULTIPLY MATH_EXPRESSION
                    | MATH_EXPRESSION DIVIDE MATH_EXPRESSION
                    | MATH_EXPRESSION REMAINDER MATH_EXPRESSION
                    | MATH_EXPRESSION POWER MATH_EXPRESSION
                    | BRACKET_OPEN MATH_EXPRESSION BRACKET_CLOSE
                    | OPERAND
                    ;



LOGICAL_EXPRESSION  : LOGICAL_EXPRESSION LOGICAL_AND LOGICAL_EXPRESSION
                      | LOGICAL_EXPRESSION LOGICAL_OR LOGICAL_EXPRESSION
                      | LOGICAL_NOT LOGICAL_EXPRESSION
                      | LOGICAL_EXPRESSION COMPARE_EQUAL LOGICAL_EXPRESSION
                      | LOGICAL_EXPRESSION COMPARE_NOT_EQUAL LOGICAL_EXPRESSION
                      | LOGICAL_EXPRESSION COMPARE_GREATER LOGICAL_EXPRESSION
                      | LOGICAL_EXPRESSION COMPARE_LESS LOGICAL_EXPRESSION
                      | LOGICAL_EXPRESSION COMPARE_GREATER_EQUAL LOGICAL_EXPRESSION
                      | LOGICAL_EXPRESSION COMPARE_LESS_EQUAL LOGICAL_EXPRESSION
                      | BRACKET_OPEN LOGICAL_EXPRESSION BRACKET_CLOSE
                      | OPERAND
                      ;


OPERAND           : NUMBER
                  | IDENTIFIER
                  ;



MATH_OR_LOGICAL_EXPRESSION  : MATH_EXPRESSION
                            | LOGICAL_EXPRESSION
                            ;

1 Ответ

0 голосов
/ 27 апреля 2018

Чтобы понять, почему возникает конфликт, рассмотрим вход, который просто состоит из идентификатора. Это MATH_EXPRESSION или LOGICAL_EXPRESSION? Парсер не может принять решение, потому что он соответствует обоим правилам.

Что вам нужно сделать, так это иметь одно правило выражения, которое содержит как логические, так и арифметические операторы. Различия между типами, как правило, не могут быть обработаны на уровне синтаксического анализа, вам нужно сделать это в средстве проверки типов.

...