代码之家  ›  专栏  ›  技术社区  ›  lluisrojass

为什么Yacc/野牛规则没有用?

  •  0
  • lluisrojass  · 技术社区  · 7 年前

    具有

    %nonassoc ELSE
    %nonassoc THEN
    

    我明白了


    tiger.yy:74.5-28:警告:由于冲突,规则在解析器中无效[-Wother]

    但是有

    %nonassoc THEN
    %nonassoc ELSE
    

    这是怎么回事?为什么会这样?

    1 回复  |  直到 7 年前
        1
  •  2
  •   rici    7 年前

    正如警告所说,这条规则是无用的,因为如果 THEN 优先于 ELSE

    我假设语法实际上包括如下内容:

    exp: IF exp THEN exp ELSE exp
       | IF exp THEN exp
    

    因为如果 其他 其他 是解析 IF exp THEN IF exp THEN exp ELSE... 转移 这个 其他 内部 IF exp THEN exp exp

    转移 行动,使 其他 将与最里面的可用 IF 。如果没有优先声明,这将是默认解决方案,因为yacc/bison更喜欢shift而不是reduce。但是,如果bison使用默认分辨率,它也会生成有关该分辨率的警告。为了避免警告,通常通过给定 其他 那么

    %nonassoc THEN
    %nonassoc ELSE
    

    %nonassoc ELSE
    %nonassoc THEN
    

    那么你是在给予 优先于 那么 其他 .野牛/亚科将遵守该要求,但如果这样做,它永远无法改变 其他 其他 无用的