[RISOLTO]Flex/Bison

di il
2 risposte

[RISOLTO]Flex/Bison

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:
26321_22acb58b540a2a35d2a5736f82fadabe.png
26321_22acb58b540a2a35d2a5736f82fadabe.png

2 Risposte

  • Re: [RISOLTO]Flex/Bison

    RIVEDI la sintassi e la grammatica: ci sono UN SACCO DI ERRORI!

    Controlla BENE i warning dei tool.

    Sei in quella situazione che si chiama: "funziona per sbaglio" (quando funziona)
  • Re: [RISOLTO]Flex/Bison

    Il problema è che non riesco a vedere gli errori per quante volte lo rilegga , potresti aiutarmi e dirmi quali errori vedi?
Devi accedere o registrarti per scrivere nel forum
2 risposte