Skip to content

Versión Avanzada

Creación del Parser

Esta última solución aprovecha el operador += de Antlr, simplificando así la gramática.

El operador +=, aplicado a un símbolo que tenga el operador * o +, añade automáticamente a una lista todos los nodos que se obtentan de la repetición del símbolo. Concretamente crea una List<ParserRuleContext>.

  • Si se ha realizado una implementación manual de los nodos, habrá que añadir el código que recorrar dicha lista y extraiga de cada ParserRuleContext el nodo del ast que se encuentra dentro de cada uno.
  • Si los nodos se han creado con VGen, en cada uno ya se ha generado un constructor que está preparado para recibir las listas del operador += y extraer los nodos de ellos automáticamente y añadirlos como hijos del nodo.

TIP

Para más información sobre el operador += se recomienda leer su descripción y su uso práctico.

Usando esta funcionalidad de VGen, el parser en Antlr quedaría así:

java
program returns[Program ast]
	: 'DATA' definitions+=varDefinition* 'CODE' statements+=statement* EOF
         { $ast = new Program($definitions, $statements); }
	;

// Ya no son necesarios 'varDefinitions' ni 'statements':
// varDefinitions returns[...]
// statements returns[..]

// El resto se quedan igual
varDefinition ...
type ...
statement ...
expression ...

Ejecución

La ejecución de esta versión es idéntica a la versión regular, por lo que no es necesario mostrar el AST generado. Esta versión avanzada no trataba de cambiar el AST, sino de simplificar el código del parser. En este lenguaje tan sencillo, en el que había sólo dos listas, no se aprecia mucho la diferencia, pero en lenguajes más complejos, el código del parser se simplificará notablemente.

Entre esta versión y la anterior, se deja a la decisión del alumno cuál prefiere implementar. En cualquier caso, la que no se recomienda es la versión básica, ya que no se dispone en el AST de las posiciones del fichero y, por tanto, cuando en fases posteriores se necesite esta información para notificar errores, no estará disponible.