:: vaLar ::

Analizador lexico

2004-07-01 · 59 Comments

La semana pasada la ocupe para una sola cosa: diseñar y programar un analizador lexico para C#. Ya lo entregue a mi profesor y parece que todo marcha bien, asi que me atrevere a publicarlo como Software Libre.

Primero que nada, hay que definir que un analizador lexico es el encargado de leer caracter por caracter de un archivo (que contenga codigo fuente escrito en algun lenguaje de programacion especifico) y construir elementos lexicos llamados Patrones que serán utilizados posteriormente por un analizador sintactico. Un patron es una pareja ordenada compuesta por un token y un lexema. Un token es el elemento lexico del lenguaje, es decir el simbolo terminal de una gramatica libre de contexto (GLC). Y por ultimo, un lexema es la secuencia de caracteres que coinciden con un token.

El siguiente, es un ejemplo del analisis lexico para el lenguaje C:

archivo_fuente.c

#include<stdio.h>
main(){
printf(”Hello world”);
}

Tras procesar el codigo con un analizador lexico, este genera los pares ordenados (Token, Lexema):

tokens.txt

Gatito, #
PalabraReservada, include
MenorQue, <
Libreria, stdio.h
MayorQue, >
PalabraReservada, main
ParentesisIzq, (
ParentesisDer, )
LlaveIzq, {
PalabraReservada, printf
ParentesisIzq, (
Texto, “Hello world”
ParentesisDer, )
PuntoYcoma, ;
LlaveDer, }

Bueno pues, para crear el analizador lexico que me pidieron en la materia de compiladores, primero tuve que hacer una lista con todas las palabras reservadas, los operadores y los simbolos empleados en C#.

Despues, hice el diagrama de un Automata Finito Determinista (AFD.jpg) para reconocer los estados finales de la gramatica.
Partiendo del estado 1 y con un caracter de entrada se determina el camino que se ha de seguir; cuando se llega a un estado de aceptacion N, se continua analizando el siguiente caracter pero comenzando nuevamente por el estado 1

Por ejemplo, partiendo del estado 1 del automata; si se lee un caracter del archivo de entrada y es un corchete izquierdo: [
En el automata, se cambia de estado o "nos movemos" al estado 55 y luego, al leer el siguiente caracter, sin importar que sea una letra, digito, simbolo, espacio en blanco, nueva linea, o cualquier otra cosa: se va al estado siguiente del automata, que es el 56; el cual está marcado como un estado de aceptacion [es cuando se crea un patron].
Despues de eso, el punto de partida es nuevamente el estado 1 y dependiendo del caracter que se lea a continuacion; se cambiara a otro estado hasta llegar a un estado de aceptacion. El proceso termina hasta que se encuentra un fin de archivo (EOF).

[recomiendo ver el diagrama del automata para comprender mejor la explicacion]

Finalmente; aqui está mi trabajo [liberado con licencia GNU - GPL].
Este es el codigo fuente escrito en C.
Aqui esta el ejecutable para M$-DO$ [TurboC de Borland tiene muy buenas librerias para el manejo de strings]
Aqui esta un ejemplo del lenguaje C#
Por ultimo, aqui esta la version del proyecto en pdf

Cualquier duda o sugerencia: dejarla en los comentarios.

La siguiente fase del proyecto es crear un analizador sintactico… si todo va bien, quizas lo publique aqui.

Categories: Programacion

59 responses so far ↓

  • Vipsania // 2007-03-12 at 3:43 pm

    Necesito que me mandes porfa todo lo que
    publicastes pues desde aqui no se ve tu servidor
    y lo necesito mucho, si tuvieras la gentileza
    de mandarmelo por correo te lo agradeceria infinitamente
    muchas gracias vip. por si no lo vez mi correo es
    yananliur@hotmail.com

  • vaLar // 2007-03-12 at 8:49 pm

    definitivamente no te voy a mandar tu tarea a tu correo. osea; ¿por quién me tomas?

    Intenta mas tarde, el servidor andará fuera de línea por un par de horas pero si funciona.

  • Lariash // 2007-03-26 at 5:54 pm

    la verdad es muy buen trabajo el analizador lexico, yo hice uno para MicroC, un proyecto de la facultad. solo que no lo hice con una matriz de transicion, y se me hubiera facilitado mucho con esto. echale ganas y adelante

  • vaLar // 2007-03-27 at 6:55 am

    Gracias por el comentario Lariash. Este proyecto fue para la materia de compiladores y realmente me costó bastante noches, lo puse en línea confiando en que las personas que lo encuentren, lo consideren util y como material de apoyo.

    Saludos Lariash.

  • Angeles // 2007-04-08 at 12:07 am

    Hola, he visto tu trabajo realmente esta muy bueno, a mi me ha tocado hacer un analizador lexico tambien para mi clase de compiladores, solo que mi problema esque no me han dicho para que lenguaje lo quieren asi que intuyo que es general, asi que estoy que paso noches pensando como lo termino y la verdad sera el cansancio pero ya no me da se me traba pero realmente me sorprende el tuyo tomare tu idea y vere si me da lo de la matriz, gracias por la ayudita, y sigue adelante tienes un gran talento.

  • valar // 2007-04-08 at 1:49 pm

    Angeles: Adelante, tomalo como ejemplo o si gustas realizarle alguna mejora al codigo fuente publicado aquí, no hay problema. La intención es que sea útil para otras personas.

    Saludos y paz.

  • Josue // 2007-05-09 at 9:41 am

    Hola tengo una duda. Cuando abre el .exe de ms-dos de tu analizador lexico me pide el nombre de un archivo…

    Como lo devo escribir?, la ruta completa o solo el nombre del archivo..

    Ya intente de las 2 formas y no me da resultado..

    Gracias, PD. Es muy interesante el codigo pero si pudieras explicar el codigo te lo agradeceria ya que necesito hacer uno pero en Visual basic .net para que analize programitas escritos en visual basic….

    De antemano Gracias

  • valar // 2007-05-09 at 10:49 am

    jejejeje si quieres, te lo hago en visual basic, para que te sea más sencillo entregar tu proyecto escolar ;-)

    Damm it!

  • Josue // 2007-05-10 at 8:54 am

    No no es necesario, solo necesito que me expliques (si puedes y quieres claro) como funciona…

    Con respecto a lo e que no puedo abrir el archivo….????

  • Lety // 2007-05-10 at 1:29 pm

    Hola:
    Bueno pues checando tu trabajo esta muy bien… Sabes yo necesito realizar una analizador lexico pero ya sea para pascal o para c++ o para visual basic, asi k espero k checando mas adetalle tu trabajo pueda generar una idea para mi proyecto de fin de semestre.

    bueno un gusto

    Sigue adelante y suerte

  • valar // 2007-05-11 at 9:24 am

    Lety: Suerte y éxito con tu proyecto!

    Saludos!

  • Neikiang // 2007-05-25 at 12:47 am

    chikos yo si necesito un analizador lexico pero en java hice uno pero no le gusto mucho al maestro y medio chanse para entregarse lo el lunes 28 de mayo asi k si me pueden ayudar se los agradecere mucho y si es en basic les encargo el programa

    muchas gracias de vdd

    avalanch_2002@hotmail.com

  • rashy // 2007-05-28 at 6:13 pm

    hola amigo mi nombre es luis raciel me dicen rashy me gustaria saber si me podrias proporcionar tu analizador o tus automatas para poder checarlo y te prometo que cualquier modificion lapublicare en esta pagina solo quiero checarlo para un proyecto escolar que tengo mi correo es Luis_raciel@hotmail.com espero me des respuesta muy pronto

  • valar // 2007-05-28 at 6:36 pm

    Hola raciel, el link hacia el codigo fuente está disponible en el artículo, por favor emplea tal.

    Saludos

  • ALEXANDRA // 2007-05-29 at 1:24 pm

    GUAPO Y ADEMAS INELIGENTE, MUY BIEN CREO QUE ME SERA DE UTILIDAD ES MUY INTERESANTE TU CODIGO AMIGO, GRACIAS

  • jose // 2007-06-11 at 12:38 am

    oye se ve interesante, yo ando haciendo uno analizador = para mi materia de prog. de sistemas 2.
    leere tu trabajo haber que tal, con respecto alas personas que necesitan analizadores para java, c++…

    c# se basa en esos lenguajes, es solo una adaptacion minima….

  • Liniud // 2007-06-19 at 12:19 pm

    Pues mira, mi estimado Valar: Para serte honesto, tu programita me ha servido más que todas las clases que he tomado de Programación de Sistemas donde estamos viendo el compilador. Por fin le entendí a los famosos Autómatas Finitos Deterministas y sigo exprimiéndole todo lo que puedo. De veras, te estoy muy agradecido por haberlo publicado en la Web. Una cosa que me serviría mucho saber es si la matriz la sacaste directamente del AFD o tienes por ahí otro archivo u otras anotaciones de cómo crearla. Yo estoy tratando de integrarla de la que ya hiciste y del AFD que publicaste. Cualquier comentario será muy requete bienvenido.
    Saludos
    Liniud

  • Joyce // 2007-06-21 at 9:48 pm

    Hola:
    Oye ya me aventé el analizador léxico y ahora voy por el sintáctico pero no le agarro la onda, tienes alguna sugerencia o algo de información que me pueda ser útil??? Es para un proyecto de programación de sistemas, tengo que hacer un monitor de cobertura, después del sintáctico tengo que hacer el semático pero todavía no empiezo con el sintáctico : S.
    Gracias.
    Joyce

  • alexandra // 2007-10-03 at 1:00 pm

    no seas malito puedes enviarme el codigo fuente del analizador lexico para pascal hecho en c.

    gracias

  • viktor // 2007-10-08 at 6:42 am

    hola colega encontre tu sitio pork ando indagando como realizar un analizador lexico, encontre k hiciste uno en c# pero no pude ver el codigo okas si me lo puedes proporcionar t lo agradeceria va. lo que pasa que tenfo k hacer uno pero en java por cuestiones d tiempo no lo he podido hacer me gutaria darme referencias con tu trabajo de antemano muchas gracias.
    att. viktor

  • Carlos // 2007-10-10 at 11:07 am

    oye necesito q me hagas el favor y si me pudieras enviar el codigo del analizador es q de eso depende mi semestre te lo agradeceria mucho.. en cualquier otra ocasion de recompensaria…. ojala me pudieras ayudar

    sirdussan85@msn.com

  • valar // 2007-10-10 at 1:32 pm

    Ocasionalmente no funciona la resolucion de nombres del servidor de mi facultad y es por eso que les muestra un error al tratar de acceder a los archivos publicados, solo cambien el nombre del servidor por el ip:
    ixtchel.cs.buap.mx - 148.228.20.5

    Por ejemplo, para los enlaces publicados en este post:

    http://ixtchel.cs.buap.mx/~guerrero/valar/anlex.cpp
    http://148.228.20.5/~guerrero/valar/anlex.cpp

    Saludos!

  • ruben // 2007-10-16 at 9:24 am

    hola q tal valar disculpa la molestia vi que tienes un codigo del analizador lexico sintactico en visual basic y me interesariaver si me facilitas tu codigo para hacerle una modificacion para un programa q debo hacer (debo añadirle funciones de notacion polaca) entonces quiero ver si me puedes dar el link de donde esta

  • adrian // 2007-10-17 at 3:17 pm

    Saludos. Estaba buscando información para crear un analizador léxico y por casualidad me encontré el tuyo. Le entiendo un poco el cómo funciona gracias a la pequeña reseña que hiciste, sin embargo; me gustaría ver el diagrama del autómata ya que no lo puedo ver. me marca error. Si me lo pudieras mandar a mi mail te lo agradecería mucho.

    se ve muy interesante el programa.

    ¿lo podría usar y modificarlo? soy de lázaro cárdenas mich.

  • francisca bernal // 2007-10-18 at 2:44 pm

    vi tu articulo y me parecio muy interesante tu analisis, me gustaria que lo enviaras a mi correo para revisar la estructura de tu codigo y ver si puedo modificarlo (claro con tu autorizacion desde luego) y si podrias agregara tu automata porque no me dejo abrirlo (como que el link esta roto)..

    de antemano Gracias
    SALU2

  • Oscar Vera // 2007-10-22 at 10:48 pm

    Que onda, mira necesecito hacer un analizador y manejar archivos, no se como hacerlo y como tu lograste hacerlo me gustaria me prestaras tu codigo, la verdad voy a implementarlo en Java y me gustaria mucho me mandaras tu codigo a mi correo, si puedes claro te lo agradecere demasiado.
    Te lo pido de esta manera pues el servidor no esta disponible. Gracias de antemano companero.

  • Jesus Rvero // 2007-10-23 at 10:40 am

    quiero uno en cod c++ pero que funcione en VB 6.0 , Un analizador , por fa si me pueden ayudar mandalo a mi correo jesusdaver86@hotmail.com

  • Aker // 2007-10-25 at 10:25 am

    oye si me podrian decir como crear un analizador lexico en visual basic 6 por fa es que necesito saber como se hace y no tengo ni idea de como hacerlo si alguien me puede decir como hacerlo por fa envienmelo a mi correo por fa es aker134@hotmail.com por fa

    gracias

  • Jorge Rodriguez // 2007-11-23 at 7:05 pm

    Un saludo cordial para VALAR, a que direccion de correo puedo contactarte, ya que me gustaria preguntar algunas cosas acerca de implementacion del codigo fuente que gentilmente haz publicado en este sitio.

    Por tu atecion, mil gracias…

    Atte. Jorge

  • valar // 2007-11-23 at 10:15 pm

    Jorgue Rodríguez: gracias por el saludo y puedes ponerte en contacto conmigo en la siguiente dirección de correo: javier.camacho (en) dgb.buap.mx

    saludos!

  • Rosy // 2007-11-24 at 5:56 pm

    Hola Javier:

    Tu articulo es muy interesante, lo tome como ejemplo para terminar el analizador que yo estoy haciendo y que me quito el sueño por varios dìas.

    Mil gracias

  • valar // 2007-11-25 at 9:19 am

    Hola Rosy: Comprendo perfectamente a que te refieres, a mi también me quitó el sueño por muchas semanas.

    Saludos y que te sea leve!

  • ANG3LS // 2007-11-28 at 2:09 am

    ESTA MUY BIEN TU ANALIZADOR LEXICO, PERO DESPUES DE ESO SUPONGO Q YA IMPLEMENTASTE EL SEMANTICO…..

    COMO ESTARIA ECHO¡?¡¡

    SALUDOS….

  • Omar // 2007-12-01 at 11:57 am

    saludos amigo, queria pedirte si eres tan amable de enviarme codigo fuente del analizador lexico, estoy investigando hacerca de tema y tu analizador me ayudaria bastante… Gracias.

  • anel.. // 2007-12-02 at 5:45 pm

    hola… creo ke todos los ke entramos a esta pagina… necesitamos un analizador lexico… el cual nos ha kitado el sueño por noches…. la verdad. nos se como hacerlo. peor lo necesito…… para poder.. tomarlo como ejemplo.. y pues keria ver si me podias enviar el codigo ami correo.. digo si no e smucha la molestia…bueno muchas gracias por haber leido.. este mensaje…

  • K-TRINA // 2007-12-09 at 4:43 pm

    hola!!!
    este comen solo es para felicitarte pke la verdad si esta muy cañon la clase de compiladores, tu ar{iculo esta super interesante…
    congratulations ;D

  • fofi // 2007-12-10 at 6:00 pm

    hola! muy buen trabajo el analizador lexico, solo tengo un par de pregunta es que yo lo estoy haciendo pero en Java, estaba mirando en codigo y me sirve lo voy a empezar hacer el mio, en base al tuyo, hay varias cosas que no entiendo crees que me puedas ayudar, como para jalar en archivo y lo que esta al final creo que es una matriz. O alguien que me diga como lo puedo hacer en Java, muchas gracias y esta muy bueno el articulo.

  • Jurahack // 2008-01-28 at 9:08 pm

    Excelente Trabajo, ami tambien me toca hacer un AL :) para el curso de Compiladores. si todo va bien voy a publicarlo.

  • Adirael // 2008-01-31 at 11:30 pm

    Hola soy programador de java de corazon realemnte me sorprendio esto esta bien hecho aunque puedes mejorar y reducir codigo, yo esoty haciendo uno pero con swing, estoy utilizando tu logica para el analizador y tu diagrama de estados …Gracias tocayo
    SOY dE GUERRERO, quien dice que nosotros somos ignorantes estoy estudiando ingenieria en mex y todos la gran mayoria son una bola de webones presumidos, solo al qe le quede el saco, pero con esto me da alegria ser guerrrerense …
    viva guerrero
    y la costa chica
    un saludo valar

  • vaLar // 2008-02-01 at 7:58 am

    A ver si luego publicas tu proyecto en Java, porque yo la vdd no programo ni el “Hello World” en ese lenguaje, ahora me dedico mas al PHPOO.

    Un saludo colega!!

  • ALAHIN // 2008-02-07 at 9:30 pm

    ESE ANALIZADOR ESTA MUY BUENO, PERO QUERIA QUE ME DIJERAS EL SIGNIFICADO DE CADA VARIABLE PARA PODER ANALISARLO MEJOR, TE LO AGRADEZCO, ES PARA MI TRABAJO DE COMPILADORES…..
    TE PIDO QUE ME LO ENVIES A MI E-MAIL SE PUEDES
    GRACIAS DESDE YA!!!

  • valar // 2008-02-08 at 7:19 am

    Alahin…. ¬¬ sin comentarios..!

  • juancho // 2008-02-19 at 11:04 pm

    Un gran trabajo, creo que a todos nos sirve vastante, Muchas gracias por publicarlo y suerte en tus proximos proyectos.

  • ANTONIO // 2008-02-24 at 8:33 pm

    hola yo hice un compilador en c para mi proyecto de compiladores y la verdad me quedo bien chido y esta bastante sencillo de entender por si alguien lo quiere mandenme un mensaje a mi correo: antonysalva@gmail.com o al de hotmail: antony1_a63@hotmail.com

  • ddik2 // 2008-02-29 at 11:35 am

    Unicamente te escribo para felicitarte… excelente codigo… sigue adelante….
    bendiciones,
    Zuly

  • valar // 2008-02-29 at 3:32 pm

    ddik2: Gracias por el comentario!!

    Bendiciones para ti también, al ciento por una…

  • Guillermo Peña // 2008-03-09 at 10:19 am

    Excelente trabajo creeme que he entendido mas tu código fuente que la bola de hojas de papel que el profr. de la clase nos hace leer sin ningún sentido (nadie entiende un carajo) Está de lujo y da mucha idea de como hacer las cosas. Muchas gracias por liberar este código ya que nos aclara muchísimo el panorama a aquellos que no tenemos bases teóricas tan sólidas en cuanto al análisis léxico.
    Un saludo desde Sinaloa.

  • valar // 2008-03-10 at 5:38 pm

    Gracias Guillermo, creo que la mejor recompensa que puedo tener es que el código sea de utilidad al menos para que se hagan una idea para el desarrollo de un analizador léxico pese a las grandes debilidades que tiene el código y la muy cara forma de emplear la memoria de la computadora.

    Pero bueno.. mejorarlo dependerá de ustedes.

  • Rosy // 2008-03-18 at 9:29 pm

    HOLA JAVIER:

    GRACIAS POR EL ANALIZADOR, EL MIO NO QUEDO TAMBIEN COMO EL TUYO, AHORA ESTOY HACIENDO UN EDITOR DE TEXTOS EN C++ TU TENDRAS ALGUNO??? DE SER ASI LO PODRIAS PUBLICAR???
    TE LO AGRADECERIA BASTANTE.

  • CArlos // 2008-03-25 at 11:09 pm

    Tu codigo es estupendo Valar, una consulta donde podría colocarle los mensajes de error cuando un token esta mal escrito por ejemplo el identificador ab$%l o el número 123$3, ambos mal escritos pero el analizador no los detecta

  • Fran // 2008-04-02 at 4:03 am

    Grandioso codigo, me es muy util para mi asignatura de compiladores, pero en mi caso en para entender etiquetas de HTML. Por mas que miro las tablas no llego a entender bien los saltos que da, ¿alguien podria indicarme algun manual o alguna referencia donde pueda consultarlo?

    Muchas gracias

  • armando // 2008-04-03 at 1:05 pm

    Si alguien me podria ayudar con el analizador lexico en c++ que ya pase muchas noches en vela para poderlo correr pero no nooooo corre

    gracias

    mi correo es armaguate@hotmail.com

  • billi // 2008-04-15 at 9:09 pm

    Mano, que buen dato tenés, tenemos (toda la clase) que presentar uno, pero ni el Ingeniero lo puede hacer. Asi de jodidos estamos! Gracias!

  • valar // 2008-04-16 at 12:10 pm

    Billi: Por nada.

    Saludos!

  • LURDER // 2008-05-02 at 10:59 am

    ME GUSTARIA QUE LO PUSIERAS EN VISUAL BASIC PARA ENTENDERLO MEJOR Y GRACIAS DE TODOS MODOS.

  • valar // 2008-05-07 at 3:39 pm

    Sorry. No creo poder hacerlo en VB, no por falta de ganas, mas bien de tiempo.

    Saludos.

  • luis // 2008-05-13 at 7:03 pm

    ta muy bueno tu proyecto pero te queria preguntar comno puedo crear un analisador lexico de pascal 1

  • luis // 2008-05-13 at 7:05 pm

    si tienes alguna pagina de donde guiarme

  • mario // 2008-05-14 at 6:28 pm

    quisiera saber como hacerlo para que el programa me compare simbolos, letras mayusculas y minusculas, y cuando le sea introducido un caracter invalido se detenga el programa

Leave a Comment