Resumen

En este tema se han visto los siguientes conceptos:

  • La misión del analizador sintáctico es comprobar si los tokens que recibe del léxico forman estructuras válidas del lenguaje (si están todos los que componen una estructura y en el orden adecuado).
  • Para ello necesita tener definido qué estructuras son válidas. Esto se hace mediante una gramática (en notación BNF o EBNF).
  • Una entrada será válida si, usando las reglas de la gramática, se puede llegar desde el símbolo inicial hasta dicha entrada.
  • Hay varios algoritmos para buscar la secuencia de aplicación de reglas necesaria para llegar a la entrada.
    • No todos valen para todas las gramáticas.
    • Antes de usar un algoritmo, hay que asegurarse que vale para la gramática a implementar. En caso contrario, hay que cambiar uno de los dos.
  • Entre otras cosas, dos aspectos que caracterizan a los algoritmos son:
    • En qué dirección realizan el reconocimiento (ascendente o descendente).
    • Qué criterio siguen para elegir entre varias reglas candidatas (si son deterministas o no).
  • Las gramáticas toman su nombre del parser con el que pueden ser implementadas. Por ejemplo, que una gramática sea LL(3) quiere decir que puede ser implementada con un parser del mismo nombre.
  • La técnica Recursiva Descendente sirve para implementar gramáticas LL(1). Son aquellas gramáticas en las que mirando el siguiente token se sabe siempre qué regla aplicar.
    • Es una técnica sencilla y eficaz que puede hacerse a mano.
  • ANTLR utiliza una técnica LL(*) que mira tantos tokens hacia adelante como sea necesario.
    • Esta técnica más potente, pero requiere el uso de una herramienta.