PDA

Ver la versión completa : Analizador Lexico en C++



Deskicio
02-04-2008, 12:48
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

Polimeron
02-04-2008, 13:54
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

gondar_f
02-04-2008, 16:04
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

Deskicio
02-04-2008, 19:01
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

Polimeron
03-04-2008, 09:33
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;
}


__________________________________________________ _________________________