Implementación de un Parser

Implementar un parser, como se ha visto anteriormente, es implementar un programa que, ante una entrada y una gramática, sea capaz de encontrar un camino desde el símbolo inicial hasta dicha entrada realizando las transformaciones que permitan las reglas de la gramática.

Se ha visto también que existen multitud de algoritmos para hacer esto. Se mostrará a continuación como implementar un parser mediante uno de los algoritmos existentes.

Pero antes de ver cómo se implementa hay que tener claro como se usa un analizador sintáctico ya hecho (visto desde el exterior).

Uso de un Parser

A diferencia del analizador léxico, el análisis sintáctico es una única llamada (no se invoca dentro de un bucle). En esa única llamada intenta buscar el camino (si existe) entre el símbolo inicial de la cadena y la entrada que le facilite el léxico (el cual se suele pasar en el constructor).

Lexicon lexer = new Lexicon(CharStreams.fromFileName("source.txt"));
Parser parser = new Parser(lexer);

parser.start(); // Buscar el camino

// Comprobar aquí si hubo éxito

A la vuelta de la llamada, el parser indicará de alguna manera (que dependerá de la implementación) si ha tenido éxito o no ha encontrado el camino, es decir, si la entrada es válida o no.

Formas de Implementación

Ahora llega el momento de implementar ese método start del apartado anterior que procese toda la entrada e indique si es válida o no.

Al igual que ocurría con el analizador léxico, esto puede hacer de dos maneras: de forma manual o con herramienta.

Las diferencias son las mismas que en el léxico. Las herramientas ofrecen rapidez y comodidad de desarrollo a costa de eficiencia y control.

Es conveniente ver, al menos, los conceptos básicos de cómo se implementa un parser de forma manual. Los motivos son:

  • No siempre habrá una herramienta disponible en el entorno en el que se tenga que implementar.
  • Si es sencilla la entrada, no merece la pena el sobrecoste de una herramienta.
  • Sabiendo, a grandes rasgos, cómo se hace a mano, se entenderá mejor lo que hace el código que generan las herramientas descendentes (como ANTLR).

En los siguientes capítulos se verá cómo implementar un parser de forma manual y cómo hacerlo con una herramienta.