Resultados 1 al 5 de 5

Tema: Analizador Lexico en C++

  1. #1 Analizador Lexico en C++ 
    Avanzado
    Fecha de ingreso
    Apr 2003
    Mensajes
    173
    Descargas
    0
    Uploads
    0
    Buenas a tod@s, os planteo una pregunta a ver si podemos entre tod@s solucionarlo.
    http://ixtchel.cs.buap.mx/~guerrero/valar/anlex.cpp
    Muestra el codigo de un analizador lexico para C#, solo con ver la asignacion de las matrices uno se asusta, alguien que domine el tema ¿puede explicar un poco como plantear esa logica para el autómata? o algun manual explicado para Bobos (incluido yo) Intento seguirlo pero no comprendo nada y estoy seguro que solo es pillarle el truco.
    Muchas gracias
    No hay 2 sin 3, siguiendo lo conseguire
    Citar  
     

  2. #2  
    Medio
    Fecha de ingreso
    Jan 2006
    Mensajes
    98
    Descargas
    0
    Uploads
    0
    Saludos,

    Para implementar una analizador lexico sin utilizar flex por ejemplo, a través de los automatas, existen dos métodos bastante sencillos:
    • Método de los Switch
    • Método de la tabla


    En ambos casos para C++ tienes que crear una clase automata. La clase debe recibir una lista de elementos del alfabeto a analizar, el conjunto de estados posibles, las transiciones posibles, el estado inicial y el conjunto de estados finales.

    Dentro debes tener un método para comprobar una determinada entrada que funcionará con alguno de los métodos anteriores.

    En caso de que lo quieras hacer, como tu dices, la lista de elementos del alfabeto la recibirás de la entrada estándar o la leeras de un fichero.

    Tengo una implementanción que hemos usado en la Universidad en sus tiempos, que es un "método sucio y rápido" y también tengo algunos ejemplos para autómatas con ambos métodos mencionados (pero no para el lenguje C/C++ sino para un lenguaje de ejemplo).

    Saludos
    Prvo nauci milslit, poslije programiraj.
    Citar  
     

  3. #3  
    Moderador HH
    Fecha de ingreso
    Mar 2003
    Ubicación
    Galiza
    Mensajes
    3.919
    Descargas
    8
    Uploads
    1
    http://ixtchel.cs.buap.mx/~guerrero/valar/anlex.cpp
    Muestra el codigo de un analizador lexico para C#,
    No es C#, es código C++ (aunque también lo puedes compilar con un compilador de C puro ya que no utiliza ninguna construcción propia de C++)... la confusión se debe a que ya hace unos años algunos autores empezaron a usar # en lugar de ++ ya que las almoadilla no deja de ser 2 cruces...
    Un Saludo
    He conocido muchos dioses. Quien niegue su existencia está tan ciego como el que confía en ellos con una fe desmesurada. Robert E. Howard
    La suerte ayuda a la mente preparada.
    Citar  
     

  4. #4  
    Avanzado
    Fecha de ingreso
    Apr 2003
    Mensajes
    173
    Descargas
    0
    Uploads
    0
    Cita Iniciado por Polimeron Ver mensaje
    Saludos,


    Tengo una implementanción que hemos usado en la Universidad en sus tiempos, que es un "método sucio y rápido" y también tengo algunos ejemplos para autómatas con ambos métodos mencionados (pero no para el lenguje C/C++ sino para un lenguaje de ejemplo).

    Saludos
    Podrias hacerme llegar esas implementaciones?

    Muchas gracias a ambos por las contestaciones
    No hay 2 sin 3, siguiendo lo conseguire
    Citar  
     

  5. #5  
    Medio
    Fecha de ingreso
    Jan 2006
    Mensajes
    98
    Descargas
    0
    Uploads
    0
    Saludos,

    Bueno pues aquí tienes el primer métodos, que es un ejemplo de un analizador hecho a mano pero me equivoqué, es también un ejemplo, no para C++ concreto, pero lo puedes extender y/o modificar. Este está implementado en C.

    __________________________________________________ _________________________
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>

    /* Son los tokens que reconocerá el analizador */
    enum {FIN = 0, ID = 256, NUM, FOR, IF, THEN, ELSE, INT, WHILE};

    char buffer[500];
    char * yytext;
    char * p;
    int yyleng;

    #define MAXIMO 6
    struct {
    char * nombre;
    int * token;
    } tabla[MAXIMO] = {"for", FOR, "if", IF, "then", THEN, "else", ELSE, "int", INT, "while", WHILE};

    int yylex(void);

    int main() {
    int t;
    printf("Comienza el programa\n");
    while ((t=yylex()) != FIN)
    switch(t) {
    case NUM: printf("Numero '%s' de %d digitos\n", yytext, yyleng);
    break;
    case ID: printf("ID '%s' de %d caracteres\n", yytext, yyleng);
    break;
    case FOR:
    case IF:
    case THEN:
    case ELSE:
    case INT:
    case WHILE: printf("palabra resultante '%s' de %d caracteres\n", yytext, yyleng);
    break;
    default: printf("Es el caracter '%c'\n",t);
    break;
    }
    return EXIT_SUCCESS;
    }


    int yylex(void)
    {
    int c;
    /*Filtramos los espacios*/
    while((c=getchar()) == ' ' || c == '\n' || c == '\t');

    if(c==EOF) return FIN;
    yytext = buffer;
    p = buffer;
    if(isdigit(c)) {
    do {
    *p = c;
    p++;
    c = getchar();
    }while(isdigit(c));
    if(c != EOF) ungetc(c,stdin);
    *p = 0;
    yyleng = p - yytext;
    return NUM;
    }
    else if (isalpha(c)) {
    int i;
    do {
    *p = c;
    p++;
    c = getchar();
    }while(isalnum(c));
    if(c != EOF) ungetc(c,stdin);
    *p = 0;
    yyleng = p - yytext;
    for(i = 0; i < MAXIMO; i++)
    if(strcmp(tabla[i].nombre, yytext) == 0)
    return tabla[i].token;
    return ID;
    }
    else return c;
    }


    __________________________________________________ _________________________
    Prvo nauci milslit, poslije programiraj.
    Citar  
     

Temas similares

  1. Analizador de archivos iptables
    Por Cypress en el foro LINUX - MAC - OTROS
    Respuestas: 0
    Último mensaje: 06-03-2015, 14:03
  2. Respuestas: 1
    Último mensaje: 03-12-2009, 19:04
  3. Analizador sintactico para compilador
    Por Yamel en el foro GENERAL
    Respuestas: 1
    Último mensaje: 30-10-2008, 02:55

Marcadores

Marcadores

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •