我声明的错误未申报类型

时间:2014-02-27 11:25:49

标签: bison flex-lexer

Bison抛出这个

  

错误:'exp'的$ 2没有声明的类型

但我相信我已宣布一切。

FLEX:

[0-9]+ {
yylval.string =yytext; //yes I want ints as strings.
return INT;
}
"*"     {yylval.string=yytext; return MUL;} 
"/"     {yylval.string=yytext; return DIV;} 
"-"     {yylval.string=yytext; return MINUS;} 
"+"     {yylval.string=yytext; return PLUS;} 
"^"     {yylval.string=yytext; return POW;}

BISON:

 %union {
 char * string;
}

%token <string>  INT DEC STRING PLUS MINUS MUL DIV POW
%type <string> OP
.
.
.
 exp: type {foo(x,$1);}
    |exp 
    OP {foo(x,$2);}
    exp; 

OP: PLUS | MINUS| MUL| DIV| POW ;
.
.
.

还有更多代码,但这是发生错误的部分。 当我为每个操作符创建一个规则时,我没有错误,但由于递归而我遇到了其他问题所以我相信我需要这样做。

1 个答案:

答案 0 :(得分:1)

首先,您不希望Flex代码直接返回yytext的值。在野牛可以充分利用它之前,它可能(好吧,很可能会)被覆盖。如果您想将数字保存为字符串,则需要mallocstrdup。对于运营商而言,最好只设置yylval.string="+";等,而不是动态创建新内存。

其次,您的野牛代码似乎缺少某些东西。在您的问题得到完全诊断之前,您能否发布功能foo的签名以及x的类型?

第三,这是你的野牛代码中的拼写错误吗?应

exp: type {foo(x,$1);}
    |exp 
    OP {foo(x,$2);}
    exp; 

exp: type {foo(x,$1);}
    |exp OP exp {foo(x,$2);}
    ;