私は自分の質問に対する答えを探していましたが、誰も私の問題を解決してくれません。
これは私の本当に単純な 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」でコンパイルします。
ありがとうございました。