Características de las Gramáticas

Siguiendo las construcciones mostradas anteriormente, ya se puede crear una gramática que exprese la sintaxis que debe tener toda entrada válida.

Ahora, para saber si una entrada es válida, basta con buscar un camino desde el símbolo inicial de la gramática hasta la cadena de entrada realizando transformaciones con las producciones de la gramática. El código que hace esta búsqueda se llama parser y, tal y como se vio, hay varias formas de implementarlo. En concreto se vio cómo implementar un parser LL(1) de manera manual mediante la técnica recursiva descendente.

Se comentó, además, que las técnicas predictivas no eran aptas para implementar cualquier gramática. En concreto, las gramáticas que pueden ser implementadas con un parser LL(1) reciben el mismo nombre que este — gramáticas LL(1).

Por tanto, antes de implementar una gramática con esta técnica, hay que asegurarse de que dicha gramática cumple los requisitos para ser implementada por ella. El cumplir los requisitos básicamente asegura que, a la hora de tener que elegir una regla de entre varias candidatas, el mirar el siguiente token siempre va a ayudar a decidir cuál de ellas es la adecuada en cualquier situación que se presente a la entrada. Esta comprobación de la gramática se puede hacer tanto a mano (siguiendo el algoritmo clásico) o bien mediante alguna herramienta.

El algoritmo para comprobar si una gramática cumple los requisitos para ser LL(1) no se verá por falta de tiempo. Sin embargo, lo que sí se hará en las siguientes páginas es mostrar algunas situaciones habituales que se pueden presentar en una gramática que impiden que esta sea LL(1). Estas situaciones no pretenden ser un sustituto del algoritmo de comprobación — ya que no lo son. Lo único que se pretende mostrando estas situaciones es:

  • Que se tenga, al menos, una idea intuitiva de cómo son las gramáticas LL(1).
  • Y, sobre todo, que se vea cómo maneja ANTLR esas situaciones y utilizarlas así como una forma de profundizar en el conocimiento de la herramienta (que es el verdadero objetivo de este capítulo).

Las situaciones que se van a ver, y que impiden a una gramática ser LL(1), son:

Nota

📌 En realidad, las dos últimas situaciones son casos particulares de la primera, que es la causa final por la que una gramática no puede ser LL(1).

Para cada una de ellas se verá cuál es el problema que plantean, qué opciones se tienen si se presentan y cómo las trata ANTLR.