int scan() { enum{ QO, Q1, Q2, Qp }stato; int i, j; boolean riconosciuto=0, lookahead=1; stato=Q0; do { switch(stato) //valuta lo stato di transizione attuale { case Q0: //se lo stato č Q0 if(ch==EOF) riconosciuto=1; //esce dal ciclo per come se avesse riconosciuto //la stringa, oppure puoi mettere una printf per //dire che il file č terminato else if(isalpha(ch)) stato=S1; //si transita nello stato S1 //in ogni altro caso caso si ignora il carattere //e si ricomincia l'analisi con il successivo break; case Q1: if(ch=='_') stato=Q2; //si transita nello stato Q2 else if(!isalnum(ch)) { lookahead=0; riconosciuto=1; //cioč prende per buono tutto quello che ha analizzato in precedenza //e lascia il resto al vaglio del successivo ciclo di analisi } break; case Q2: if(!isalnum(ch)) stato=Q1; //si ritorna nello stato Q1 else { lookahead=0; riconosciuto=1; //cioč prende per buono tutto quello che ha analizzato in precedenza //e lascia il resto al vaglio del successivo ciclo di analisi } break; default: break; //questo default č perfettamente inutile, lo inserisco giusto per ordine :-) } //fine del switch if (lookahead) ch=leggi(); }//fine del ciclo do while if(riconosciuto); { printf("\n Stringa riconosciuta"); return 1; } else return 0; }