Salve , ho un problema con un esercizio di compilatori dove con l'uso di flex e bison devo leggere un file in input e stampare a video.
Il file di input deve essere del tipo
03-2018
&&&
Singola->70
Doppia->100
Matrimoniale->90
Tripla->130
Quadrupla->150
Suite->150
!!!
Alpitour - 3425/AT - 30 - 02 - 06 (Singola > 3 ; Doppia > 5 ; Matrimoniale > 4 Tripla > 3 ; )
Il file Flex
%{
#include <string.h>
#include <stdio.h>
#include "bison.tab.h"
int column=0;
%}
%option noyywrap yylineno
%%
. {column++; REJECT;}
[0-9]{2}[-][0-9]{4} {yylval.string = strdup(yytext);return(DATASTR);}
"&&&" {return(SEP1);}
[A-Z][A-Za-z ]* {yylval.string = strdup(yytext);return(TIP_STANZA);}
"->" {return(FR);}
[1-9][0-9]* {yylval.value = atoi(yytext);return(PREZZO);}
"!!!" {return(SEP2);}
[A-Z][A-Za-z ]* {yylval.string = strdup(yytext); return(OPERATOR);}
[0-9]{4}[/][A-Z]{2} {yylval.string = strdup(yytext); return(COD_GRUPPO);}
[1-9][0-9]* {yylval.value = atoi(yytext);return(NUM_P);}
[0-9][0-9] {yylval.value = atoi(yytext);return(G_INIZIO);}
[0-9][0-9] {yylval.value = atoi(yytext);return(G_FINE);}
"(" {return(OPENP);}
">" {return(PA);}
[1-9][0-9]* {yylval.value = atoi(yytext);return(NUM_STANZE);}
";" {return(PVIR);}
")" {return(CLOSEP);}
"-" {return(TR);}
[ \t] {column++;}
[\n] {column = 0;}
Il file Bison
%{
#include <stdio.h>
#include <stdlib.h>
//#include "symb_tab.c"
extern FILE *yyin;
extern int yylineno;
extern int column;
int yylex();
char *fileName;
void yyerror(const char *);
%}
%union
{
char *string;
int value;
}
%start Input
%token SEP1 FR PVIR OPENP CLOSEP PA TR SEP2
%token <string> OPERATOR TIP_STANZA COD_GRUPPO DATASTR
%token <value> NUM_STANZE G_INIZIO G_FINE NUM_P PREZZO
%error-verbose
%%
Input: Data SEP1 Sect1 SEP2 Sect2
;
Data: DATASTR {printf("%s\n\n",$1);}
;
Sect1: El_Stanze
;
El_Stanze: Stanza
| El_Stanze Stanza
;
Stanza: TIP_STANZA FR PREZZO {printf("%s %d\n",$1,$3);}
;
Sect2: Prenotazione
| Sect2 Prenotazione
;
Prenotazione: OPERATOR TR COD_GRUPPO TR NUM_P TR G_INIZIO TR G_FINE OPENP ListaCamere CLOSEP {printf("%s \n",$1);}
;
ListaCamere: TipoCamera
| ListaCamere TipoCamera
;
TipoCamera: TIP_STANZA TR NUM_STANZE PVIR {printf("%s %d\n",$1,$3);}
;
%%
int main(int argc, char *argv[])
{
if(argc>0)
yyin = fopen(argv[1], "r");
else
yyin = stdin;
yyparse();
//void freeTable();
return 0;
}
// funzione di errore che stampa le informazioni associate
// come file di input, numero di riga, numero di colonna,
// e tipo di errore generato dalla direttavia %error-verbose
void yyerror(char const *error) {
fprintf(stderr, "\n%s:%d:%d: %s \n", fileName, yylineno, column, error);
}
Il problema è che mi stampa solo la prima sezione.
Qualcuno può aiutarmi??
Allegati: