Salve a tutti,
essendo ancora poco pratico con Flex avrei bisogno di alcuni suggerimenti per risolvere il seguente esercizio:
"Le lettere maiuscole singole sono articoli, le lettere minuscole singole sono preposizioni. Una riga valida può cominciare solo con articoli. Il codice può contenere anche righe non valide.
Ogni riga è composta da parole separate da spazi. I sostantivi sono successioni di caratteri minuscoli che cominciano per vocale. I verbi sono successioni di cifre consecutive che cominciano per 0. Gli aggettivi sono successioni di caratteri minuscoli consecutivi che cominciano per consonante. Qualsiasi altro identificatore è non riconosciuto.
Il programma deve restituire in output un elenco degli identificatori incontrati nelle righe del file di testo di input, composto da lessema e tipo (cioè articolo, preposizione, ecc.), infine deve riportare il numero di righe valide e il numero di righe non valide."
Sono in parte riuscito a risolvere l'esercizio e scrivere il codice, ma non è completamente esatto.
Il programma così scritto funziona per tutte le righe tranne che per l'ultima, cioè quella che non contiene come ultimo carattere "\n". Alternative, soluzioni migliori?codice:%{ #include <stdio.h> int rigoOK=0, rigoKO=0; %} VOCALE {aeiou} CONSONANTE {bcdfghjklmnpqrstvwxyz} %option noyywrap %x ok ko %% ^[A-Z] { ECHO; printf(" : articolo\n"); BEGIN ok; } <ok>{VOCALE}[a-z]+ { ECHO; printf(" : sostantivo\n"); } <ok>{CONSONANTE}[a-z]+ { ECHO; printf(" : verbo\n"); } <ok>[A-Z] { ECHO; printf(" : articolo\n"); } <ok>[a-z] { ECHO; printf(" : preposizione\n"); } <ok>[ ] printf(""); <ok>\n { rigoOK++; BEGIN 0; } <ok>[a-zA-Z0-9]+ { rigoKO++; BEGIN ko; } <ko>\n BEGIN 0; <ko>. printf(""); [a-zA-Z0-9]+ printf(""); \n rigoKO++; . printf(""); %% int main( int argc, char *argv[] ) { if (argc > 1) { if ( !(yyin = fopen(argv[1], "r" )) ) { perror(argv[1]); return -1; } } yylex(); printf("OK:%d - KO:%d\n", rigoOK, rigoKO); return 0; }

Rispondi quotando