Bison “野牛抱怨”;冲突:1移位/减少“;

Bison “野牛抱怨”;冲突:1移位/减少“;,bison,yacc,Bison,Yacc,野牛抱怨“冲突:1班/减少”。我看不出有什么问题。请帮忙。谢谢 %token OR AND NUMBER %% search_condition: | search_condition AND search_condition { printf(" AND "); } | '(' search_condition ')' | predicate ; predicate:

野牛抱怨“冲突:1班/减少”。我看不出有什么问题。请帮忙。谢谢

%token OR AND NUMBER
%%

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

predicate:
                NUMBER { printf("%d\n", $1);  }
        ;

冲突意味着您提供给bison的语法不是LALR(1),因此它无法决定在每种可能的情况下采取什么操作来正确解析语法

就你而言,问题在于你的语法模棱两可。如果你给它一个输入,比如

NUMBER AND NUMBER AND NUMBER
它无法决定是否应该将其解析为与

( NUMBER AND NUMBER ) AND NUMBER

有多种方法可以解决此问题:

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

  • 您可以重构
    search\u条件
    规则以使其明确:

    search_condition : search_condition AND primary
                     | primary
                     ;
    primary : '( search_condition ')'
            | predicate
            ;
    

我没有使用Bison/Yacc的经验,但是您的
搜索条件
与空字符串(epsilon)匹配:
搜索条件:/*epsilon*/|搜索条件和…
,是否删除第一个管道<代码>搜索条件:搜索条件和…?添加剩余%并解决问题。谢谢
search_condition : search_condition AND primary
                 | primary
                 ;
primary : '( search_condition ')'
        | predicate
        ;