我正在和Bison一起编写解析器,我收到了以下警告。
fol.y:42 parser name defined to default :"parse"
fol.y:61: warning: type clash ('' 'pred') on default action
我一直在使用谷歌搜索摆脱它们的方法,但几乎是空手而归他们的意思(更不用说如何修复它们),因为我发现的每个帖子都有编译错误并且没有解决他们自己的警告。有人能告诉我他们的意思以及如何解决这些问题吗?相关代码如下。第61行是最后一个分号。我删除了其余的语法,因为它非常冗长。
%union {
char* var;
char* name;
char* pred;
}
%token <var> VARIABLE
%token <name> NAME
%token <pred> PRED
%%
fol:
declines clauses {cout << "Done parsing with file" << endl;}
;
declines:
declines decline
|decline
;
decline:
PRED decs
;
答案 0 :(得分:1)
第一条消息可能只是警告您未在语法规范中包含%start parse
。
第二个意味着某个地方你有规则应该返回一个值,但你没有正确指定要返回的值类型。 PRED会返回pred
的{{1}}元素;问题可能是您没有为union
和%type
创建decline
个条目。如果您有一个联合,则必须为大多数(如果不是全部)规则指定类型 - 或者只是指定没有明确操作的规则(以便覆盖默认的declines
操作)。
我不相信问题出在您指定的行中,并且由于我们没有对您的问题进行完整,最小的再现,因此我们无法调查您的问题。 $$ = $1;
的规范可能是相关的(我不相信它,但它可能是)。
您可以从decs
的输出中获取更多信息,即bison -v
文件(或类似内容)。
答案 1 :(得分:0)
解决此问题:
fol.y:42解析器名称定义为默认值:“parse”
在%name parse
%token
例如:
%name parse
%token NUM
(来自:https://bdhacker.wordpress.com/2012/05/05/flex-bison-in-ubuntu/#comment-2669)