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 ;
.
.
.
还有更多代码,但这是发生错误的部分。 当我为每个操作符创建一个规则时,我没有错误,但由于递归而我遇到了其他问题所以我相信我需要这样做。
答案 0 :(得分:1)
首先,您不希望Flex代码直接返回yytext
的值。在野牛可以充分利用它之前,它可能(好吧,很可能会)被覆盖。如果您想将数字保存为字符串,则需要malloc
和strdup
。对于运营商而言,最好只设置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);}
;