0

私の最後のプロジェクトでは、いくつかのコードが残されました。そのうちの1つは、flexとbison用です。問題は、gcc がメッセージ「request for member ' db ' in something not a structure or union」を bison ファイルに返すことです...これを修正する方法がわかりません。解決策の例を見つけましたが、うまくいきません。お役に立てれば幸いです。よろしくお願いします。

フレックスファイル:

%{
 #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: %5g\n",$$.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 cero\n");    
                                           else  $$.db = $1.db / $3.db; }
            | '-' expression %prec UMINUS { $$.db = -$2.db; }
            | '(' expression ')'                   { $$.db = $2.db; }
            | NUMBER                            { $$.db = $1.db; } 
            ;
4

1 に答える 1

1

expressioni( )を持つことを宣言すると%type<i> expression、式をどこに置いても、スタック値が.iバリアントであることを bison に伝えます。したがって、すべてのexpressionプロダクションで、$$すでに.i組合員を代表しています。を明示的に記述する.dbと、最終的に が生成されyylval.i.dbます。しかしyylval.i、これはストラットでも共用体でもない int であるため、メンバーを持つことはできません。

の型が であることを意図していたのではないかと強く疑っていますexpressiondb、それが何であれ、アクションで共用体メンバーを明示的に指定する必要はありません (実際にはできません)。

于 2013-10-31T07:04:12.020 に答える