在我的最终项目中给我留下了几个代码,其中一个是flex & bison的代码。问题是 gcc 在野牛文件中向我返回消息"请求成员'db'在非结构或联合中"......我不知道如何解决这个问题,我找到了解决方案的例子,但没有一个对我有用。我希望我能帮上忙,提前谢谢。
弹性文件:
%{
#include <stdlib.h>
#include "y.tab.h"
#include <stdio.h>
#include <string.h>
#include <ctype.h>
%}
%option noyywrap
%option yylineno
digit [0-9]
blank [t]
sign [+-/*]
other .
%%
{digit}+ { sscanf(yytext, "%lf", &yylval.db); return NUMBER;}
{digit}+.{digit}* { sscanf(yytext, "%lf", &yylval.db); return NUMBER;}
.{digit}+ { sscanf(yytext, "%lf", &yylval.db); return NUMBER;}
sign return *yytext;
{blank}+ ;
{other} return yytext[0];
%%
int main()
{
if (yyparse()==0){
printf("n NO ERROR");}
return 0;
}
int yyerror(char * mensaje)
{
printf("n AND STOP");
printf("n ERROR: %s",mensaje);
printf("n ERROR LINE: %d",yylineno);
return 0;
}
野牛文件:
%{
#include <stdio.h>
#include <stdlib.h>
char result[100];
%}
%union { double db; int i; }
%token NUMBER
%left '-' '+'
%left '*' '/'
%left '(' ')'
%nonassoc UMINUS
%type<db> list NUMBER
%type<i> expression
%start list
%%
list : expression { printf("nResultado: %5gn",$$.db);}
;
expression : expression '+' expression { $$.db = $1.db + $3.db; }
| expression '-' expression { $$.db = $1.db - $3.db; }
| expression '*' expression { $$.db = $1.db * $3.db; }
| expression '/' expression { if ($3.db==(double)0) yyerror("Division por ceron");
else $$.db = $1.db / $3.db; }
| '-' expression %prec UMINUS { $$.db = -$2.db; }
| '(' expression ')' { $$.db = $2.db; }
| NUMBER { $$.db = $1.db; }
;
当你声明expression
有类型i
(%type<i> expression
)时,你是在告诉bison,无论你在哪里放置表达式,堆栈值都应该是.i
变体。因此,在所有expression
作品中,$$
已经代表了.i
工会成员;如果你写一个显式.db
,那么你最终会生成yylval.i.db
。但是yylval.i
是一个int,它不是支柱或工会,因此不能有任何成员。
我强烈怀疑你打算db
expression
的类型,但不管它是什么,你不必(实际上也不能)在你的行动中明确指定工会成员。