•
Automa a stati finiti che riconosce il linguaggio
{a*bc+d}
Grammatica
Sà aS|bB
Bà cC
Cà cC|dD
Dàε
q2 |
q1 |
q3 |
q4 |
q6 |
q7 |
q8 |
q5 |
a |
b |
c |
c |
d |
Tutti gli altri
caratteri |
Tutti gli altri
caratteri |
Tutti gli altri
caratteri |
Tutti gli altri
caratteri |
Stati di Errori |
//Semplice analizzatore lessicale per stringhe del tipo
{a*bc+d}
#include <stringa.h>
main()
{
bool fine=false;
while (!fine)
{
cout<<"Inserisci stringa da riconoscere (max 24 caratteri)"<<endl<<endl;
char st[24];
cin>>st;
Stringa<24> str(st);
cout<<str<<endl<<endl;
int i=1;
int q=0;
bool finito=false;
bool riconosciuto=false;
while (!finito && !riconosciuto)
{
switch (q)
{case 0:
if (str[i]=='a')
i++;
else if (str[i]=='b')
{i++; q=1;}
else q=5;
break;
case 1:
if (str[i]=='c')
{i++; q=2;}
else q=6;
break;
case 2:
if (str[i]=='c')
i++;
else if(str[i]=='d')
{i++; q=3;}
else q=7;
break;
case 3:
if (str[i]=='\0')
riconosciuto=true;
else
q=8;
break;
case 5:
cout<<"carattere non ammesso o mancanza di una 'b'"<<endl<<endl;
finito=true;
break;
case 6:
cout<<"carattere non ammesso o mancanza di almeno una 'c'"<<endl<<endl;
finito=true;
break;
case 7:
cout<<"carattere non ammesso o mancanza di una 'd'"<<endl<<endl;
finito=true;
break;
case 8:
cout<<"eccedenza"<<endl<<endl;
finito=true;
break;
}
}
if (riconosciuto)
cout<<endl<<endl<<"Stringa esatta!"<<endl<<endl;
char r;
risposta:
cout<<"vuoi riconoscere un'altra stringa? (s/n)"<<endl;
cin>>r;
if (r=='s')
fine=false;
else if(r=='n')
fine=true;
else goto risposta;
}
}
•