【问题标题】:Error undeclared type that I've declared with Bison我用 Bison 声明的错误未声明类型
【发布时间】:2014-02-27 11:25:49
【问题描述】:

野牛扔这个

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

但我相信我已经宣布了一切。

灵活:

[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 ;
.
.
.

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

【问题讨论】:

  • 我怀疑您的实际代码与您发布的代码不同(您有一个简单的错字,您在总结时无意识地纠正了它)。尝试发布一个摘要 .y 文件,您实际上可以通过 bison 运行并生成错误。

标签: bison flex-lexer


【解决方案1】:

首先,您不希望您的弹性代码直接返回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);}
    ; 

?

【讨论】:

  • 感谢您的回答。你指出的最后一件事重要吗?
  • 我不想这么说,但我不是 100% 确定。我只是以前没有见过这样写的野牛代码,如果它像你想要的那样运行,我会感到惊讶。
猜你喜欢
  • 1970-01-01
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
  • 2018-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多