Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bison 错误未声明I';我和野牛在一起_Bison_Flex Lexer - Fatal编程技术网

Bison 错误未声明I';我和野牛在一起

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

野牛扔了这个

错误:“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;}
 %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代码,如果它能像您希望的那样运行,我会感到惊讶。