【问题标题】:request for member " " in something not a structure or union? in Flex&Bison请求成员“”不是结构或联合?在 Flex&Bison
【发布时间】:2013-10-31 06:55:21
【问题描述】:

在我的最后一个项目中给我留下了几个代码,其中一个是用于 flex & bison 的代码。 问题是 gcc 在野牛文件中向我返回消息 "request for member 'db' in something not a structure or union" ... 我不知道如何解决这个问题,我找到了解决方案的例子,但没有一个对我有用。 希望能帮上忙,先谢谢了。

弹性文件:

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

【问题讨论】:

    标签: gcc bison yacc lex flex-lexer


    【解决方案1】:

    当您声明expression 的类型为i (%type&lt;i&gt; expression) 时,您是在告诉bison,无论您放置了一个表达式,堆栈值都应该是.i 变体。所以在所有的expression 作品中,$$ 已经代表.i 工会成员;如果你写一个显式的.db,那么你最终会生成yylval.i.db。但是yylval.i 是一个int,它不是strut 或union,因此不能有任何成员。

    我强烈怀疑您打算将expression 的类型设为db,但无论它是什么,您都不必(实际上也不能)在您的操作中明确指定联合成员。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多