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?