La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

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.

Presentaciones similares


Presentación del tema: "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."— Transcripción de la presentación:

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 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.

2 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.

3 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.

4 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.

5 analizador sintáctico
ANALISIS SINTACTICO EL PROCESO DEL ANÁLISIS SINTÁCTICO La 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

6 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).

7 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.)

8 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.

9 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.

10 GRAMÁTICAS LIBRES DE CONTEXTO
ANALISIS SINTACTICO GRAMÁTICAS LIBRES DE CONTEXTO Una 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.

11 número = dígito dígito* dígito
ANALISIS SINTACTICO Comparación respecto a la notación de una expresión regular Consideremos 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).

12 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).

13 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.

14 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.

15 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.

16 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 "—»".

17 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.

18 exp → exp op exp | (exp) | número
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 → + | - | *

19 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 *.

20 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).

21 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.

22 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> ::= + | - | *

23 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

24 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

25 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.)

26 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.

27 ANALISIS SINTACTICO Por ejemplo, nuestra gramática de expresión simple podría escribirse como se aprecia a continuación: exp → exp op exp exp → (exp) exp → número op → + op → - op → *

28 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.

29 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

30 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 → + | - | *

31 corresponde a la cadena legal de siete tokens
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)*42 corresponde a la cadena legal de siete tokens ( número - número ) * número

32 exp → exp op exp | (exp) | número op → + | - | *
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 → + | - | *

33 Por otra parte, la cadena (34-3*42
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.

34 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

35 (34-3)*42 ANALISIS SINTACTICO (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)]  (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]

36 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

37 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 }

38 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.

39 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.

40 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).

41 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 → . . .

42 E  E + a  E + a + a  E + a + a + a  ….
ANALISIS SINTACTICO Considere la gramática G con la regla gramatical simple E → E + a | a Esta 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

43 ANALISIS SINTACTICO Podemos demostrar esto más formalmente mediante inducción como sigue. En primer lugar, 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).

44 ANALISIS SINTACTICO De este modo, existe una derivación E =>* s: ahora la 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 la derivación tiene longitud 1, entonces es de la forma E => a, así que s es de la forma correcta.

45 ANALISIS SINTACTICO Ahora, suponga la veracidad de la hipótesis para todas las cadenas con derivaciones de longitud 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 la forma: a + a + ••• + a. Por lo tanto, s misma debe tener esta misma forma.

46 Considere la siguiente gramática muy simplificada de sentencias:
ANALISIS SINTACTICO Considere la siguiente gramática muy simplificada de sentencias: sentencia → sent-if | otro sent-if → if ( exp ) sentencia | if (exp) sentencia else sentencia exp → 0 | 1 El lenguaje de esta gramática se compone de sentencias if anidadas de manera semejante al lenguaje C

47 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 son otro if (0) otro if (1) otro if (0) otro else otro if (1) otro else otro if (0) if (0) otro if (0) if (1) otro else otro if (1) otro else if (0) otro else otro

48 ( número - número ) * número
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

49 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]  (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]

50 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

51 ANALISIS SINTACTICO Un á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.

52 Para dar un ejemplo simple, la derivación exp => exp op exp
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 +

53 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:

54 ANALISIS SINTACTICO exp  exp op exp  número op exp (3)  número + exp  número + número podemos numerar los nodos internos del árbol de análisis gramatical respectivamente 1 exp 2 exp número + número

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

56 ANALISIS SINTACTICO Considere la gramática para las sentencias if simplificadas sentencia → sent-if | otro sent-if → if ( exp ) sentencia | if (exp) sentencia else sentencia exp → 0 | 1 El árbol de análisis gramatical para la cadena: if (0) otro else otro es como se presenta a continuación:

57 ANALISIS SINTACTICO

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

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

60 ANALISIS SINTACTICO Gramáticas ambiguas Los á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

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

62 ANALISIS SINTACTICO correspondientes a las dos derivaciones por la izquierda

63 ANALISIS SINTACTICO

64 ANALISIS SINTACTICO

65 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:

66 ANALISIS SINTACTICO exp → exp opsuma exp | term opsuma → + -
term → term opmult term | factor opmult → * factor → (exp) | número En 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.

67 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 |term por exp → exp opsuma term | term

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

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

70 ANALISIS SINTACTICO


Descargar ppt "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."

Presentaciones similares


Anuncios Google