искане за членство в нещо, което не е структура или съюз? във Flex&Bison

в последния ми проект ми остави няколко кода, един от тях е този за flex & bison. Проблемът е, че gcc ми връща съобщението "заявка за член 'db' в нещо, което не е структура или обединение" във файл bison ... Не знам как да поправи това, намирам примери за решения, но нито едно не работи за мен. Надявам се да мога да помогна, благодаря предварително.

Flex файл:

%{
 #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;
}

Файл Bison:

%{
    #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), вие казвате на bison, че където и да сте поставили израз, стойността на стека трябва да бъде .i вариант. Така че във всички expression продукции, $$ вече представлява .i член на съюза; ако напишете изрично .db, в крайна сметка ще генерирате yylval.i.db. Но yylval.i е int, което не е strut или union и следователно не може да има членове.

Силно подозирам, че сте възнамерявали типът на expression да бъде db, но каквото и да е, не е нужно (и всъщност не можете) изрично да посочите члена на съюза във вашето действие.

person rici    schedule 31.10.2013