/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Ayuda con mi analizador lexico

 
      Índice del Foro elrincondelc.com -> General
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
yonicm



Registrado: 10 Jun 2010
Mensajes: 1

MensajePublicado: 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

MensajePublicado: 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 Smile
Volver arriba
polly



Registrado: 19 Jul 2007
Mensajes: 618

MensajePublicado: 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

MensajePublicado: 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
      Índice del Foro elrincondelc.com -> General
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com