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ステートメントは、OPERADORA値がt0共用体のメンバーに含まれていることを Bison に伝えます。そのため、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 に答える