Semplice Analizatore lessicale

• Home • su • Tecniche Algoritmiche • Classificazione filtri • Semplice Analizatore lessicale • Algoritmo di Dijkstra •

 

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

 

 

• Home • su • Tecniche Algoritmiche • Classificazione filtri • Semplice Analizatore lessicale • Algoritmo di Dijkstra •