2012-05-28 90 views
0

我一直在尋找我的問題的答案,但沒有人解決我的問題。編譯非常簡單的Lex/Yacc文件時出錯

這是我非常簡單的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); 
} 

這是我萊克斯文件:

%{ 
#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; 
} 

我用野牛和Flex與編譯: 「野牛-d -y example.y」, 「柔性example.l」 和「海灣合作委員會法。 yy.c y.tab.c -ll -lm「。

謝謝。

回答

2

爲什麼你有$2.t0$4.cm而不是隻有$2$4

%type <t0> OPERADORA語句告訴野牛該OPERADORA值在聯合的t0構件攜帶,使得野牛使用表達式來在用於ServicioSMS動作定義將自動指的是t0構件生成的最終的代碼替換$2。您的$2.t0因此將最終爲<union>.t0.t0,這是一個錯誤。如果您檢查由Bison生成的lex.yy.c文件,您應該能夠看到此內容。

$4.cm類似,最終結果爲<union>.cm.cm,另一個錯誤。

因此,請刪除Bison文件的ServicioSMS操作定義中無關的後綴.t0.cm後綴,然後運行全新構建。

+0

謝謝!我還有一個錯誤,因爲我沒有寫'yyerror'函數。我已經添加了它,現在...它的工作原理! – baister