gpt4 book ai didi

parsing - 转移/减少 Bison 的冲突

转载 作者:行者123 更新时间:2023-12-04 02:59:02 29 4
gpt4 key购买 nike

我是新来的 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

知道我哪里出错了吗?

最佳答案

您可以使用 -v获取选项 bison生产 .output包含更多信息的文件,可以帮助您诊断转移/减少冲突。特别是,它将向您显示每个解析器状态,包括项目列表,并指出哪些状态存在冲突。
但在这种情况下,问题很简单。剥离到它的必需品,你有:

List  : Record

Record: Something
| /* Nothing */
忽略 Something 的定义是,问题在于 List可以包含任意数量的 Records ,一个接一个,一个 Record可以为空。这意味着没有任何东西可以解析为任意数量的空 Records ,这是完全模棱两可的。任意两个连续 Somethings在输入中可以用 0、1、2、42 或 273 分隔空 Records .由于解析器不知道是否开始解析新的 Something (shift) 或发出一个空的 Record (reduce),它提示有一个 shift/reduce 冲突。
解决方法也很简单。我们可以看到一个非空的 Something必须以 NL 结尾;大概的意图是 File由任意数量的 Records 组成,每个都在自己的行上。所以我们可以重写:
List  : Record
| List NL Record

Record: Name Surname Year
| %empty
现在是 Record ,无论是否为空,都必须后跟 NL或任何可以关注的内容 List (在这种情况下,输入结束指示符,尽管您通常不需要明确添加这样的规则)。它不能直接跟另一个 Record .

关于parsing - 转移/减少 Bison 的冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17590190/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com