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