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.
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;
}
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?