1.3.3. Análisis Sintáctico

 

El análisis jerárquico se denomina análisis sintáctico. Este implica agrupar los componentes léxicos del programa fuente en frases gramaticales que el compilador utiliza para sintetizar la salida. Por lo general, Ias frases gramaticales del programa fuente se representan mediante un árbol de análisis sintáctico como sé que se ilustra en Ia figura 1.4

 

Figura 1.4

 

 

En Ia expresión inicial + velocidad * 60, Ia frase velocidad * 60 es una unidad lógica, porque las convenciones usuales de Ias expresiones aritméticas indican que Ia multiplicación se hace antes que Ia suma. Puesto que Ia expresión inicial + velocidad va seguida de un * no se agrupa en una sola frase independiente en la figura 1.4.

La estructura jerárquica de un programa normalmente se expresa utilizando reglas recursivas. Por ejemplo, se pueden dar las siguientes reglas como parte de la definición de expresiones:

1. Cualquier identificador es una expresión.

2. Cualquier número es una expresión.

3. Si expresión1 y expresión2 son expresiones, entonces también lo son

expresión1 + expresión2

expresión1 * expresión2

(expresión1)

 

Las regIas (1) y (2) son reglas básicas (no recursivas), en tanto que la regla (3) define expresiones en función de operadores aplicados a otras expresiones Así, por Ia regla (1), inicial y velocidad son expresiones. Por Ia regla (2), 60 es una expresión, mientras que por Ia regIa (3), primero podemos inferir que velocidad*60 es una expresión, y finalmente, que inicial + velocidad*60 también es una expresión.

De manera similar, muchos lenguajes definen recursivamente las proposiciones mediante reglas como:

1. Si idenificador1 es un identificador y expresión2 es una expresión, entonces

identificador1:= expresion2

Es una proposición.

2. Si expresión1 es una expresión y proposición2 es una proposición, entonces

                                while ( expresión1 ) do proposición2

                                if expresión1 ) then propocisión2

Son proposiciones.

La división entre análisis léxico y análisis sintáctico es algo arbitraria. Generalmente se elige una división que simplifique la tarea completa del análisis. Un factor para determinar La división es si una construcción del lenguaje fuente es inherentemente recursiva o no. Las construcciones léxicas no requieren recursión, mientras que las construcciones sintácticas suelen requerirla. Las gramáticas independientes del contexto son una formalización de reglas recursivas que se pueden usar para guiar el análisis sintáctico.

Por ejemplo, no se requiere recursión para reconocer los identificadores, que suelen ser cadenas de letras y dígitos que comienzan con una letra. Normalmente, se reconocen los identificadores por el simple examen del flujo de entrada, esperando hasta encontrar un carácter que no sea ni letra ni dígito, y agrupando después todas las letras y dígitos encontrados hasta ese punto en un componente Léxico identificador. Los caracteres así agrupados se registran en una tabla, llamada tabla de símbolos, y se retiran de la entrada, para que pueda empezar el procesamiento del siguiente elemento léxico.

 Por otra parte, esta clase de análisis léxico lineal no es suficientemente poderoso para analizar expresiones o proposiciones. Por ejemplo, no podemos emparejar de manera apropiada los paréntesis de las expresiones, o las palabras begin y end en proposiciones sin imponer alguna clase de estructura jerárquica o de anidamiento a la entrada.

El árbol de análisis sintáctico de la figura 1.4 describe la estructura sintáctica de la entrada. Una representación interna más común de esta estructura sintáctica es la que da el árbol sintáctico de b figura 1.5(a). 

Figura 1.5