【问题标题】:Shift/reduce conflicts in bison转移/减少野牛中的冲突
【发布时间】:2013-07-09 12:52:57
【问题描述】:

我是Bison 的新手,我遇到了移位/减少冲突的问题...我正在尝试从文件加载到array data[]

struct  _data
{
  char name[50]; 
  char surname[50]; 
  int year;
} data[1000];

这是我的野牛代码的一部分:

%token ID NUM NL EOF 

%%

File   : List EOF
       ;
List   : Record
       | List Record
       ;
Record : Name Surname Year NL  { count++; }
       | NL                    { count++; }
       | /*empty*/
       ;
Name   : ID                    { strcpy(data[count].name, yytext); }
       ;
Surname: ID                    { strcpy(data[count].surname, yytext); }
       ;
Year   : NUM                   { data[count].year= atoi(yytext); }
       ;

%%            

我得到这个错误:

conflicts: 5 shift/reduce

知道我哪里出错了吗?

【问题讨论】:

    标签: parsing grammar bison shift-reduce-conflict


    【解决方案1】:

    您可以使用-v 选项获取bison 以生成包含更多信息的.output 文件,这些信息可以帮助您诊断移位/减少冲突。特别是,它将向您显示每个解析器状态,包括项目列表,并指出哪些状态存在冲突。

    但在这种情况下,问题非常简单。只剩下你所拥有的必需品:

    List  : Record
    
    Record: Something
          | /* Nothing */
    

    忽略Something的定义是什么,问题是List可以由任意数量的Records组成,一个接一个,一个Record可以为空。这意味着没有任何东西可以被解析为任意数量的空Records,这完全是模棱两可的。输入中任意两个连续的Somethings 可以用0、1、2、42 或273 个空Records 分隔。由于解析器不知道是开始解析新的Something(移位)还是发出空的@9​​87654333@(减少),它抱怨存在移位/减少冲突。

    解决方案也很简单。我们可以看到非空的Something 必须以NL 结尾;大概的意图是File 由任意数量的Records 组成,每个都在自己的行上。所以我们可以重写:

    List  : Record
          | List NL Record
    
    Record: Name Surname Year
          | %empty
    

    现在Record,无论是否为空,必须跟在NL 或任何可以跟在List 后面的东西(在这种情况下是输入结束指示符,尽管您通常不需要添加这样的规则明确)。后面不能直接跟另一个Record

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      相关资源
      最近更新 更多