>hola a todos!
> alguno de ustedes sabe como realizar un programa de automatas finito 
> >deterministico, con tablas de transicion, utilizando el diagrama de Moore. 
> por >favor!!
>
>de antemano gracias por su ayuda.
> saludos!!


Hola maria, recuerdo que cuando curse la materia teoria de
compiladores, habia que hacer algo en c de analixadores lexicos,
sintacticos, etc

Te adjunto un fuente de analizador lexico que ue podría ser aproximado
o adaptado al diagrama de transición que construiríamos para la
expresión de un analizador lexico.

Te adjunto este pdf que esta bueno, especialmente en la pag 22
http://www.um.edu.ar/catedras/20353e7/document/An%e1lisis_L%e9xico.pdf


El segundo argumento es un arhivo  txt de la forma:
5
+
5
-
1
/
8

Suerte !

/******** alexico.c ****************

#include <stdio.h>

#include <ctype.h>

#include <stdlib.h>

#include <string.h>

/*Estructura donde se guardara el tipo de lexema encontrado y su valor*/

struct lexema{

        /*tipo toma: NUM, IDE o SIM segun corresponda*/

        char *tipo;

        /*si es un SIM, valor es 0;*/

        char *valor;

};



/* Variable global para indicar desde que posicion se debe

 * buscar el proximo lexema dentro del archivo fuente*/

long posicion=0;

char sim[]={'+','-','*','/','%','$','\0'};

/*funcion que indica si c es un simbolo o no*/

int issimbol(int c,char *sim);



/* Funcion analizadorlexico devulve un elemento de la estructura
lexema si tiene exito, y

 * si no devuelve NULL*/

struct lexema *analizadorlexico(FILE *fsource){

        int c;

        int state;

        int TAM_VAL;

        

        /*posicion dentro del valor de un lexema*/

        int pos;

        static struct lexema lex;

        

        TAM_VAL=32;

        lex.valor=(char *)calloc(TAM_VAL,sizeof(char));

        lex.tipo=(char *)calloc(4,sizeof(char));

        if(fseek(fsource,posicion,SEEK_SET)!=0){

                fprintf(stderr,"Error en posicion inicial\n");

                exit(1);        

        }

        /*lee el primer caracter del archivo fuente desde el indicador de 
posicion,

         * e indica si toma la rama de ID o NUM*/

        state=0;

        pos=-1;

        while(!feof(fsource)){

                switch(state){

                        case 0:

                                if((c=fgetc(fsource))<0){

                                        return NULL;

                                }

                                posicion++;

                                if(isalnum(c)){

                                        if(isdigit(c)){

                                                pos++;

                                                if(pos<TAM_VAL){

                                                        lex.valor[pos]=c;

                                                }

                                                else{

                                                        fprintf(stderr,"Tamaño 
de lexema incorrecto\n");

                                                        return NULL;

                                                }

                                                state=4;

                                        }

                                        else if(isalpha(c)){

                                                if(pos<=TAM_VAL){

                                                        pos++;

                                                        lex.valor[pos]=c;

                                                }

                                                else{

                                                        fprintf(stderr,"Tamaño 
de lexema incorrecto\n");

                                                        return NULL;

                                                }

                                                state=1;

                                        }

                                }

                                else if(c=='\t'||c==' '||c=='\n'){

                                        state=0;

                                }

                                else if(issimbol(c,sim)){

                                        lex.tipo[0]=c;

                                        strcpy(lex.valor,"0");

                                        state=10;

                                }

                                else{

                                        fprintf(stderr,"Error Lexico\n");

                                        return NULL;

                                }

                                break;

                        case 1:

                                /*state 3*/     

                                /*state 2*/     

                                /*state 10*/    

                                if((c=fgetc(fsource))<0){

                                        return NULL;

                                }

                                posicion++;

                                if(isalnum(c)){

                                        /*Rama state 3*/

                                        if(isdigit(c)){

                                                pos++;

                                                if(pos<TAM_VAL){                

                                                        lex.valor[pos]=c;

                                                }

                                                else{

                                                        fprintf(stderr,"Tamaño 
de lexema incorrecto\n");

                                                        return NULL;

                                                }

                                                state=3;

                                        }

                                        else if(isalpha(c)){

                                                pos++;

                                                if(pos<=TAM_VAL){

                                                        lex.valor[pos]=c;

                                                }

                                                else{

                                                        fprintf(stderr,"Tamaño 
de lexema incorrecto\n");

                                                        return NULL;

                                                }

                                                state=2;

                                        }

                                }

                                else if(c=='\t'||c==' '||c=='\n'){

                                        state=12;

                                }

                                else if(issimbol(c,sim)){

                                        strcpy(lex.tipo,"IDE");

                                        state=10;

                                        posicion--;

                                }

                                else{

                                        fprintf(stderr,"Error en dramática del 
lexema\n");

                                        return NULL;

                                }

                                break;

                        case 2:

                                /*state 3*/

                                /*state 2*/

                                /*state 10*/

                                if((c=fgetc(fsource))<0){

                                        return NULL;

                                }

                                posicion++;

                                if(isalnum(c)){

                                        if(isdigit(c)){

                                                pos++;

                                                if(pos<TAM_VAL){

                                                        lex.valor[pos]=c;

                                                }

                                                else{

                                                        fprintf(stderr,"Tamaño 
de lexema incorrecto\n");

                                                        return NULL;

                                                }

                                                state=3;

                                        }

                                        else if(isalpha(c)){

                                                pos++;

                                                if(pos<=TAM_VAL){

                                                        lex.valor[pos]=c;

                                                }

                                                else{

                                                        fprintf(stderr,"Tamaño 
de lexema incorrecto\n");

                                                        return NULL;

                                                }

                                                state=2;

                                        }

                                }

                                else if(c=='\t'||c==' '||c=='\n'){

                                        state=12;

                                }

                                else if(issimbol(c,sim)){

                                        strcpy(lex.tipo,"IDE");

                                        state=10;

                                        posicion--;

                                }

                                else{

                                        fprintf(stderr,"Error en dramática del 
lexema\n");

                                        return NULL;    

                                }

                                break;

                        case 3:

                                /*state 3*/     

                                /*state 2*/     

                                /*state 10*/    

                                if((c=fgetc(fsource))<0){

                                        return NULL;

                                }

                                posicion++;

                                if(isalnum(c)){

                                        if(isdigit(c)){

                                                pos++;

                                                if(pos<TAM_VAL){

                                                        lex.valor[pos]=c;

                                                }

                                                else{

                                                        fprintf(stderr,"Tamaño 
de lexema incorrecto\n");

                                                        return NULL;

                                                }

                                                state=3;

                                        }

                                else if(isalpha(c)){

                                                pos++;

                                                if(pos<=TAM_VAL){               
                        

                                                        lex.valor[pos]=c;

                                                }

                                                else{

                                                        fprintf(stderr,"Tamaño 
de lexema incorrecto\n");

                                                        return NULL;

                                                }

                                                state=2;

                                        }

                                }       

                                else if(c=='\t'||c==' '||c=='\n'){

                                        state=3;

                                }       

                                else if(issimbol(c,sim)){

                                        strcpy(lex.tipo,"IDE");

                                        state=10;

                                        posicion--;

                                }

                                else{

                                        fprintf(stderr,"Error en dramática del 
lexema\n");

                                        return NULL;    

                                }

                                break;

                        

                        case 4: 

                                /*state 4*/

                                /*state 5*/

                                /*state 7*/

                                /*state 10*/

                                if((c=fgetc(fsource))<0){

                                        return NULL;

                                }

                                posicion++;

                                if(isdigit(c)){

                                        pos++;

                                        if(pos<TAM_VAL){                        
                

                                                lex.valor[pos]=c;

                                        }

                                        else{

                                                fprintf(stderr,"Tamaño de 
lexema incorrecto\n");

                                                return NULL;

                                        }

                                        state=4;

                                }

                                else if(c=='.'){

                                        pos++;

                                        if(pos<=TAM_VAL){

                                                lex.valor[pos]=c;

                                        }

                                        else{

                                                fprintf(stderr,"Tamaño de 
lexema incorrecto\n");

                                                return NULL;

                                        }

                                        state=5;

                                }

                                else if(c=='E'){

                                        pos++;

                                        if(pos<=TAM_VAL){

                                                lex.valor[pos]=c;

                                        }

                                        else{

                                                fprintf(stderr,"Tamaño de 
lexema incorrecto\n");

                                                return NULL;

                                        }

                                        state=7;

                                }

                                else if(c=='\t'||c==' '||c=='\n'){

                                        state=11;

                                }       

                                else if(issimbol(c,sim)){

                                        strcpy(lex.tipo,"NUM");

                                        state=10;

                                        posicion--;

                                }

                                else{

                                        fprintf(stderr,"Error posicion %ld 
(state=8)\n",posicion);

                                        return NULL;    

                                }

                                break;

                        case 5:

                                /*state 6*/

                                /*state 5*/

                                if((c=fgetc(fsource))<0){

                                        return NULL;

                                }

                                posicion++;

                                if(isdigit(c)){

                                        pos++;

                                        if(pos<=TAM_VAL){

                                                lex.valor[pos]=c;

                                        }

                                        else{

                                                fprintf(stderr,"Tamaño de 
lexema incorrecto\n");

                                                return NULL;

                                        }

                                        state=6;

                                }

/*                              else if(c=='\t'||c==' '){

                                        state=5;

                                }               

*/

                                else{

                                        fprintf(stderr,"Error posicion %ld 
(state=5)\n",posicion);

                                        return NULL;

                                }

                        case 6:

                                /*state 6*/

                                /*state 7*/

                                /*state 10*/

                                if((c=fgetc(fsource))<0){

                                        return NULL;

                                }

                                posicion++;

                                if(isdigit(c)){

                                        pos++;

                                        if(pos<TAM_VAL){

                                                lex.valor[pos]=c;

                                        }

                                        else{

                                                fprintf(stderr,"Tamaño de 
lexema incorrecto\n");

                                                return NULL;

                                        }

                                        state=6;

                                }

                                else if(c=='E'){

                                        pos++;

                                        if(pos<=TAM_VAL){

                                                lex.valor[pos]=c;

                                        }

                                        else{

                                                fprintf(stderr,"Tamaño de 
lexema incorrecto\n");

                                                return NULL;

                                        }

                                        state=7;

                                }

                                else if(c=='\t'||c==' '||c=='\n'){

                                        state=11;

                                }       

                                else if(issimbol(c,sim)){

                                        strcpy(lex.tipo,"NUM");

                                        state=10;

                                        posicion--;

                                }

                                else{

                                        fprintf(stderr,"Error posicion %ld 
(state=8)\n",posicion);

                                        return NULL;    

                                }

                                break;  

                        case 7:

                                /*state 8*/

                                /*state 9*/

                                if((c=fgetc(fsource))<0){

                                        return NULL;

                                }

                                posicion++;

                                if(isdigit(c)){

                                        pos++;

                                        if(pos<TAM_VAL){

                                                lex.valor[pos]=c;

                                        }

                                        else{

                                                fprintf(stderr,"Tamaño de 
lexema incorrecto\n");

                                                return NULL;

                                        }

                                        state=9;

                                }

                                else if(c=='+'||c=='-'){

                                        pos++;

                                        if(pos<=TAM_VAL){

                                                lex.valor[pos]=c;

                                        }

                                        else{

                                                fprintf(stderr,"Tamaño de 
lexema incorrecto\n");

                                                return NULL;

                                        }

                                        state=8;

                                }

                                else{

                                        fprintf(stderr,"Error posicion %ld 
(state=7)\n",posicion);

                                        return NULL;

                                }

                                break;  



                        case 8:

                                /*state 9*/

                                if((c=fgetc(fsource))<0){

                                        return NULL;

                                }

                                posicion++;

                                if(isdigit(c)){

                                        pos++;

                                        if(pos<TAM_VAL){

                                                lex.valor[pos]=c;

                                        }

                                        else{

                                                fprintf(stderr,"Tamaño de 
lexema incorrecto\n");

                                                return NULL;

                                        }

                                        state=9;

                                }

                                else{

                                        fprintf(stderr,"Error posicion %ld 
(state=8)\n",posicion);

                                        return NULL;    

                                }

                                break;  

                                

                        case 9:         

                                /*state 9*/

                                /*state 10*/

                                if((c=fgetc(fsource))<0){

                                        return NULL;

                                }

                                posicion++;

                                if(isdigit(c)){

                                        pos++;

                                        if(pos<TAM_VAL){

                                                lex.valor[pos]=c;

                                        }

                                        else{

                                                fprintf(stderr,"Tamaño de 
lexema incorrecto\n");

                                                return NULL;

                                        }

                                        state=9;

                                }

                                else if(c=='\t'||c==' '||c=='\n'){

                                        state=11;

                                }

                                else if(issimbol(c,sim)){

                                        strcpy(lex.tipo,"NUM");

                                        state=10;

                                        posicion--;

                                }

                                else{

                                        fprintf(stderr,"Error posicion %ld 
(state=8)\n",posicion);

                                        return NULL;    

                                }

                                break;  

                        case 10:

                                return &lex;

                        case 11:

                                if((c=fgetc(fsource))<0){

                                        return NULL;

                                }

                                posicion++;

                                if(c=='\t'||c==' '){

                                        state=11;

                                }

                                else if(issimbol(c,sim)){

                                        strcpy(lex.tipo,"NUM");

                                        state=10;

                                        posicion--;

                                }

                                else{

                                        fprintf(stderr,"Error posicion %ld 
(state=8)\n",posicion);

                                        return NULL;    

                                }

                                break;

                        case 12:

                                if((c=fgetc(fsource))<0){

                                        return NULL;

                                }

                                posicion++;

                                if(c=='\t'||c==' '){

                                        state=12;

                                }

                                else if(issimbol(c,sim)){

                                        strcpy(lex.tipo,"IDE");

                                        state=10;

                                        posicion--;

                                }

                                else{

                                        fprintf(stderr,"Error posicion %ld 
(state=8)\n",posicion);

                                        return NULL;

                                }

                                break;

                }

        }       

        return NULL;

}

/*Funcion mostrar lexema muestra el contenido de un elemento de la
estructura lexema*/

void mostrarlexema(struct lexema *lex){

        fprintf(stdout,"<%s,%s>\n",lex->tipo,lex->valor);

}

int issimbol(int c,char *sim){

        int i;

        

        i=0;

        while(sim[i]!='\0'){

                if(c==sim[i])

                        return 1;

                i++;

        }

        return 0;

}

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

int main(int argc, char *argv[]){

        

        /*Archivo del codigo fuente */

        FILE *fsrc;

        char namefile[64];

        struct lexema *lex;



        memset(namefile,0,64);  

        if(argc!=2){

                fprintf(stderr,"Forma de uso: #./analizadorlex <File Source>");

                exit(1);

        }

        strcpy(namefile,argv[1]);

        if((fsrc=fopen(namefile,"r"))==NULL){

                fprintf(stderr,"Error al abrir el archivo %s\n",namefile);

                exit(1);

        }

        while((lex=analizadorlexico(fsrc))!=NULL){

                        mostrarlexema(lex);

        }

        return 0;

}


-- 
/*  Leonardo Rios
*   rios[dot]lj[at]gmail[dot]com
*/

_______________________________________________
Lista de correo Programacion.
[email protected]
http://listas.fi.uba.ar/mailman/listinfo/programacion

Responder a