Misión del Analizador Sintáctico

En el tema anterior se vio cómo el analizador léxico, a partir de los caracteres de la entrada, separaba los lexemas y los entregaba asociados a tokens. Dicha fase no tenía como misión el comprobar si éstos estaban en el orden adecuado; sólo se ocupaba de comprobar si cada uno de ellos era un elemento válido del lenguaje, aunque estuvieran desordenados.

Lo que hace el Sintáctico

Ahora es el turno del análisis sintáctico. Esta fase tiene como misión realizar dos importantes tareas:

  1. Identificar estructuras.
  2. Construir un árbol.

Identificar Estructuras

Lo tarea fundamental del analizador sintáctico es identificar qué estructuras del lenguaje forman esos tokens que recibe. Debe determinar si, por ejemplo, con dichos lexemas el usuario estaba expresando un while, una definición de variable, una función, etc.

Todo token debe formar parte de alguna estructura y, normalmente, habrá estructuras que serán a su vez componentes de otras estructuras mayores que habrá que identificar también. Por ejemplo, una vez identificada una estructura de comparación de dos variables, se utilizará ésta para identificar la estructura mayor while de la que forma parte (la condición de dicho bucle).

Este tema presentará una visión general de esta etapa: de cómo se especifica a cómo se implementa un analizador sintáctico. El siguiente tema seguirá tratando esta etapa pero con mayor detalle.

Construir un Árbol

Una vez encontradas las estructuras del programa, el sintáctico debe indicar a las fases posteriores cuáles ha encontrado, dónde y con qué elementos se han formado cada una. Para ello, debe proveer dicha información en una estructura de datos en forma de árbol.

El modelar la entrada en forma de árbol permitirá a las fases posteriores del procesador moverse por las distintas estructuras del programa de una manera más fácil y ágil.

La etapa de construir el árbol se tratará en un tema posterior, ya que el tema actual y el siguiente se centran sólo en la etapa encargada de identificar estructuras.

Lo que NO hace el Sintáctico

Para dejar más claro lo que hace el analizador sintáctico, se va a incidir en lo que no hace. El hecho de que se pueda formar el árbol no quiere decir que lo que ha escrito el usuario sea un programa correcto y ejecutable. El sintáctico se limita a pasar el programa de un formato de texto a un formato arbóreo, aunque el programa esté mal. Sólo se preocupa de que cada estructura tenga todas sus partes y que éstas estén ordenadas. Por ejemplo:

  • Solo mira que después del print haya una variable; pero le es indiferente si dicha variable ha sido definida o no. En el árbol se limita a reflejar lo que puso el usuario, es decir, que había un print seguido de una variable.
  • Sólo mira si la suma tiene dos operandos y, si es así, crea una rama para dicha estructura indicando cuáles son los dos operandos. No le importa que lo que se esté sumando sea, por ejemplo, un array con una estructura (lo cual no es válido - pero será detectado por una fase posterior).

En definitiva, al analizador sintáctico le es indiferente que las sentencias sean inválidas mientras estén bien formadas. Será la siguiente fase, el análisis semántico, la que se encargue de detectar todos estos errores.