0

我一直在寻找我的问题的答案,但没有人能解决我的问题。

这是我非常简单的 Yacc 文件:

%{
#include <stdio.h>
#include "y.tab.h"

int clientesVodafone = 0;
int clientesMovistar = 0;
float sumaVodafone = 0.0;
float sumaMovistar = 0.0;
%}


%union {
    int t0;
    float cm;
};

%token NUMEROTELEFONO OPERADORA SERVICIO COSTEMENSAJE
%type <t0> OPERADORA
%type <cm> COSTEMENSAJE

%start fichero
%%

ServicioSMS: NUMEROTELEFONO OPERADORA SERVICIO COSTEMENSAJE {
                if ($2.t0 == 0) {
                    clientesMovistar++;
                    sumaMovistar += $4.cm;
                } else {
                    clientesVodafone++;
                    sumaVodafone += $4.cm;
                }
            }

fichero: ServicioSMS
fichero: fichero ServicioSMS

%%

int main(void) {
  yyparse();
  printf("%i clientes de VODAFONE con coste %f euros.", 
        clientesVodafone, sumaVodafone);
  printf("%i clientes de MOVISTAR con coste %f euros.",
        clientesMovistar, sumaMovistar);
}

这是我的 Lex 文件:

%{
#include <stdio.h>
#include "y.tab.h"
%} 

%% 

6[0-9]{8}           {return NUMEROTELEFONO;}
MOVISTAR            {yylval.t0 = 0; return OPERADORA;}
VODAFONE            {yylval.t0 = 1; return OPERADORA;}
[0-9]+s             {return SERVICIO;}
[0-9]*\.[0-9]+      {yylval.cm = atof(yytext); return COSTEMENSAJE;}

%% 

编译时,我收到著名的错误消息:“错误:请求成员 't0' 在不是结构或联合的东西中”。我也收到与成员“cm”相同的错误。它们与 yyparse() 相关联,如下所示:

 if ($2.t0 == 0) {
     clientesMovistar++;
     sumaMovistar += $4.cm;
 } else {
     clientesVodafone++;
 sumaVodafone += $4.cm;
 }

我使用 Bison 和 Flex 并编译:“bison -d -y example.y”、“flex example.l”和“gcc lex.yy.c y.tab.c -ll -lm”。

谢谢你。

4

1 回答 1

2

为什么你有$2.t0and$4.cm而不是$2and $4

%type <t0> OPERADORA语句告诉 Bison 该OPERADORA值包含t0在联合成员中,因此 Bison$2在为操作定义生成的最终代码中用于替换的表达式ServicioSMS将自动引用该t0成员。因此,您的$2.t0遗嘱最终会<union>.t0.t0出现错误。lex.yy.c如果您检查Bison 生成的文件,您应该能够看到这一点。

同样对于$4.cm,这将最终为<union>.cm.cm,另一个错误。

因此,删除Bison 文件的操作定义中的那些无关紧要.t0和后缀,然后运行新的构建。.cmServicioSMS

于 2012-05-28T18:53:26.450 回答