1

我正在用 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
        ;
4

2 回答 2

1

第一条消息可能只是您未包含%start parse在语法规范中的警告。

第二个意味着您在某处有应该返回值的规则,但您没有正确指定要返回的值类型。PRED 返回pred你的元素union;问题可能是您没有为and创建%type条目。如果您有联合,则必须为大多数(如果不是全部)规则指定类型——或者可能只是没有明确操作的规则(以便覆盖默认操作)。declinedeclines$$ = $1;

我不相信问题是否在您指定的行中,并且由于我们没有完整、最小限度地再现您的问题,因此我们无法为您进行调查以验证它。的规范decs可能是相关的(我不相信它是相关的,但它可能是相关的)。

您可以从 的输出中获得更多信息bison -v,即y.output文件(或类似文件)。

于 2012-04-20T00:30:17.923 回答
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 )

于 2017-02-09T14:50:26.110 回答