analisis sintactico el análisis gramatical es la tarea de determinar la sintaxis, o estructura, de...

70
ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como análisis sintáctico. La sintaxis de un lenguaje de programación por lo regular se determina mediante las reglas gramaticales de una gramática libre de contexto, de manera similar como se determina mediante expresiones regulares la estructura léxica de los tokens reconocida por el analizador léxico.

Upload: marianela-pio

Post on 11-Apr-2015

113 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como análisis sintáctico. La sintaxis de un lenguaje de programación por lo regular se determina mediante las reglas gramaticales de una gramática libre de contexto, de manera similar como se determina mediante expresiones regulares la estructura léxica de los tokens reconocida por el analizador léxico.

Page 2: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

En realidad, una gramática libre de contexto utiliza convenciones para nombrar y operaciones muy similares a las correspondientes en las expresiones regulares. Con la única diferencia de que las reglas de una gramática libre de contexto son recursivas. Por ejemplo, la estructura de una sentencia if debe permitir en general que otras sentencias if estén anidadas en ella, lo que no se permite en las expresiones regulares.

Page 3: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Este cambio aparentemente elemental para el poder de la representación tiene enormes consecuencias. La clase de estructuras reconocible por las gramáticas libres de contexto se incrementa de manera importante en relación con las de las expresiones regulares. Los algoritmos empleados para reconocer estas estructuras también difieren mucho de los algoritmos de análisis léxico, ya que deben utilizar llamadas recursivas o una pila de análisis sintáctico explícitamente administrada.

Page 4: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Las estructuras de datos utilizadas para representar la estructura sintáctica de un lenguaje ahora también deben ser recursivas en lugar de lineales (como lo son para lexemas y tokens). La estructura básica empleada es por lo regular alguna clase de árbol, que se conoce como árbol de análisis gramatical o árbol sintáctico.

Page 5: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

EL PROCESO DEL ANÁLISIS SINTÁCTICOLa tarea del analizador sintáctico es determinar la estructura sintáctica de un programa a partir de los tokens producidos por el analizador léxico y, ya sea de manera explícita o implícita, construir un árbol de análisis gramatical o árbol sintáctico que represente esta estructura. De este modo, se puede ver el analizador sintáctico como una función que toma como su entrada la secuencia de tokens producidos por el analizador léxico y que produce como su salida el árbol sintáctico.

analizador sintáctico

secuencia de tokens —————————» árbol sintáctico

Page 6: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

La estructura del árbol sintáctico depende en gran medida de la estructura sintáctica particular del lenguaje. Este árbol por lo regular se define como una estructura de datos dinámica, en la cual cada nodo se compone de un registro cuyos campos incluyen los atributos necesarios para el resto del proceso de compilación (es decir, no sólo por aquellos que calcula el analizador sintáctico).

Page 7: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Un problema más difícil de resolver para el analizador sintáctico que para el analizador léxico es el tratamiento de los errores. En el analizador léxico, si hay un carácter que no puede ser parte de un token legal, entonces es suficientemente simple generar un token de error y consumir el carácter problemático. (En cierto sentido, al generar un token de error, el analizador léxico transfiere la dificultad hacia el analizador sintáctico.)

Page 8: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Por otra parte, el analizador sintáctico no sólo debe mostrar un mensaje de error, sino que debe recuperarse del error y continuar el análisis sintáctico (para encontrar tantos errores como sea posible). En ocasiones, un analizador sintáctico puede efectuar reparación de errores, en la cual infie re una posible versión de código corregida a partir de la versión incorrecta que se le haya presentado.

Page 9: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Un aspecto particularmente importante de la recuperación de errores es la exhibición de mensajes de errores signifi cativos y la reanudación del análisis sintáctico tan próximo al error real como sea posible. Esto no es fácil, puesto que el analizador sintáctico puede no descubrir un error sino hasta mucho después de que el error real haya ocurrido.

Page 10: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

GRAMÁTICAS LIBRES DE CONTEXTOUna gramática libre de contexto es una especificación para la estructura sintáctica de un lenguaje de programación. Una especificación así es muy similar a la especificación de la estructura léxica de un lenguaje utilizando expresiones regulares, excepto que una gramática libre de contexto involucra reglas de recursividad.

Page 11: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Comparación respecto a la notación de una expresión regularConsideremos cómo se compara la gramática libre de contexto con las reglas de la expresión regular:

número = dígito dígito* dígito digito=0|1|2|3|4|5|6I7|8I9

En las reglas de la expresión regular básica tenemos tres operaciones: selección (dada por el metasímbolo de la barra vertical), concatenación (dada sin un metasímbolo) y repetición (dada por el metasímbolo del asterisco).

Page 12: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

También empleamos el signo de igualdad para representar la definición de un nombre para una expresión regular, y escribimos el nombre en itálicas para distinguirlo de una secuencia de caracteres reales .

Las reglas gramaticales utilizan notaciones semejantes. Los nombres se escriben en cursivas o itálicas (pero ahora con una fuente diferente, de modo que podamos distinguirlas de los nombres para las expresiones regulares).

Page 13: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

La barra vertical todavía aparece como el metasímbolo para selección. La concatenación también se utiliza como operación estándar. Sin embargo, no hay ningún metasímbolo para la repetición (como el * de las expresiones regulares), Una diferencia adicional en la notación es que ahora utilizamos el símbolo de la flecha —» en lugar del de igualdad para expresar las definiciones de los nombres.

Page 14: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Esto se debe a que ahora los nombres no pueden simplemente ser reemplazados por sus definiciones, porque está implicado un proceso de definición más complejo, como resultado de la naturaleza recursiva de las Advierta también que las reglas gramaticales utilizan expresiones regulares como componentes.

Page 15: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Como las expresiones regulares, las reglas gramaticales están definidas sobre un alfabeto, o conjunto de símbolos. En el caso de expresiones regulares, estos símbolos por lo regular son caracteres. En el caso de reglas gramaticales, los símbolos son generalmente tokens que representan cadenas de caracteres.

Page 16: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Por ejemplo, representaremos el alfabeto de tokens para el lenguaje de programación X como el conjunto{if, then, else, end, repeat, until, read, write, ídentificador, número,+,-/*//,=,<,(,),;,:=}Dado un alfabeto, una regla gramatical libre de contexto en BNF se compone de una cadena de símbolos. El primer símbolo es un nombre para una estructura. El segundo símbolo es el metasímbolo "—»".

Page 17: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Este símbolo está seguido por una cadena de símbolos, cada uno de los cuales es un símbolo del alfabeto, un nombre para una estructura o el metasímbolo "I".

En términos informales, una regla gramatical en BNF se interpreta como sigue. La regla define la estructura cuyo nombre está a la izquierda de la flecha. Se define la estructura de manera que incluya una de las selecciones en el lado derecho separada por las barras verticales.

Page 18: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Las secuencias de símbolos y nombres de estructura dentro de cada selección definen el diseño de la estructura. Por ejemplo, considere las reglas gramaticales :

exp → exp op exp | (exp) | número

Op → + | - | *

Page 19: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

La primera regla define una estructura de expresión (con nombre exp) compuesta por una expresión seguida por un operador y otra expresión, por una expresión dentro de paréntesis, o bien por un número. La segunda define un operador (con nombre op) compuesto de uno de los símbolos +, - o *.

Page 20: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Los metasímbolos y convenciones que usamos aquí son semejantes a los de uso generalizado, pero es necesario advertir que no hay un estándar universal para estas convenciones. En realidad, las alternativas comunes para el metasímbolo de la flecha "—»" incluyen "=" (el signo de igualdad), ":" (el signo de dos puntos) y "::=" (signo de dos puntos doble y el de igualdad).

Page 21: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

En archivos de texto normales también es necesario hallar un reemplazo para el uso de las itálicas. Esto se hace frecuentemente encerrando los nombres de estructura con " < .. . >” y escribiendo los nombres de token en itálicas con letras mayúsculas.

Page 22: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

De este modo, con diferentes convenciones, las reglas gramaticales anteriores podrían aparecer como

<exp> ::= <exp> <op> <exp> I (<exp>) I NÚMERO

<op> ::= + | - | *

Page 23: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

En ocasiones, aunque los paréntesis son útiles para reasignar la precedencia en las expresiones regulares, conviene incluir paréntesis en los metasímbolos de la notación BNF.

Por ejemplo, se puede volver a escribir las reglas gramaticales anteriores como una sola regla gramatical de la manera siguiente:

exp —» exp ("+ " | “ - “ | “ * “) exp | "(" exp ")" | número

Page 24: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

En esta regla los paréntesis son necesarios para agrupar las opciones de los operadores entre las expresiones en el lado derecho, puesto que la concatenación tiene precedencia sobre la selección (como en las expresiones regulares). De este modo, la regla siguiente tendría un significado diferente (e incorrecto):exp —> exp "+ " | “ - “ | “ * “ exp | " (" exp ")" | número

Page 25: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Advierta también que, cuando se incluyen los paréntesis como metasímbolo, es necesario distinguir los tokens de paréntesis de los metasímbolos, lo que hicimos poniéndolos entre comillas, como hacíamos en el caso de expresiones regulares. (Para mantener la consistencia también encerramos los símbolos de operador entre comillas.)

Page 26: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Los paréntesis no son absolutamente necesarios como metasímbolos en BNF, ya que siempre es posible separar las partes entre paréntesis en una nueva regla gramatical. De hecho, la operación de selección que da el metasímbolo de la barra vertical tampoco es necesaria en reglas gramaticales, si permitimos que el mismo nombre aparezca cualquier número de veces a la izquierda de la flecha.

Page 27: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Por ejemplo, nuestra gramática de expresión simple podría escribirse como se aprecia a continuación:

exp → exp op expexp → (exp)exp → númeroop → +op → -op → *

Page 28: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Sin embargo, por lo regular describiremos reglas gramaticales de manera que todas las selecciones para cada estructura estén enumeradas en una sola regla, y cada nombre de estructura aparezca sólo una vez a la izquierda de la flecha.

Page 29: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

En ocasiones, por simplicidad, daremos ejemplos de reglas gramaticales en una notación abreviada. En estos casos utilizaremos letras en mayúsculas para nombres de estructura y letras en minúsculas para símbolos de token individuales (que con frecuencia son sólo caracteres simples). De este modo, nuestra gramática de expresión simple podría escribirse en esta forma abreviada de la manera que sigue:

E → E O E | (E) | n

Page 30: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

En ocasiones también simplificaremos la notación cuando estemos utilizando solamente caracteres como tokens y los estemos escribiendo sin utilizar una fuente de código:

E→ E O E | (E) | a

O → + | - | *

Page 31: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Las reglas gramaticales libres de contexto determinan el conjunto de cadenas sintácticamente legales de símbolos de token para las estructuras definidas por las reglas. Por ejemplo, la expresión aritmética

(34-3)*42corresponde a la cadena legal de siete tokens

( número - número ) * número

Page 32: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Donde los tokens de número tienen sus estructuras determinadas por el analizador léxico y la cadena misma es legalmente una expresión porque cada parte corresponde a selecciones determinadas por las reglas gramaticales

exp → exp op exp | (exp) | número

op → + | - | *

Page 33: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Por otra parte, la cadena

(34-3*42

No es una expresión legal, porque se tiene un paréntesis izquierdo que no tiene su correspondiente paréntesis derecho y la segunda selección en la regla gramatical para una expresión exp requiere que los paréntesis se generen en pares.

Page 34: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Las reglas gramaticales determinan las cadenas legales de símbolos de token por medio de derivaciones. Una derivación es una secuencia de reemplazos de nombres de estructura por selecciones en los lados derechos de las reglas gramaticales. Una derivación comienza con un nombre de estructura simple y termina con una cadena de símbolos de token. En cada etapa de una derivación se hace un reemplazo simple utilizando una selección de una regla gramatical

Page 35: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

(34-3)*42(1) exp exp op exp [exp→exp op exp]

(2) exp op número [exp →número]

(3) exp * número [op →*]

(4) (exp) * número [exp →(exp)]

(5) (exp op exp) * número [exp →exp op exp]

(6) (exp op número) * número [exp → número]

(7) (exp – número) * número [op → -]

(8) (número - número)*número [exp → número]

Page 36: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Advierta que los pasos de derivación utilizan una flecha diferente al metasímbolo de flecha que se emplea en las reglas gramaticales. Esto se debe a que existe una diferencia entre un paso de derivación y una regla gramatical: las reglas gramaticales definen, mientras que los pasos de derivación construyen mediante reemplazo

Page 37: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

El conjunto de todas las cadenas de símbolos de token obtenido por derivaciones del símbolo exp es el lenguaje definido por la gramática de expresiones. Este lenguaje contiene todas las expresiones sintácticamente legales. Podemos escribir esto de manera simbólica como:

L(G) = { s | exp *s }

Page 38: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

donde G representa la gramática de expresión, s representa una cadena arbitraria de símbolos de token (en ocasiones denominada sentencia), y los símbolos * representan una derivación compuesta de una secuencia de reemplazos como se describieron anteriormente. (El asterisco se utiliza para indicar una secuencia de pasos, así como para indicar repetición en expresiones regulares.) Las reglas gramaticales en ocasiones se conocen como producciones porque "producen" las cadenas en L(G) mediante derivaciones.

Page 39: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Cada nombre de estructura en una gramática define su propio lenguaje de cadenas sintácticamente legales de tokens. Por ejemplo, el lenguaje definido por op en nuestra gramá tica de expresión simple define el lenguaje {+, -, *} compuesto sólo de tres símbolos.

Page 40: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Por lo regular estamos más interesados en el lenguaje definido por la estructura más general en una gramática. La gramática para un lenguaje de programación a menudo define una estructura denominada programa, y el lenguaje de esta estructura es el conjunto de todos los programas sintácticamente legales del lenguaje de programación (advierta que aquí utilizamos la palabra "lenguaje" en dos sentidos diferentes).

Page 41: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Por ejemplo, un BNF para un lenguaje de programación X comenzará con reglas gramaticales tales como:

programa → encabezado-programa ; bloque-programa . encabezado-programa → . . .

bloque-programa → . . .

Page 42: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Considere la gramática G con la regla gramatical simple

E → E + a | aEsta gramática genera todas las cadenas compuestas de a separadas por signos de "más" (+):

L(G) = {a, a + a, a + a + a, a + a + a + a, ...}Para ver esto (de manera informal), considere el efecto de la regla E → E + a: esto provoca que la cadena + a se repita sobre la derecha en una derivación:

E E + a E + a + a E + a + a + a ….Finalmente, debemos reemplazar la E a la izquierda utilizando el caso base E → a

Page 43: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Podemos demostrar esto más formalmente mediante inducción como sigue. En primerlugar, mostramos que toda cadena a + a + ••• + a está en L(G) por inducción en el número de las a.

La derivación E a muestra que a está en L(G); suponga ahora que s = a + a+ ••• + a, con n — 1 a, está en L(G).

Page 44: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

De este modo, existe una derivación E =>* s: ahorala derivación E => E + a * s + a muestra que la cadena s + a, con n + a, está en L(G).A la inversa, también mostramos que cualquier cadena s de L(G) debe ser de la forma a +a + ••• + a.

Mostramos esto mediante inducción sobre la longitud de una derivación. Si laderivación tiene longitud 1, entonces es de la forma E => a, así que s es de la forma correcta.

Page 45: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Ahora, suponga la veracidad de la hipótesis para todas las cadenas con derivaciones delongitud n — 1, y sea E =>* s una derivación de longitud n > 1. Esta derivación debe comenzar con el reemplazo de E por E + a, y de esta manera será de la forma E => E + a =>*s' + a = s. Entonces, s' tiene una derivación de longitud n - 1, y de este modo será de laforma: a + a + ••• + a. Por lo tanto, s misma debe tener esta misma forma.

Page 46: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Considere la siguiente gramática muy simplificada de sentencias:sentencia → sent-if | otro sent-if → if ( exp ) sentencia

| if (exp) sentencia else sentenciaexp → 0 | 1El lenguaje de esta gramática se compone de sentencias if anidadas de manera semejante al lenguaje C

Page 47: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Simplificamos las expresiones de prueba lógica ya sea a O o a 1, y agrupamos todas las otras sentencias aparte de las sentencias if en el terminal otro. Ejemplos de cadenas en este lenguaje sonotroif (0) otroif (1) otroif (0) otro else otroif (1) otro else otroif (0) if (0) otroif (0) if (1) otro else otroif (1) otro else if (0) otro else otro

Page 48: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Árboles de análisis gramatical

Una derivación proporciona un método para construir una cadena particular de terminales a partir de un no terminal inicial. Pero las derivaciones no sólo representan la estructura de las cadenas que construyen. En general, existen muchas derivaciones para la misma cadena. Por ejemplo, construyamos la cadena de tokens

( número - número ) * número

Page 49: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

A partir de nuestra gramática de expresión simple utilizando la derivación anterior y una segunda derivación para esta cadena se proporciona:(1) exp exp op exp [exp→exp op exp]

(2) (exp) op exp [exp → (exp)]

(3) (exp op exp) op exp [exp → exp op exp]

(4) (número op exp) op exp [exp → número]

(5) (número - exp ) op exp [op → -]

(6) (número - número) op exp [exp → número]

(7) (número - número) * exp [op → *]

(8) (número - número) *número [exp → número]

Page 50: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

La única diferencia entre las dos derivaciones es el orden en el cual se suministran los reemplazos, y ésta es de hecho una diferencia superficial. Para aclarar esto necesitamos una representación para la estructura de una cadena de terminales que abstraiga las características esenciales de una derivación mientras se factorizan las diferencias superficiales de orden. La representación que hace esto es una estructura de árbol, y se conoce como árbol de análisis gramatical

Page 51: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Un árbol de análisis gramaticalUn árbol de análisis gramatical correspondiente a una derivación es un árbol etiquetado en el cual los nodos interiores están etiquetados por no terminales, los nodos hoja es tán etiquetados por terminales y los hijos de cada nodo interno representan el reemplazo del no terminal asociado en un paso de la derivación.

Page 52: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Para dar un ejemplo simple, la derivación

exp => exp op exp

=> número op exp=> número + exp=> número+número

corresponde al árbol de análisis gramatical

número número+

Page 53: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

El primer paso en la derivación corresponde a los tres hijos del nodo raíz. El segundo paso corresponde al hijo número de la exp en el extremo izquierdo debajo de la raíz, y de manera similar para los dos pasos restantes. Podemos hacer esta correspondencia explícita al numerar los nodos internos del árbol de análisis gramatical mediante el número de paso en el cual se reemplaza su no terminal asociado en una derivación correspondiente. De este modo, si numeramos la derivación anterior como sigue:

Page 54: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

(1)exp exp op exp

(2) número op exp

(3) número + exp

(4) número + número

podemos numerar los nodos internos del árbol de análisis gramatical respectivamente

número número

1 exp

2 exp

+

Page 55: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

La expresión (34-3)*42 genera un árbol sintáctico.

Page 56: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Considere la gramática para las sentencias if simplificadassentencia → sent-if | otro sent-if → if ( exp ) sentencia

| if (exp) sentencia else sentenciaexp → 0 | 1El árbol de análisis gramatical para la cadena:if (0) otro else otro es como se presenta a continuación:

Page 57: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Page 58: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICOConsidere la gramática de una secuencia de sentencias separadas por signos de punto y coma del ejemplo :secuencia-sent —> sent ; secuencia-sent | sentsent —» sLa cadena s;s;s tiene el siguiente árbol de análisis gramatical respecto a esta gramática:

Page 59: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Un posible árbol sintáctico para esta misma cadena es:

Page 60: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Gramáticas ambiguasLos árboles de análisis gramatical y los árboles sintácticos expresan de manera única la estructura de la sintaxis, y efectúan derivaciones por la izquierda y por la derecha, pero no derivaciones en general. Desgraciadamente, una gramática puede permitir que una cadena tenga más de un árbol de análisis gramatical. Considere, por ejemplo, la gramática de la aritmética entera simple que hemos estado utilizando como ejemplo estándar

Page 61: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

exp —> exp op exp | ( exp ) | númeroop —> + | - | *y considere la cadena 34-3*42. Esta cadena tiene dos árboles de análisis gramatical diferentes

Page 62: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

correspondientes a las dos derivaciones por la izquierda

Page 63: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Page 64: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Page 65: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Precedencia y Asociatividad

Para manejar la precedencia de las operaciones en la gramática debemos agrupar los opera dores en grupos de igual precedencia, y para cada precedencia debemos escribir una regla diferente. Por ejemplo, la precedencia de la multiplicación sobre la suma y la resta se puede agregar a nuestra gramática de expresión simple como se ve a continuación:

Page 66: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

exp → exp opsuma exp | term opsuma → + -term → term opmult term | factor opmult → *factor → (exp) | númeroEn esta gramática la multiplicación se agrupa bajo la regla term, mientras que la suma y la resta se agrupan bajo la regla exp. Como el caso base para una exp es un term, esto significa que la suma y la resta aparecerán "más altas" (es decir, más cercanas a la raíz) en los árboles de análisis gramatical y sintáctico, de manera que reciben una precedencia más baja.

Page 67: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Esta última gramática para expresiones aritméticas simples todavía no especifica la asociatividad de los operadores y aún es ambigua. La causa es que la recursión en ambos lados del operador permite que cualquier lado iguale repeticiones del operador en una derivación (y, por lo tanto, en los árboles de análisis gramatical y sintáctico). La solución es reemplazar una de las recursiones con el caso base, forzando las coincidencias repetitivas en el lado en que está la recursión restante. Por consiguiente, reemplazando la regla:

exp → exp opsuma exp |termpor

exp → exp opsuma term | term

Page 68: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Ahora el árbol de análisis gramatical para la expresión 34 – 3 – 42 es:

Page 69: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO

Considere la Gramática :sentencia → sent-if | otro sent-if → if ( exp ) sentencia

| if (exp) sentencia else sentenciaexp → 0 | 1Esta gramática es ambigua como resultado del else opcional. Para ver esto considere la cadenaif (0) if (1) otro else otro Esta cadena tiene los dos árboles de análisis gramatical:

Page 70: ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como

ANALISIS SINTACTICO