UNIVERSIDAD DE SAN CARLOS DE GUATEMALA -USAC-
CENTRO UNIVERSITARIO DE ORIENTE -CUNORI-
FACULTAD DE INGENIERÍA
LAB. DE LENGUAJES FORMALES Y DE PROGRAMACIÓN ING. AUDER
PROYECTO DE ÁRBOLES DE DERIVACIÓN.
LUIS FELIPE DUBÓN OBANDO NO. CARNÉ: 201442782 CÉSAR EMILIO CASASOLA MIRANDA NO. CARNÉ: 201244716 INGENIERÍA EN CIENCIAS & SISTEMAS 6/10/ 2015
CHIQUIMULA, GUATEMALA.
INDICE
Introducción ……… 1 Objetivos .…...……… 2
-Objetivo General -Objetivos Específicos
Árboles de Derivación ……… 3 -Construcción de los árboles de derivación
- Terminología de árboles
Resultado de un árbol de derivación ………... 5 Inferencia, Derivaciones y Árboles de derivación ……….. 6
-Inferencia
De las inferencias a los árboles ……… 7 Relación entre derivaciones y árboles ……….. 8 Ambigüedad en gramáticas y lenguajes ………. 10
-Gramática ambigua
Eliminación de la Ambigüedad ………...11 -Causas de la ambigüedad
Ambigüedad Inherente ………14 Conclusión ……….16 Bibliografía ……….17
INTRODUCCIÓN
Existen básicamente dos formas de describir cómo en una cierta gramática una cadena puede ser derivada desde el símbolo inicial. La forma más simple es listar las cadenas de símbolos consecutivas, comenzando por el símbolo inicial y finalizando con la cadena y las reglas que han sido aplicadas. Si introducimos estrategias como reemplazar siempre el no terminal de más a la izquierda primero, entonces la lista de reglas aplicadas es suficiente. A esto se le llama derivación por la izquierda.
Los árboles de derivación son una herramienta de ayuda de forma gráfica para la derivación proveniente de una gramática formando como resultado final una cadena de símbolos terminales los cuales son provenientes de una gramática. El uso de árboles es muy usual en los compiladores ya que los lenguajes son extendidos en árboles de derivación y tales cadenas solo poseen un árbol de derivación son correctos, las que poseen más de un árbol no son lenguajes de programación correctos ya que son ambiguos y puede generar confusión en el momento de compilación.
Las gramáticas ambiguas son un problema muy importante en la informática, tanto como en el uso de automatas, actualmente no existen métodos automatizados para obtener gramáticas no ambiguas, más si hay recomendaciones generales. La definición de una gramática ambigua es que si una gramática es ambigua si existe alguna cadena de terminales que pueda obtener mediante árboles de derivación distintos (como se menciono antes).
Los árboles de derivación pueden ser representados tanto con la derivación más por la izquierda como la derivación más por la derecha. En este tipo de método se puede verificar si es recursivo su derivación o no.
1 de 14
OBJETIVOS
OBJETIVO GENERAL
Mostrar la aplicación del concepto de Árbol, dentro de la Teoría de Grafos, en las Gramáticas Independientes del Contexto, su relación con derivaciones e inferencias y aplicación al demostrar la ambigüedad de gramáticas.
OBJETIVOS ESPECÍFICOS
1. Explicar con claridad la construcción de árboles de derivación o parseo, a partir de una Gramática Independiente de Contexto.
2. Identificar las derivaciones respectivas que se grafican en un árbol de derivación.
3. Demostrar que la existencia de un árbol de derivación para una gramática, implica la existencia de Derivaciones más a la izquierda o más a la derecha para la gramática en cuestión.
4. Señalar la forma de aplicar los árboles de derivación como método de prueba para determinar si una Gramática es ambigua o no.
5. Enseñar los principios claves para eliminar ambigüedad en las Gramáticas que permiten hacerlo.
6. Demostrar la existencia de Lenguajes que no pueden describirse con Gramáticas no ambiguas.
ÁRBOLES DE DERIVACIÓN
Un árbol es un conjunto de puntos, llamados nodos, unidos por líneas llamadas aristas o arcos. Una arista arista conecta dos nodos distintos. Este árbol muestra claramente como se agrupan los símbolos de una cadena terminal en subcadenas, que pertenecen al lenguaje de una de las variables de la gramática. Pero lo más importante es que el árbol, conocido como “árbol de derivación”, cuando se emplea en un compilador, es la estructura de datos que representa el programa fuente. En un compilador, la estructura del árbol del programa fuente facilita la traducción del programa fuente a código ejecutable permitiendo que el proceso de traducción sea realizado por funciones naturales recursivas. El árbol de derivación permite mostrar gráficamente como se puede derivar cualquier cadena de un lenguaje a partir del símbolo distinguido de una gramática que genera ese lenguaje.
Ciertas gramáticas permiten que una cadena terminal tenga más de un árbol de análisis. Esta situación hace que esa gramática sea inadecuada para un lenguaje de programación, ya que el compilador no puede decidir la estructura sintáctica de determinados programas fuentes y, por tanto, no podría deducir con seguridad cuál será el código ejecutable apropiado correspondiente al programa.
CONSTRUCCIÓN DE LOS ÁRBOLES DE DERIVACIÓN
Sea G=(V,T,P,S) una gramática. Los árboles de derivación para G son aquellos árboles que cumplen las condiciones siguientes:
1. Cada nodo interior está etiquetado con una variable de V.
2. Cada hoja está etiquetada bien con una variable, un símbolo terminal o ϵ. Sin embargo, si la hoja está etiquetada con , entonces tiene que ser el único hijo de su padre.ϵ
3. Si un nodo interior está etiquetado como A y sus hijos están etiquetados como: X1, X2,…, XK
respectivamente, comenzando por la izquierda, entonces A→X1, X2,…, XK es una producción de P. Observe que el único caso en que una de las X puede reemplazarse por es cuando es laϵ etiqueta del único hijo y A→ es una producción de G.ϵ
Terminología de árboles
• Los árboles son colecciones de nodos, que mantienen una relación padre-hijo. Un nodo tiene como máximo un padre, que se dibuja por encima del mismo, y cero o más hijos, que se dibuja por debajo.
• Existe un nodo, el nodo raíz, que no tiene padre; es nodo es el que pose un grado de entra igual a cero y su grado de salida puede ir de 1 a más. Los nodos sin hijos se denominan hojas. Los nodos que no tienen hojas son nodos interiores.
• El hijo de un hijo… de un nodo es un descendiente de dicho nodo. Un padre de un padre de un… es un ancestro. Evidentemente, cualquier nodo es ancestro y descendiente de sí mismo.
• Los hijos de un nodo se ordenan de “Izquierda a derecha” y se dibujan así. Si el nodo N está al a izquierda del nodo M, entonces todos los descendientes de N son los que están a la izquierda de todos los descendientes de M.
3 de 14
RESULTADO DE UN ÁRBOL DE DERIVACIÓN
Fijarse en las hojas de cualquier árbol de derivación y las concatenamos empezando por la izquierda, obtenemos una cadena denominada resultado del árbol, también conocida como producción del árbol de derivación ,que siempre es una cadena que se deriva de la variable raíz. El hecho de que el resultado se derive de la raíz se demostrará a continuación. De especial importancia son aquellos árboles de derivación tales que:
1. El resultado es una cadena terminal. Es decir, todas las hojas están etiquetadas con un símbolo terminal o con ε .
2. La raíz está etiquetada con el símbolo inicial.
Estos son los árboles de derivación cuyos resultados son cadenas pertenecientes al lenguaje de la gramática subyacente. También vamos a demostrar a continuación que otra forma de describir el lenguaje de una gramática es como el conjunto de resultados de aquellos árboles de derivación que tienen el símbolo inicial en la raíz y una cadena terminal como resultado.
INFERENCIA, DERIVACIONES Y ÁRBOLES DE DERIVACIÓN Inferencia
Una regla de inferencia, o regla de transformación es una forma lógica que consiste en una función que toma premisas, analiza su sintaxis, y devuelve una conclusión (o conclusiones). Por ejemplo, la regla de inferencia llamada Modus ponendo ponens toma dos premisas, uno en la forma "Si p entonces q" y otra en la forma "p", y vuelve la conclusión "q". La regla es válida con respecto a la semántica de la lógica clásica (así como la semántica de muchas otras lógicas no clásicas), en el sentido de que si las premisas son verdaderas (bajo una interpretación), entonces también lo será la conclusión.
Cada una de las ideas que hemos presentado hasta el momento para describir cómo funciona una gramática son igualmente válidas para las cadenas. Es decir, dada una gramática G=(V,T,P,S), demostraremos que las siguientes afirmaciones son equivalentes:
1. La inferencia recursiva determina que la cadena terminal w pertenece al lenguaje de la variable A.
2. A w 3. A w
4. A w
5. Existe un árbol de derivación cuya raíz es A cuyo resultado es w.
Tenemos que demostrar estas equivalencias y lo vamos a hacer utilizando el esquema de la Figura 1.6.
Esto es, cada arco del diagrama indica que demostramos un teorema que establece que si w cumple la condición en la cola del arco, entonces también la cumple en el origen del mismo. Por ejemplo,
demostraremos el Teorema 1 que si por inferencia recursiva se ha inferido que w está en el lenguaje de A, entonces existe un árbol de derivación con raíz A y resultado w. Observe que dos de los arcos son muy simples, y no vamos a demostrarlos formalmente. Si w tiene una derivación más a la izquierda desde A, entonces seguro que tiene una derivación desde A, ya que una derivación más a la izquierda es una derivación. Del mismo modo, si w tiene una derivación más a la derecha, entonces tiene una derivación. Ahora pasamos a demostrar los pasos más complicados de esta equivalencia.
DE LAS INFERENCIAS A LOS ÁRBOLES
Teorema 1__________________________________________________________________________
Sea G =(V,T,P,S) una GIC. Si el procedimiento de la inferencia recursiva nos dice que la cadena terminal w pertenece al lenguaje de la variable A, entonces existe un Árbol de derivación con raíz A y resultado w.
DEMOSTRACIÓN. La demostración se hace por inducción sobre el número de pasos empleados para inferir que w pertenece al lenguaje de A.
BASE. Un paso. En este caso, sólo se tiene que haber empleado el caso básico del procedimiento de inferencia. Por tanto, tiene que existir una producción A→w. El árbol de la Figura 1.7, donde hay una hoja para cada posición de w, cumple las condiciones para ser un árbol de derivación para la gramática G, y evidentemente tiene un resultado w y raíz A. En el caso especial en que w= ε , el árbol tiene una sola hoja etiquetada como ε y es un árbol de derivación válido con raíz A y resultado w.
PASO INDUCTIVO. Supongamos que el hecho de que w pertenezca al lenguaje de A se ha inferido después de n+1 pasos de inferencia y que el enunciado del teorema se cumple para todas las cadenas x y variables B tales que la pertenencia de x al lenguaje de B se haya inferido utilizando no menos pasos de inferencia. Consideremos el último paso de la inferencia que establece que w pertenece al lenguaje de A. Esta inferencia emplea cierta producción para A, por ejemplo A→X1X2···Xk, donde cada Xi es o una variable o un símbolo terminal. Podemos dividir w en w1w2···wk, donde:
1. Si Xi es un símbolo terminal, entonces wi =Xi; es decir, wi está formada sólo por este símbolo terminal de la producción.
2. Si Xi es una variable, entonces wi es una cadena cuya pertenencia al lenguaje de Xi se ha inferido anteriormente. Es decir, esta inferencia de wi ha necesitado como máximo n de los n+1
5 de 14
Figura 1.6 Demostración de la equivalencia de algunas afirmaciones acerca de las gramáticas.
pasos de la inferencia que demuestra que w pertenece al lenguaje de A. No puede necesitar los n+1 pasos, porque el último paso, que emplea la producción A→X1X2···Xk, no forma parte de la inferencia sobre wi. En consecuencia, podemos aplicar la hipótesis inductiva a wi y Xi, y concluir que existe un árbol de derivación con el resultado wi y la raíz Xi.
Entonces construimos un árbol de raíz A y resultado w, como se muestra en laFigura 1.8. Existe una raíz con la etiqueta A, cuyos hijos son X1,X2,...,Xk. Esta solución es válida, ya que A→X1X2···Xk es una producción de G. El nodo para cada Xi es la raíz de un subárbol con resultado wi. En el caso (1), donde Xi es un símbolo terminal, este subárbol es un árbol trivial con un solo nodo etiquetado con Xi. Es decir, el subárbol consta sólo de este hijo de la raíz. Dado que wi =Xi en el caso (1), se cumple la condición de que el resultado del subárbol es wi. En el caso (2), Xi es una variable. Luego invocamos la hipótesis inductiva para afirmar que existe un árbol de raíz Xi y resultado wi. Este árbol está asociado al nodo Xi en la Figura 1.8. El árbol así construido tiene raíz A. Su resultado es igual a la concatenación de izquierda a derecha de los resultados de los subárboles. Dicha cadena es w1, w2···wk, que es w.
RELACIÓN ENTRE DERIVACIONES Y ÁRBOLES Dada una gramática G1 = {V = {E, I}, T= {a, b, 0, 1}, P, E}
Donde P:
E→I I→a
E→E+E I→b
I→Ia
E→E∗E I→Ib
E→(E ) I→I 0
I→I 1
Podemos realizar las siguientes derivaciones dentro o fuera del contexto correspondiente:
α E β ⇒α I β ⇒α Ibβ ⇒αab β
Este principio permite el trabajo de derivaciones desde un árbol, obviando el contexto, los nodos hermanos, y haciendo un recorrido hacia las hojas del nodo en cuestión o, la variable que se está derivando.
Existe un teorema que convierte un árbol de derivación en una derivación más a la izquierda. La demostración es por inducción sobre la altura del árbol, que es la longitud máxima de un camino que comienza un la raíz y baja por los descendientes hasta una hoja.
Figura 1.7. Árbol construido para el caso básico del Teorema 1
Figura 1.8. Árbol empleado en la parte inductiva de la demostración del Teorema 5.12.
Sea G=(V, T, P, S) una GIC y suponiendo que existe un árbol de derivación con una raíz etiquetada con la variable A y resultado w, donde w pertenece a T*. Entonces existe una derivación más a la izquierda A
*
⇒lmw en la gramática G.
Considerando que la cadena w = w1w2w3...wk y un árbol con raíz A con hijos designados X1, X2, X3, X4,
…... Xk, se pueden dar los siguientes casos:
• Cuando la altura de la hoja wi es n = 1, entonces Xi = wi.
• Cuando la altura de la hoja wi es n > 1, entonces A tiene un hijo Xi, tal que X
* i⇒
lmwi
Sea G ={V, T, P, S} una GIC y supongamos que existe un árbol de derivación que existe un árbol de derivación con una raíz etiquetada con la variable A y resultado w, donde w pertenece a T*. Entonces existe una derivación más a la derecha A
*
⇒rmw en la gramática G.
El proceso de construcción de una derivación más a la derecha a partir de un árbol es casi igual que el de construir una derivación más a la izquierda. Sin embargo, después de comenzar con el paso
A
*
⇒rmX1X2... Xk , expandimos primero Xk, utilizando una derivación más a la derecha, luego expandimos Xk−1y así sucesivamente hasta llegar a X1.
Vemos entonces que la existencia de un árbol de derivación para una gramática implica la existencia de derivaciones más a la derecha y más a la izquierda.
AMBIGÜEDAD EN GRAMÁTICAS Y LENGUAJES
Si una gramática genera más de una estructura a partir de la misma raíz y con la misma cosecha (más de una estructura para la misma cadena), dicha gramática es ambigua.
Existen dos tipos de ambigüedad:
– En la gramática – En el lenguaje
Si una gramática es ambigua, posiblemente (no necesariamente) existe una gramática no ambigua que genere el mismo lenguaje. No existe un algoritmo que defina si una gramática es ambigua.
GRAMÁTICA AMBIGUA Sea expreción, una GLC
Gexp=({ E } ,{+,∗,(,), a ,b ,0 } , E , P) donde P={ E →E+E∣E∗E∣(E )∣0∣a∣b } Donde, una expresión ambigua :
-E + E * E es producida por dos o más derivaciones:
7 de 14
E⇒E+E ⇒E +E∗E E⇒E ∗E ⇒E+E∗E
Las expresiones finales son las mismas, pero las derivaciones distintas generan estructuras sintácticas distintas.
La ambigüedad surge cuando derivaciones diferentes generan estructuras diferentes (para la misma cadena). Esto se refleja en la generación de diferentes árboles de derivación con el mismo resultado o expresión.
La diferencia entre estas dos derivaciones es significativa. En lo que se refiere a la estructura de las expresiones, la derivación (1) establece que la segunda y la tercera expresiones se multiplican, y el resultado se suma a la primera expresión, mientras que la derivación (2) suma las dos primeras expresiones y multiplica el resultado por la tercera. Más concretamente, la primera derivación sugiere que 1+2 3 deberían agruparse como 1+(2 3)=7, mientras que la segunda derivación dice que la∗ ∗ misma expresión debería agruparse como (1+2) 3=9.∗
Una CFG G = (V, Σ, S, P) es ambigua si existe cuando menos una cadena w en Σ* para la cual hay más de una árbol de parseo o estructura sintáctica, cada una de éstas con raiz S y cosecha w. Si toda cadena en el lenguaje de la gramática tiene cuando más un árbol de parseo, la gramática no es ambigua.
La mera existencia de diferentes derivaciones para una cadena no implica que la gramática sea ambigua.
Por ejemplo, en las siguientes expresiones, se utilizan diferentes derivaciones, pero no cambian en estructura, solamente cambia el orden de las derivaciones.
E ⇒ E+ E⇒ I+ E ⇒a+ E ⇒a+I ⇒a+b E ⇒ E+ E⇒ E+I ⇒I +I ⇒I +b ⇒a+b
Por lo que se va a tomar como condición definitiva el hecho de encontrar dos árboles de derivación diferentes para una cadena w de una GIC, para que esa gramática sea ambigua.
Figura 1.10