野牛抱怨"冲突:1班/减少"

joh*_*sam 2 yacc bison

野牛抱怨"冲突:1班/减少".我看不出有什么不对.请帮忙.谢谢,

%token OR AND NUMBER
%%

search_condition:
        |       search_condition AND search_condition { printf(" AND "); }
        |       '(' search_condition ')'
        |       predicate
        ;

predicate:
                NUMBER { printf("%d\n", $1);  }
        ;
Run Code Online (Sandbox Code Playgroud)

Chr*_*odd 9

冲突意味着你给bison的语法不是LALR(1),所以它不能决定在每种可能的情况下采取什么动作才能正确解析语法.

在你的情况下,问题是你的语法是模糊的.如果你给它一个输入,如

NUMBER AND NUMBER AND NUMBER
Run Code Online (Sandbox Code Playgroud)

它无法决定是否应该将其解析为等效

( NUMBER AND NUMBER ) AND NUMBER
Run Code Online (Sandbox Code Playgroud)

要么

NUMBER AND ( NUMBER AND NUMBER )
Run Code Online (Sandbox Code Playgroud)

您可以通过多种方式解决此问题:

  • 您可以使用%left AND%right AND告诉Bison它应该AND视为左关联或右关联中缀运算符

  • 你可以重构search_condition规则,使其明确:

    search_condition : search_condition AND primary
                     | primary
                     ;
    primary : '( search_condition ')'
            | predicate
            ;
    
    Run Code Online (Sandbox Code Playgroud)