Skip to content

Implementación del Parser

Una vez llegados a este capítulo, se está en la siguiente situación:

  • Se tiene hecho un analizador sintáctico en Grammar.g4 (creado en el capítulo anterior) que es capaz de validar la entrada, pero que no genera ninguna salida.
  • Se tienen implementados los nodos (creados en el apartado anterior) con los que se podrán crear los árboles que representen las entradas del compilador.

Ahora sólo queda unir ambas piezas. Es decir, habrá que añadir a la gramática del fichero Grammar.g4 las acciones que hagan los new de los nodos del árbol.

Pero antes de ello, hay que hacer una pequeña modificación en el fichero /src/main/Main.java para que recoja el árbol que el parser va a generar. Para ello, en el método Main.compile, hay que comentar la llamada actual a parser.start() y sustituirla por la sentencia que está comentada debajo de ella. Deberá quedar de la siguiente manera:

java
public class Main {

    public static void main(String[] args) throws Exception {
        ...
    }

    public static AST compile(String sourceName, ErrorManager errorManager) throws Exception {

        ...

        // IMPORTANT: When the AST has been generated, swap the following two lines of code.
        // parser.program();
        ast = parser.program().ast;

    }
}

Ahora ya se puede añadir el código que crea el árbol. Para ello, se van a mostrar tres opciones a la hora de añadir las acciones (de más simples a más sofisticadas). Aunque cualquiera de ellas se podría haber propuesto como solución para este tutorial, se ha decidido poner todas para que el alumno pueda practicar con distintas formas de uso de las acciones en Antlr.

La opciones presentadas en los siguientes apartados son:

  • Versión Básica. Esta solución no almacena las posiciones del fichero en el AST.
  • Versión Regular (requiere VGen). Esta versión sí almacena las posiciones del fichero en el AST .
  • Versión Avanzada (requiere VGen). Además de almacenar las posiciones del fichero, se simplifica la gramática al usar el operador += de Antlr.