ANTLR (ANother Tool for Language Recognition) es un generador de analizadores. Mucha gente llama a estas herramientas compiladores de compiladores, dado que el ayudar a implementar compiladores es su uso más popular. ANTLR es una herramienta que integra la generación de analizadores léxicos, sintácticos, árboles de sintaxis abstracta y evaluadores de atributos. ANTLR está escrito en Java y genera: Java, C#, Javascript, Python2, Python3. Todos los detalles se encuentran en su página oficial: http://www.antlr.org/
Su funcionamiento básico es el siguiente:
Características:
A continuación se presenta un ejemplo de un árbol sintáctico generado por ANTLR v4 con los nombres de las clases:
Se puede observar que las hojas del árbol corresponden a nodos terminales y los demás nodos corresponden a alguna regla de producción de la gramática. Estos últimos objetos se conocen en ANTLR v4 como contextos (context) porque almacenan todo lo que sabemos del reconocimiento de una frase por una regla particular de la gramática. Cada contexto conoce su token inicial y final para la frase y proporciona acceso a todos los elementos de esa frase. Por ejemplo, AssignContext (Assign: ID TK_EQUAL expr) proporciona los métodos: ID() y expr() para acceder al nodo identificador y el subárbol de la expresión.
En algunas situaciones queremos controlar el recorrido del árbol, llamando a los métodos para visitar a los hijos de algún nodo de forma explícita. En este caso debemos usar la opción de ANTLR –visitor en la línea de comandos. Esta opción hace que ANTLR genere una interface de Visitor a partir de una gramática, la cual contiene un método visit() por cada una de las reglas. A continuación se puede ver el patrón de diseño visitor operando en nuestro árbol sintáctico:
Para dar inicio al recorrido del árbol, la aplicación creará una implementación del visitor y llamará al método visit() de la raíz del árbol (regla inicial de la gramática).
Al hacer esto, ANTLR al ver la regla inicial de la gramática, llamará al método visitStat(). A partir de aquí, la implementación de visitStat(), llamará al método visit() de los nodos hijos para continuar el recorrido del árbol. También se pueden llamar los métodos explícitamente de la forma visitAssign().