Diagrama de transiciones para reconocer expresiones aritméticas de longitud arbitraria que comprenden reales positivos separados por signos de suma, resta, multiplicación, división o potenciación.




external image automata.bmp

+,-,*,/,^ = operación
+,- = signo
digito = 0 a 9

Analizador léxico en lenguaje C a partir del diagrama de transiciones anterior

**/***********************************************************************************
WALDO CHARRIS FONTALVO
ing.waldichar@gmail.com
UNIVERSIDAD DEL MAGDALENA
************************************************************************************/
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
 
main (){
 
clrscr();
int estado =1;
char sb;
cout<<endl<<"digite una expresion aritmetica"<<endl<<endl<<endl;
 
do{
sb=getchar();
switch(estado){
case1:
 
if(sb=='0' sb=='1' sb=='2'sb=='3'sb=='4'sb=='5'sb=='6'
sb=='7'sb=='8'sb=='9')
estado=2;
else if(sb!='\n')
estado=8;
break;
case 2:
if(sb=='0'sb=='1'sb=='2'sb=='3'sb=='4'sb=='5'sb=='6'
sb=='7'sb=='8'sb=='9')
estado=2;
else if(sb=='.')
estado=3;
else if(sb=='e'sb=='E')
estado=5;
else if(sb=='+'sb=='-'sb=='*'sb=='/')
estado=1;
else if(sb!='\n')
estado=8;
break;
case 3:
if(sb=='0'sb=='1'sb=='2'sb=='3'sb=='4'sb=='5'sb=='6'
sb=='7'sb=='8'sb=='9')
estado=4;
else if(sb!='\n')
estado=8;
break;
case 4:
if(sb=='0'sb=='1'sb=='2'sb=='3'sb=='4'sb=='5'sb=='6'
sb=='7'sb=='8'sb=='9')
estado=4;
else if(sb=='e'sb=='E')
estado=5;
else if(sb=='+'sb=='-'sb=='*'sb=='/')
estado=1;
else if(sb!='\n')
estado=8;
break;
case 5:
if(sb=='0'sb=='1'sb=='2'sb=='3'sb=='4'sb=='5'sb=='6'
sb=='7'sb=='8'sb=='9')
estado=7;
else if(sb=='+'sb=='-')
estado=6;
 
else if(sb!='\n')
estado=8;
break;
case 6:
if(sb=='0'sb=='1'sb=='2'sb=='3'sb=='4'sb=='5'sb=='6'
sb=='7'sb=='8'sb=='9')
estado=7;
else if(sb!='\n')
 
estado=8;
break;
case 7:
if(sb=='0'sb=='1'sb=='2'sb=='3'sb=='4'sb=='5'sb=='6'
sb=='7'sb=='8'sb=='9')
estado=7;
else if(sb=='+'sb=='-'sb=='*'sb=='/')
estado=1;
else if(sb!='\n')
estado=8;
break;
}
}while(sb!='\n');
if(estado==2estado==4estado==7)
cout<<endl<<endl<<"la expresion es aceptada";
else
cout<<endl<<endl<<"la expresion no es aceptada";
getch();
}
 
}**



Tabla de transiciones a partir del diagrama anterior

external image transiciones.bmp

fdc = fin de cadena
error = 0
aceptar = 8
Analizador léxico en lenguaje C basado en la tabla transiciones


/***
WALDO CHARRIS FONTALVO
waldichar@gmail.com
UNIVERSIDAD DEL MAGDALENA
***/
 
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
 
#define digito 1
#define operacion 2
#define punto 3
#define signo 4
#define E 5
#define fdc 6
#define error 0
#define aceptar 8
 
int mtrans[8][7]={0};
 
void initmtrans(){
mtrans[1][1]=2;
mtrans[2][1]=2;
mtrans[2][2]=1;
mtrans[2][3]=3;
mtrans[2][5]=5;
mtrans[2][6]=8;
mtrans[3][1]=4;
mtrans[4][1]=4;
mtrans[4][2]=1;
mtrans[4][5]=5;
mtrans[4][6]=8;
mtrans[5][1]=7;
mtrans[5][4]=6;
mtrans[6][1]=7;
mtrans[7][1]=7;
mtrans[7][2]=1;
mtrans[7][6]=8;
};
 
int transicion (int estado , int entrada){
return mtrans[estado][entrada];
};
 
main () {
clrscr();
int estado=1;
char sb;
initmtrans();
int entrada;
cout<<endl<<"digite una expresion aritmetica"<<endl<<endl<<endl;
do{
sb=getchar();
switch(sb){
case '0':case '1':case '2':case '3':
case '4':case '5':case '6':case '7':
case '8':case '9':
entrada = digito;
break;
case '+':case '-':
entrada = signo;
if(estado==2estado==4estado==7)
entrada = operacion;
break;
case'*':case'/':case '^':
entrada = operacion;
break;
case '.':
entrada = punto;
break;
case 'e':case'E':
entrada = E;
break;
case '\n':
entrada = fdc;
break;
default:
estado=1;
entrada = punto;
break;
}
estado=transicion(estado,entrada);
}while(estado!=aceptar&&estado!=error);
if(estado==8)
cout<<endl<<endl<<"la expresion es aceptada";
else
cout<<endl<<endl<<"la expresion no es aceptada";
getch();
}
 


**Gramática regular que genera expresiones aritméticas de longitud arbitraria que comprenden reales positivos separados por signos de suma, resta, multiplicación, división o potenciación.

<A> --> digito <B>
<B> --> digito <B>
<B> --> operación <A>
<B> --> punto <C>
<B> --> E <E>
<B> --> λ
<C> --> digito <D>
<D> --> digito <D>
<D> --> operación <A>
<D> --> E <E>
<D> --> λ
<E> --> digito <G>
<E> --> signo <F>
<F> --> digito <G>
<G> --> digito <G>
<G> --> operación <A>
<G> --> λ