запрос на членство в чем-то, кроме структуры или союза? во Флекс&Бизон

в моем финальном проекте осталось несколько кодов, один из них для flex & bison. Проблема в том, что gcc возвращает мне сообщение "запрос члена 'db' в чем-то, что не является структурой или объединением" в файле 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; } 
            ;

person ZeroDrako    schedule 31.10.2013    source источник


Ответы (1)


Когда вы объявляете, что expression имеет тип i (%type<i> expression), вы сообщаете бизону, что куда бы вы ни поместили выражение, значение стека должно быть вариантом .i. Итак, во всех постановках expression $$ уже представляет члена профсоюза .i; если вы напишите явный .db, то в конечном итоге вы получите yylval.i.db. Но yylval.i — это тип int, который не является структурой или объединением и, следовательно, не может иметь членов.

Я сильно подозреваю, что вы предполагали, что тип expression будет db, но что бы это ни было, вам не нужно (и фактически не может) явно указывать член союза в вашем действии.

person rici    schedule 31.10.2013