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