野牛语法警告

时间:2012-04-19 23:30:17

标签: parsing bison

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

2 个答案:

答案 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