[Ayuda-C] Programación de un analizador léxico-sintáctico

Iniciado por Miky Gonzalez, 6 Agosto 2013, 16:07 PM

0 Miembros y 1 Visitante están viendo este tema.

Miky Gonzalez

Buenas a todos, inicio un nuevo POST para pedirles ayuda sobre la programación de un analizador léxico-sintáctico. No entiendo los códigos que vi por ahí, o si los entiendo, son demasiados complejos para implementarlos y hacer una adaptación.

Les pondré un ejemplo si no entienden lo que quiero conseguir. Supongamos un fichero de texto como el que sigue:

var
    int a, b, c;
    string d, e, f;
begin
    print("hola")
end


El desglosamiento del programa podría seguir un arbol como:

Declarar variables
   |-a como entero
   |-b como entero
   |-c como entero
   |-d como cadena
   |-e como cadena
   |-f como cadena
Iniciar ejecucion
   |- llamar funcion print con argumento hola como cadena
Fin ejecucion


Y que eso me genere unos ciertos opcodes, (no es necesario que el programa genere el arbol anterior), por ejemplo podria ser:
0x00 a (declarar int a), 0x00 b (declarar int b) ... 0x01 d (declarar string d) ... 0x02 "hola" (llamar funcion print con argumento hola).

No se como implementar esto en C. ¿Alguien puede ayudarme?

Saludos,
   Miky Gonzalez
Mi blog personal, con información acerca de programación, seguridad, desarrollo y electrónica:

EN CONSTRUCCIÓN

eferion

Has visto alguna vez una especificación de un lenguaje de programación ??

Si la respuesta es negativa, búscate el estándar de cualquier lenguaje... javascript, c, c++, ruby, ... verás que disponen de una especificación bastante completa que cubre todos los posibles casos de uso del lenguaje.

Ese estándar es la base sobre la que se asienta el lenguaje y a partir de la cual se desarrolla el mismo.

Para empezar careces de esa base, lo cual implica que no te has parado a pensar las posibles implicaciones que puede tener cualquier característica que le añadas al lenguaje, y eso suele conllevar como norma general al fracaso del proyecto al llegar a vías sin salida cuyo arreglo requiere demasiadas horas de trabajo.

Si quieres desarrollar una suerte de lenguaje de scripting, primero acota ese lenguaje y escribe una especificación sobre el mismo. Después revisa esa especificación y busca puntos débiles, posibles fallos y errores y detalles sin especificar que hayas pasado por alto.

Cuando termines con esa tarea tendrás una idea bastante buena de cómo ha de funcionar tu analizador.

Sin especificación tu idea es bastante posible que no alcance buen puerto... no ponerle límites, por ejemplo, da pie a que se te ocurran ideas maravillosas que tengan un impacto terrible en tu sistema... la pena es que para cuando te quieras dar cuenta habrás dedicado una cantidad ingente de horas y deshacerlo no va a ser moco de pavo.


Alien-Z

#2
Miky Gonzalez:

Estás planteando uno de los tres grandes aspectos necesarios para programar un compilador:

1-Analizador Léxico
2-Analizador Sintáctico
3-Analizador Semántico

Se suelen utilizar otros métodos que harían tu aplicación más eficiente y cómoda de programar, pero usando lenguajes de alto nivel también es posible con las Expresiones Regulares, busca información sobre ello, es la herramienta clave para el analizador léxico.

Esto que planteas es un tema muy interesante, en la universidad tuve que dar una asignatura cuatrimestral solo para poder diseñar un compilador que analizara instrucciones básicas de lenguajes imperativos, en cambio los compiladores para lenguajes de programación orientados a objetos son otro mundo.

Un saludo.