Flujo del compilador

Las 6 fases clásicas de un compilador, desde el código fuente hasta el código máquina.

L1

Análisis Léxico

Implementado

El lexer recorre el código carácter por carácter y agrupa los caracteres en unidades significativas llamadas tokens: palabras reservadas, identificadores, literales, operadores y delimitadores.

EntradaCódigo fuente (texto plano)
SalidaLista de tokens con tipo, lexema, línea y columna
Errores posiblesCaracteres no reconocidos, cadenas no cerradas.
S2

Análisis Sintáctico

Implementado

El parser LL(1) verifica que los tokens formen construcciones gramaticalmente válidas usando una tabla predictiva. Construye el AST y se recupera de errores por modo pánico.

EntradaLista de tokens
SalidaAST (Árbol de Sintaxis Abstracta)
Errores posiblesProducciones inesperadas, tokens faltantes. Reporta múltiples errores por sincronización.
M3

Análisis Semántico

Implementado

Verifica el significado del programa: variables declaradas, tipos compatibles, número correcto de argumentos, retornos válidos. Construye la tabla de símbolos con toda la información de ámbito.

EntradaAST
SalidaAST anotado + Tabla de símbolos
Errores posiblesVariables no declaradas, tipos incompatibles, redeclaraciones, aridad incorrecta.
I4

Generación de Código Intermedio

Didáctico

Traduce el AST a una representación intermedia independiente de la arquitectura. El código de tres direcciones es fácil de optimizar y de traducir a ensamblador. Ejemplo: t1 = a + b, t2 = t1 * c.

EntradaAST anotado + Tabla de símbolos
SalidaCódigo de tres direcciones (TAC) o código IR como LLVM IR
O5

Optimización de Código

Didáctico

Aplica transformaciones para mejorar velocidad y reducir uso de memoria sin cambiar la semántica. Ejemplos: eliminación de expresiones comunes, propagación de constantes, desenrollar bucles, eliminación de código muerto.

EntradaCódigo intermedio
SalidaCódigo intermedio optimizado
C6

Generación de Código

Didáctico

Traduce el código intermedio a instrucciones reales del procesador (x86, ARM, etc.). Asigna registros, gestiona el stack y produce el binario ejecutable final.

EntradaCódigo intermedio optimizado
SalidaCódigo máquina o ensamblador específico de la arquitectura
Nota: En Slang, las fases 4, 5 y 6 son reemplazadas por un intérprete del AST que ejecuta el programa directamente, sin generar código máquina. Esto es suficiente para los fines educativos de esta herramienta.