Mi primer compilador

En realidad este no es mi primer compilador, pero si el primero en compilar desde un lenguaje de alto nivel .

Allá por el año 1997, en los días de la universidad, decidí escribir mi propio compilador. Aprovechando un curso sobre Diseño de Software, presenté un proyecto ambicioso, como trabajo de fin de curso.

El objetivo era desarrollar un compilador que generase código máquina puro, a partir de un nuevo lenguaje de alto nivel. Parte del trabajo era definr el lenguaje, que además debería tener sintaxis en español.

Decidí hacerlo en C, y con la posibilidad de generar código máquina para dos destinos: el procesador 8086 de Intel y el 6811 de Motorola.

Aunque con cierta deficultad, puedo decir que se cumplió el objetivo. El proyecto tuvo el apoyo de algunos compañeros de la universidad, quienes dejaron su aporte, tanto en la sintaxis como en el código.

El compilador incluye un pre-procesador de texto y dos generadores de código. Uno para cada arquitectura soportada.

Al lenguaje usado lo llamé «Lenguaje T», y tiene una sintaxis parecidad a Pascal, C y algo de Basic.

Debido a limitaciones de tiempo y de recursos la implementación es sencilla. Es un simple lenguaje imperativo sin datos estructurados ni objetos. El lenguaje lo definí con funciones tan básicas como para poder implementarse en un ciclo de la universidad.

Su valor estriba en servir más como ayuda o guía, que como herramienta de compilación.

Copio el código tal cual lo encontré sin modificar desde have varios años :

20140425-compilador_t.rar

Los archivos fuentes PREPRO.CPP, PREPRO2.CPP y PREPRO3.CPP son el pre-procesador,  en sus diversas versiones.

Los archivos fuentes T6811.CPP y T8086.CPP son los generadores de código binario.

No se ha usado ninguna herramienta automática para generar el analizador léxico. Todo se ha escrito «a mano».

No se genera código intermedio. El binario es construido directamente. El código generado para el 8086 es de 16 bits. Solo se manejan operaciones aritméticas con enteros.

Aquí un ejemplo de programa:

programa prueba1;
var a,b,c,d:oct;
    m,n:pal;
    c:cad;
codigo
 1;           //expresion aislada
 (2);         //expresion entre parentesis
 entra(c);    //funcion de entrada
 {a,b,c:=1};  /*asignacion multiple en sentencia bloque aislada y
                con comentario en doble linea*/                    
 sale(a+{b:=a+1}b);   //texto a pantalla
 m:=m+1;      //asignacion simple
 a,n:=a,b;    /*asignacion multiple*/

fin.

En la carpeta del programa, existen otros ejemplos de programas.


Sé el primero en comentar

Dejar una contestacion

Tu dirección de correo electrónico no será publicada.


*