Bison 错误未声明I';我和野牛在一起
野牛扔了这个 错误:“exp”的$2没有声明的类型 但我相信我已经宣布了一切 FLEX:Bison 错误未声明I';我和野牛在一起,bison,flex-lexer,Bison,Flex Lexer,野牛扔了这个 错误:“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 M
[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;}
%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-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;}
%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 ;
.
.
.
%union{
字符*字符串;
}
%令牌INT DEC字符串加上减去MUL DIV POW
%OP型
.
.
.
exp:type{foo(x,$1);}
|经验
OP{foo(x,$2);}
经验;
OP:加|减| MUL | DIV | POW;
.
.
.
还有很多代码,但这是发生错误的部分。
当我为每个操作符创建一个规则时,我没有得到任何错误,但由于递归,我遇到了其他问题,因此我认为我需要这样做。首先,您不希望flex代码直接返回
yytext
的值。在野牛能够充分利用它之前,它可能(很可能会)被覆盖。如果要将数字保存为字符串,则需要malloc
和strdup
将其保存。对于运算符,最好只设置yylval.string=“+”代码>,等等,而不是动态创建新内存
其次,看起来你的野牛代码中缺少了一些东西。在完全诊断您的问题之前,您能否发布函数foo
的签名以及x
的类型
第三,这是你的野牛代码中的一个输入错误吗?应该
exp: type {foo(x,$1);}
|exp
OP {foo(x,$2);}
exp;
是
?我怀疑您的实际代码与您发布的代码不同(您有一个简单的拼写错误,在总结时会不知不觉地更正)。尝试发布一个摘要.y
文件,您可以通过bison运行该文件并生成错误。感谢您的回答。你指出的最后一件事重要吗?我不想说,但我不是100%确定。我只是以前从未见过像这样编写的bison代码,如果它能像您希望的那样运行,我会感到惊讶。