Construyendo el compilador Parte III: ANTLR V4, Listener vs Visitor y la tabla de Símbolos

 Es importante destacar que en ocasiones no sabemos la orientación o guia que debemos tener. Pues bien, cuando empecé el proyecto de armar un compilador, no tenía entendido a cabalidad la parte del papel que tendría la tabla de simbolos acá. 

La tabla es el símil del disco duro. Los métodos y el recorrido del árbol nos permiten acceder a los nodos pero esto es "volátil" similar a la memoria ram de una computadora. Entonces, es válido el poder decir que esta metáfora ayuda a visualizar el papel de la tabla de símbolos. Pero, ¿porque es volátil los métodos?


Resulta que ANTLR V4 probee dos formas de recorrer un árbol: listeners y visitor.

  • Listener: permite recorrer automáticamente el árbol, y provee de métodos de "entrada" y "salida" de cada regla definida en la gramática.
  • Visitor: da mas control al momento de iterar el árbol, pero no se recorre automáticamente sino en el orden indicado.

Yo preferí trabajar con listener. Debido a que es mas sencillo y simple hacerlo para mi persona asi. Acá hay una imagen de la diferencia entre listener y visitor.

Listener

Visitor



Como vemos, abarcan de distinta forma las expresiones. 
Una vez elegido el tipo de recorrido a usar, (listener en nuestro caso) ANTLR ahora nos da los métodos. Como estos son volátiles y cambian cada vez que cambiamos de nodo, debemos tener en cuenta que es probable que no podamos ser capaces de hacer condiciones anidadas haciendo uso de valores de otro nodo. Para eso existe la tabla de símbolos.

Provee la estructura de datos que no es volátil y que guarda informacion como el tipo de variable, nombre, offset, correlativo, método, scope, etc.
El diseño propuesto es este:





Como apreciamos, la idea es guardar la data de todo. 
De esta forma, tenemos ahora nuestra tabla y nuestro recorrido.

A programar!
























Comentarios

Entradas populares de este blog

Construyendo el compilador Parte I: ANTLR V4 (ya van 4 versiones, increible), café y una miradita a los parser y lexer generados con Java

Construyendo el compilador Parte V: Finalizando el analizar Semántico