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

时间:2011-11-01 13:30:13

标签: bison yacc

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

%token OR AND NUMBER
%%

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

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

1 个答案:

答案 0 :(得分:9)

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

在你的情况下,问题是你的语法含糊不清。如果你给它一个像

这样的输入
NUMBER AND NUMBER AND NUMBER

它无法决定是否应将其解析为等同于

( NUMBER AND NUMBER ) AND NUMBER

NUMBER AND ( NUMBER AND NUMBER )

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

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

  • 您可以重构search_condition规则,使其明确无误:

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