- Autor: Javier Machado Sánchez
- Institución: Instituto Tecnológico de Tijuana
- Materia: Lenguajes y Autómatas II
- Profesor: Erasmo Estrada Peña
Este es un proyecto educativo enfocado en la construcción de un compilador funcional desde sus cimientos. El objetivo es profundizar en la teoría de lenguajes, autómatas y la arquitectura interna de las herramientas de desarrollo modernas.
| Fase | Descripción | Estado |
|---|---|---|
| 1 | Análisis Léxico | ✅ |
| 2 | Análisis Sintáctico | ✅ |
| 3 | Análisis Semántico | ✅ |
| 4 | Generación de Código Intermedio/Ensamblador | ✅ |
| 5 | Optimización de Código | ⏳ Pendiente |
/
├── bin/ # Ejecutables generados
├── obj/ # Archivos objeto (.o)
├── src/ # Código fuente (.c)
│ ├── main.c # Orquestador del flujo
│ ├── lexer.c # Tokenización (DFA)
│ ├── parser.c # Árbol de Sintaxis Abstracta (AST)
│ ├── ast.c # Estructuras del Árbol
│ ├── semantic.c # Comprobación de tipos y reglas
│ └── symbols.c # Gestión de ámbitos y tabla de símbolos
├── include/ # Cabeceras (.h)
└── Makefile # Automatización de construcciónTransforma el flujo de caracteres en Tokens. Utiliza un Autómata Finito Determinista (DFA) para reconocer palabras reservadas, identificadores, literales y operadores, filtrando elementos irrelevantes como espacios y comentarios.
Construye un Árbol de Sintaxis Abstracta (AST) mediante la técnica de Descenso Recursivo. Valida que la secuencia de tokens siga la gramática definida, manejando precedencia de operadores y estructuras de control (if, while, for).
Realiza la validación lógica del programa recorriendo el AST de forma Bottom-Up.
- Type Checking: Valida compatibilidad de tipos en expresiones y asignaciones (ej. no sumar
stringconint). - Gestión de Ámbitos (Scoping): Controla la visibilidad de variables mediante una tabla de símbolos jerárquica, permitiendo variables locales y globales.
- Detección de Errores: Identifica variables no declaradas o usos inválidos de operadores.
Genera código objeto ejecutable (x86-64 usando sintaxis de Intel, enlazado directamente con la librería de C para I/O vía printf/scanf) "al vuelo" a medida que realiza el análisis.
Se han implementado con éxito:
- Operaciones aritméticas: sumas, restas, multiplicaciones, divisiones y potencias en enteros y punto flotante (mediante las extensiones SSE
xmm). - Entrada y Salida: Palabras reservadas
readywritecon formatos apropiados según tipo. - Flujo de control: Soporte para sentencias
if/else, cicloswhileyfor. - Procedimientos (
proc): Definición de funciones con parámetros (usando convención de llamada ABI x86-64 conrdi,rsi...) e invocaciones a funciones propias. - Operadores lógicos y relacionales: Comparaciones entre todo tipo de datos y operaciones booleanas
&&y||.
La siguiente etapa consistirá en aplicar técnicas de optimización, como el plegado de constantes, para emitir un código más eficiente y reducir las instrucciones redundantes.
El compilador actualmente es capaz de procesar estructuras complejas como esta:
int A = 10;
float B = 20.5;
bool flag = true;
if (A > 5 && flag) {
B = B + A * 2; // Conversión implícita de int a float
}gcc(GNU Compiler Collection)make
make./bin/Compiler <tu_archivo_fuente>.txtEste proyecto se distribuye bajo la licencia GPL. Para más detalles, consulta el archivo LICENSE.
