Compilador educativo para el lenguaje Monkey, desarrollado como proyecto académico del curso Compiladores e Intérpretes en el Instituto Tecnológico de Costa Rica (TEC).
El proyecto implementa todas las fases fundamentales de un compilador, desde el análisis léxico y sintáctico hasta la generación y ejecución de código intermedio, incluyendo una máquina virtual propia y una interfaz gráfica para facilitar su uso.
Monkey es un lenguaje de programación educativo diseñado para ilustrar los procesos internos de un compilador moderno. Su sintaxis está inspirada en lenguajes imperativos como C, Go y Python, y permite trabajar con:
- Variables y tipos básicos
- Funciones con parámetros y retorno
- Estructuras de control (
if,else,while) - Expresiones aritméticas y booleanas
El compilador traduce programas Monkey a un código intermedio (IR) basado en una stack machine, el cual es ejecutado por una máquina virtual personalizada.
Adicionalmente, el proyecto incluye una GUI desarrollada en Python con Tkinter, que permite escribir, compilar y ejecutar programas desde un mismo entorno.
El compilador sigue una arquitectura modular dividida en las siguientes fases:
-
Análisis léxico
- Implementado con ANTLR4
- Reconoce tokens, literales y palabras reservadas
-
Análisis sintáctico
- Generado automáticamente con ANTLR4
- Construcción del Árbol de Sintaxis Abstracta (AST) usando el Visitor Pattern
-
Análisis semántico
- Tabla de símbolos jerárquica
- Verificación de tipos y ámbitos
- Validación de declaraciones y llamadas a funciones
-
Generación de código intermedio (IR)
- Traducción del AST a instrucciones tipo stack machine
- IR ejecutable y legible para depuración
-
Ejecución
- Máquina virtual propia (
VirtualMachine) - Soporte para llamadas a funciones, control de flujo y operaciones aritméticas
- Máquina virtual propia (
-
Backend alternativo (CIL)
- Generación dinámica de código usando
Reflection.Emit - Posibilidad de ejecutar código CIL en memoria o generar un ejecutable de consola (
.exe)
- Generación dinámica de código usando
IntTypeStringTypeBoolTypeVoidType
El compilador detecta y reporta errores como:
- Uso de variables no declaradas
- Tipos incompatibles en expresiones
- Número o tipo incorrecto de parámetros en funciones
- Tipos de retorno inválidos
Los errores incluyen línea, columna y descripción, deteniendo la compilación antes de la generación de código.
La interfaz gráfica fue desarrollada en Python 3 con Tkinter y se comunica con el compilador en C# mediante procesos del sistema.
La GUI muestra de forma separada:
=== Errores ====== Salida ====== IR ===
Esto permite una experiencia cercana a un entorno real de desarrollo.
fn main(): void {
let x: int = 10;
let y: int = 20;
let z: int = x + y * 2;
print(z);
}FUNC_START main
DECLARE x : IntType
LOAD_CONST 10
STORE x
DECLARE y : IntType
LOAD_CONST 20
STORE y
DECLARE z : IntType
LOAD_VAR x
LOAD_VAR y
LOAD_CONST 2
MUL
ADD
STORE z
LOAD_VAR z
PRINT
FUNC_END main
50
| Componente | Tecnología |
|---|---|
| Lenguaje principal | C# (.NET 8.0) |
| Análisis léxico y sintáctico | ANTLR4 |
| IDE | Visual Studio / VS Code |
| Interfaz gráfica | Python 3 + Tkinter |
| Backend alternativo | CIL / Reflection.Emit |
- Analizador léxico funcional
- Analizador sintáctico con AST
- Análisis semántico completo
- Generación de IR ejecutable
- Máquina virtual propia
- Soporte para funciones y estructuras de control
- Backend alternativo con generación de ejecutables
- Interfaz gráfica integrada
- Curso: Compiladores e Intérpretes
- Institución: Instituto Tecnológico de Costa Rica (TEC) – Campus San Carlos
- Semestre: II Semestre, 2025
- Andrés Quirós Rojas
- Erick Durán Maroto
- Aho, A. V., Lam, M. S., Sethi, R., & Ullman, J. D. Compilers: Principles, Techniques, and Tools
- Nisan, N., & Schocken, S. The Elements of Computing Systems
- Nystrom, R. Crafting Interpreters
- Louden, K. C. Compiler Construction
- Hecht, M. Introduction to Compilers and Language Design
✔️ Proyecto finalizado y funcional
✔️ Cumple con los requerimientos académicos
✔️ Diseñado con fines educativos y extensibles