Cuando usamos Java, Kotlin o Scala, normalmente escribimos código sin pensar demasiado en lo que ocurre detrás de escena.
int result = 10 + 20;
Sin embargo, antes de que la JVM pueda ejecutar ese programa, alguien tuvo que diseñar un compilador capaz de entender ese texto y transformarlo en bytecode.
En esta serie vamos a construir nuestro propio lenguaje para la JVM. No pretendemos competir con Kotlin o Scala, pero sí recorrer muchos de los mismos conceptos que utilizan estos lenguajes internamente.
Y el primer paso es aprender una herramienta fundamental: ANTLR.
¿Qué es ANTLR?
ANTLR (ANother Tool for Language Recognition) es una herramienta que permite generar analizadores léxicos y sintácticos a partir de una gramática.
En lugar de escribir manualmente todo el código necesario para interpretar un lenguaje, simplemente describimos las reglas del mismo y ANTLR genera automáticamente gran parte de la infraestructura necesaria.
Por ejemplo, podemos definir una regla como:
expression
: expression '+' expression
| NUMBER
;
A partir de ella ANTLR podrá reconocer expresiones como:
1 + 2 + 3
Un compilador suele dividirse en varias etapas:
Código Fuente
│
▼
Lexer
│
▼
Tokens
│
▼
Parser
│
▼
AST
│
▼
Análisis Semántico
│
▼
Generación de Código
ANTLR participa principalmente en las dos primeras:
- Lexer
- Parser
¿Qué hace el Lexer?
El Lexer toma una secuencia de caracteres y la divide en tokens.
Por ejemplo:
let age = 42
se transforma en:
LET
IDENTIFIER(age)
ASSIGN
NUMBER(42)
El Lexer no entiende el significado del programa. Solo identifica patrones.
¿Qué hace el Parser?
El Parser toma los tokens generados por el Lexer y verifica que respeten las reglas definidas por la gramática.
Por ejemplo:
LET IDENTIFIER ASSIGN NUMBER
podría convertirse en:
Assignment
├── Variable(age)
└── Number(42)
Esta estructura representa la forma del programa y servirá como base para las siguientes etapas.
¿Qué es una gramática?
Una gramática define qué construcciones son válidas dentro de un lenguaje.
Por ejemplo:
variableDeclaration
: 'let' IDENTIFIER '=' expression
;
Esta regla indica que una declaración válida debe contener:
- La palabra reservada let
- Un identificador
- El símbolo =
- Una expresión
¿ANTLR genera compiladores?
No.
ANTLR resuelve principalmente:
- Análisis léxico
- Parsing
Todavía debemos implementar:
- Árboles sintácticos abstractos (AST)
- Tablas de símbolos
- Sistema de tipos
- Generación de bytecode JVM
Por eso ANTLR es una herramienta muy importante, pero representa solo una parte del compilador completo.
















