| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
yonicm
Registrado: 10 Jun 2010 Mensajes: 1
| Publicado: 10/06/2010 10:00 am | | | Título: Ayuda con mi analizador lexico |
| hola soy nuevo en este foro, estoy haciendo un analizador lexico y un sintactico que verifique si una url esta bien escrita o no, el punto es que no se que me falta para que mi lex pueda funcionar correctamente, les colocare el codigo...espero me puedan ayudar.
%option noyywrap
%{ #include<stdio.h> #include<stdlib.h> #include<string.h> %}
/******************************DEFINICION DE TOKENS******************************************/
HTTP (http) FTP (ftp) HTTPS (https) LDAP (ldap) DIAG ("/") DOSPUNTOS (":") PUNTO (".") LETRA [A-Za-z] DIGITO [0-9] INTERROGA ("?") IGUAL ("=") GUION_MAY ("_") GUION_MEN ("-") PAREN_ABIERTO ("(") PAREN_CERRADO (")") AMPERSON ("&") ASTERISCO ("*") MAS ("+") CADENA ({LETRA}|{DIGITO}|{GUION_MAY}|{GUION_MEN})+ DOMINIO {CADENA}({PUNTO}{CADENA})*({DOSPUNTOS}{DIGITO}+)*(({DIAG}({CADENA}|{DIGITO}|{PUNTO}|{INTERROGA}|{IGUAL}|{GUION_MAY}|{GUION_MEN}|{PAREN_ABIERTO}|{PAREN_CERRADO}|{AMPERSON}|{ASTERISCO}|{MAS})*)* PROTOCOLO {HTTP}|{FTP}|{HTTPS}|{LDAP} URL {PROTOCOLO}{DOSPUNTOS}{DIAG}{DIAG}{DOMINIO}
%%
URL {printf("%s es una url valida",yytext);} . {printf("%s no es una url valida",yytext);}
%%
int main(int argc, char *argv[]) { system("clear"); yyin = fopen(argv[1],"r"); yylex(); fclose(yyin); return 0; } |
| | Volver arriba | |  | EriOsMurrugarra
Registrado: 02 Ago 2010 Mensajes: 5
| Publicado: 02/08/2010 6:48 pm | | | Título: Re: Ayuda con mi analizador lexico |
| hola .. mira la manera mas facil seria asi...
programa tu mismo tu analizador lexico. deja el LEX que es para niños luego has que tu analizador sisntactico llame al analizador lexico cada vez que necesitas un token para hacer el analisis con otro Token.
si lo estas haciendo en C/C++
lo mejor seria tener definido un archivo de cabecera .h con todas los valores de los tokens ej: #define FTP 200 #define HTTP 201 asi sucesivamente
luego dos ficheros analex.cpp y analsi.cpp ( analizador lexico y sintactico) y realizas las operaciones
es la manera mas facil y mas rapida de hacerlo.. ademas el analisis sintactico has que sea predictivo y descendente
escribeme a mi mail si tienes problemas
tengo un lenguaje de programacion que he creado desde que tengo 18 años ( ahora tengo 19 jeje) puedes verlo si gustas
http://www.taringa.net/posts/linux/4841168/Lenguaje-de-Programacion-JF-(JFranchesca).html
en esa URL es 100% original , mi creacion y kiero compartirla contigo  |
| | Volver arriba | |  | polly
Registrado: 19 Jul 2007 Mensajes: 618
| Publicado: 03/08/2010 3:58 am | | | Título: |
| hey EriOsMurrugarra, me he descargado tu programa , pero no veo el codigo fuente. Podrias subirlo?? _________________ enrmarc |
| | Volver arriba | |  | | EriOsMurrugarra
Registrado: 02 Ago 2010 Mensajes: 5
| Publicado: 04/08/2010 7:18 pm | | | Título: |
| Hola. Thanks por bajarlo. el codigo fuenten no lo he incluido porque mi software no es libre. estoy programando una version libre.
puedes usar esto para tu problema:
define una clase llamada token la cual tenga como atributos
class Token{ char * lexema; int valor;
// sus setters u getters para cada atributo };
---------------------
en un archivo llamado tabladesimbolos.cpp
crea un arreglo que contenga a cada uno de los tipos de servicio como FTP, HTTP
osea
Token tabla[] = { new Token("FTP", 100), new Token("HTTP", 101), .... };
----------------------------------------------------
luego un analizador lexico.cpp
// getcaracter obtiene caracteres desde un fichero o variable de tipo char*
int gettoken() { while(true) { c = getcaracter(); if ( isalpha(c)) { char temp[20]; int i = 0; do { temp[i] = c; c = getcaracter();
}while(islpha(c));
temp[i] = '\0';
//aqui verficas si esta en la lista de servicios en tu tabla
// si esta en la tabla retorna el valor del token // sino un -1 . logicamente tienes que programar la funcion EstaEnTabla return EstaEnTabla(temp);
}
} }
--------------------------------
luego tu analizador sintactico.cpp
int token;
void Test(int siguiente){ if ( token == siguiente) token = gettoken(); // esta en analisislexico.cpp else cout<<"Error"; }
void analisis(){
token = gettoken(); switch(token) { case FTP: Test(FTP); break; case HTTP: Test(HTTP); break; ..... }
} // tienes que poner todos los posibles simbolos a aparecer los cuales van en el analizador lexico como el punto
---------------------- espero te sirva .. ah! para saber si esta bien solo basta poner en la condicion del Test en la parte de else Error = true;
cosa que la funcion retorne un -1 para que sepas k esta bien o no
... escribeme si te resulto... este es mi mail : |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |