Compiler errors &引用;不是结构或联盟的东西;编译非常简单的Lex/Yacc文件时出错

Compiler errors &引用;不是结构或联盟的东西;编译非常简单的Lex/Yacc文件时出错,compiler-errors,bison,yacc,lex,flex-lexer,Compiler Errors,Bison,Yacc,Lex,Flex Lexer,我一直在为我的问题寻找答案,但没有人能解决我的问题 这是我真正简单的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 NUMER

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

这是我真正简单的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);
}
我使用Bison和Flex,并使用“Bison-d-y-example.y”、“Flex-example.l”和“gcc-lex.yy.cy.tab.c-ll-lm”进行编译


谢谢。

为什么你只有
$2.t0
$4.cm
而不是
$2
$4

%type OPERADORA
语句告诉Bison,
OPERADORA
值携带在联盟的
t0
成员中,因此,Bison在为
ServicioSMS
操作定义生成的最终代码中用于替换
$2
的表达式将自动引用该
t0
成员。因此,您的
$2.t0
将以
.t0.t0
结束,这是一个错误。如果检查Bison生成的
lex.yy.c
文件,您应该能够看到这一点

类似地,
$4.cm
,它将以
.cm.cm
结束,这是另一个错误


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

谢谢!我又犯了一个错误,因为我没有编写'yyrerror'函数。我已经添加了它,现在。。。它起作用了!
%{
#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;}

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