Friday, October 05, 2007

ANÁLISIS LÉXICO

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.





+,-,*,/,^ = 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





fdc = fin de cadena
error = 0
aceptar = 8






Analizador léxico en lenguaje C basado en la tabla transiciones

/***********************************************************************************

WALDO CHARRIS FONTALVO


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> --> λ

1 comment:

Sir Edward said...

Muy bien implementado el analisis lexico de una expresion aritmetica. Muy pùlcro el codigo en cuando al standar del los estados. Ahora seria conveniente mejorarlo permitiendo la insercion de parentesis para poder analizar cualquier expresion aritmetica en inorden.