# ANTLR

ANTLR (ANother Tool for Language Recognition; en español "otra herramienta para reconocimiento de lenguajes") es una herramienta creada principalmente por Terence Parr, que opera sobre lenguajes, proporcionando un marco para construir reconocedores (parsers), intérpretes, compiladores y traductores de lenguajes a partir de las descripciones gramaticales de los mismos (conteniendo acciones semánticas a realizarse en varios lenguajes de programación).

## Introducción

ANTLR cae dentro de la categoría de meta-programas, por ser un programa que escribe otros programas. Partiendo de la descripción formal de la gramática de un lenguaje, ANTLR genera un programa que determina si una sentencia o palabra pertenece a dicho lenguaje (reconocedor), utilizando algoritmos LL(*) de parsing. Si a dicha gramática, se le añaden acciones escritas en un lenguaje de programación, el reconocedor se transforma en un traductor o intérprete.
Además, ANTLR proporciona facilidades para la creación de estructuras intermedias de análisis (como ser ASTs - Abstract Syntax Tree), para recorrer dichas estructuras, y provee mecanismos para recuperarse automáticamente de errores y realizar reportes de los mismos.
ANTLR es un proyecto bajo licencia BSD, viniendo con todo el código fuente disponible, y preparado para su instalación bajo plataformas Linux, Windows y Mac OS X.

## Historia

Los inicios del proyecto se remontan a otoño de 1988, cuando el profesor de la Universidad de Purdue, Hank Dietz, inicia el proyecto PCCTS (Purdue Compiler Construction Tool Set) como un generador de parsers, para su utilización en un curso de graduación. Bajo la tutela de Dietz, Terence Parr realiza su tesis para el grado de Máster, creando ANTLR (originalmente llamado YUCC). Esta versión alfa, fue totalmente rediseñada y escrita, para dar paso a la versión 1.00B. Dicha versión fue la primera release distribuida a través de Internet por un grupo de noticias (comp.compilers), en febrero de 1990, obteniendo un buen recibimiento y comunidad de seguidores. Esta versión solo generaba parsers LL(1) y no manejaba parámetros de retorno, pero permitía expresar de manera conjunta la descripción del análisis léxico y sintáctico a realizarse.
Conforme Parr iniciaba su Ph.D. en Purdue en otoño de 1990, comenzó la segunda completa revisión y reescritura de ANTLR. A partir de la misma, así como de la incorporación de nuevas técnicas de analizar gramáticas descubiertas en esos momentos. De este modo surge la versión 1.00, publicada vía un artículo en Noticias SIGPLAN (periódico mensual de la ACM). Dicha versión incluía métodos para generar parsers LL(k), para la creación y manipulación de AST’s, clases léxicas, clases para manejo de errores, y clases para recuperación automática de fallos. Esta versión fue extensamente testada por profesionales de Micro Data Base System Archivado el 11 de abril de 2021 en Wayback Machine. así como candidatos a Ph.D de la Universidad de Minnesota, mostrando ser una sólida base para la evolución que surgiría a partir de la misma, y continuaría hasta hoy en día.

## Versiones

La versión 1 de ANTLR siguió su curso, y fue incorporando nuevas características, así como nuevas capacidades y facilidades para el programador (siendo una de las más destacadas SORCERER, la cual facilitaba el parseo de los subárboles hijos de un nodo mediante la especificación de una gramática, en vez de realizar una recorrida recursiva sobre ambos).
En mayo de 1997, Parr unido principalmente con John Lilley, se plantean escribir ANTLR desde cero, enfocándose en mejorar su rendimiento, reducir el uso de memoria, y agregar más características al lexer (como ser la posibilidad ingorar si los símbolos se encuentran en mayúscula o minúscula). Esto da lugar al surgimiento de ANTLR 2.0.
En diciembre del mismo año, surge el sitio web http://www.antlr.org, el cual fue acompañado de la publicación de la versión 2.2.0, englobando varias mejoras, como ser tratamiento de AST extendido, herencia de gramáticas, etc.
El 17 de mayo del 2007 publican la versión actual de ANTLR, 3.0. Dicha versión llevó 4 años de investigación y desarrollo. La misma esta reescrita en Java, y su principal objetivo fue el de proveer un código fuente limpio y claro de entender, presentando la sintaxis y semántica de la gramática del meta-lenguaje de ANTLR de una manera más sencilla. Además se mejoró nuevamente el rendimiento del software, así como también se añadieron algunas funciones nuevas (modo automático de recorrida en reversa, mecanismo de reescritura de reglas del AST, extensión al algoritmo LL(k), llamada LL(*), la cual permite que no se especifique el parámetro k de búsqueda en la cadena de entrada, sino que ANTLR busca automáticamente tantos caracteres como sea necesario, hasta que se logre evitar la ambigüedad, etc.).
A esto se le añadió que Jean Bovet creó el entorno de desarrollo para la creación y edición de gramáticas para ANTLR llamado “ANTLRWorks”.

## Lenguajes compatibles e integración con entornos de desarrollo

ANTLRWorks es un entorno de desarrollo con interfaz gráfica que permite el desarrollo de gramáticas para la versión 3.0 o superior de ANTLR. Consiste en una aplicación independiente Java, que se puede ejecutar directamente desde un jar. De quererse incorporar las funcionalidade de ANTLR en ambientes de desarrollo ya existentes, existen plug-ins que se pueden bajar directamente de la web del autor, habilitando el poder trabajar en IntelliJ, gUnit, Eclipse, NetBeans, etc.
Actualmente ANTLR genera código Java, C, C++, C#, Python, Perl, Delphi, Ada95, JavaScript y Objective-C. Otros lenguajes como Ruby, php, etc. son generados por medio de extensiones planteadas por la comunidad.

## Aportes del autor

Terence Parr es un profesor de Teoría de la Computación en la Universidad de San Francisco, y ha estado trabajando en ANTLR junto con varios colegas desde 1989. Su principal aporte ha sido el liderar el resurgimiento de los algoritmos de parsing LL(*) utilizados en herramientas de reconocimiento de lenguajes.