如何解决Bison警告“…没有声明类型”

在此文件上运行Bison:

%{
    #include <iostream>
    int yylex();
    void yyerror(const char*);
%}


%union
{
    char    name[100];
    int     val;
}

%token NUM ID
%right '='
%left '+' '-'
%left '*'

%%

exp :   NUM     {$$.val = $1.val;}
    | ID        {$$.val = vars[$1.name];}
    | exp '+' exp   {$$.val = $1.val + $3.val;}
    | ID '=' exp    {$$.val = vars[$1.name] = $3.val;}
;

%%

导致以下类型的警告:

warning: $$ of ‘exp’ has no declared type.

这是什么意思,如何解决呢?

定义的并集(%union)不用于直接使用。相反,你需要告诉Bison哪个成员被哪个表达式使用。

这是用%type directive完成的。

固定版本的代码是:

%{
    #include <iostream>
    int yylex();
    void yyerror(const char*);
%}


%union
{
    char    name[100];
    int     val;
}

%token NUM ID
%right '='
%left '+' '-'
%left '*'

%type<val> exp NUM
%type<name> ID

%%

exp :   NUM     {$$ = $1;}
    | ID        {$$ = vars[$1];}
    | exp '+' exp   {$$ = $1 + $3;}
    | ID '=' exp    {$$ = vars[$1] = $3;}
;

%%
http://stackoverflow.com/questions/1014619/how-to-solve-bison-warning-has-no-declared-type

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:如何解决Bison警告“…没有声明类型”