Professional Documents
Culture Documents
2 Definicin de las gramticas independientes del contexto 5.1.3 Derivaciones utilizando una gramtica 5.1.4 Derivaciones izquierda y derecha 5.1.5 Lenguaje de una gramtica 5.1.6 Formas sentenciales 5.2 rboles de derivacin 5.2.1 Construccin de los rboles de derivacin 5.2.2 Resultado de un rbol de derivacin 5.2.3 Inferencia, derivaciones y rboles de derivacin 5.3 Aplicaciones de las gramticas independientes del contexto 5.3.1 Analizadores sintcticos 5.4 Ambigedad
4. Un conjunto finito de producciones o reglas que representan la definicin recursiva de un lenguaje. Cada produccin consta de: a) Una variable a la que define (parcialmente) la produccin. Esta variable a menudo se denomina cabeza de la produccin. b) El smbolo de produccin . c) Una cadena formada por cero o ms smbolos terminales y variables. Esta cadena, denominada cuerpo de la produccin, representa una manera de formar cadenas pertenecientes al lenguaje de la variable de la cabeza. De este modo, dejamos los smbolos terminales invariables y sustituimos cada una de las variables del cuerpo por una cadena que sabemos que pertenece al lenguaje de dicha variable. Estos cuatro componentes definen una gramtica independiente del contexto, (GIC), o simplemente una gramtica, o en ingls CFG, context-free grammar. G = (V, T, P, S) representa una GIC G, donde V es el conjunto de variables, T son los smbolos terminales, P es el conjunto de producciones y S es el smbolo inicial. Ejemplo 5.2. La gramtica Gpal para los palndromos se representa: Gpal = ({P}, {0, 1}, A, P), donde A representa el conjunto de las cinco producciones mostradas. Ejemplo 5.3. La siguiente GIC representa una simplificacin de las expresiones de un lenguaje de programacin tpico. Vamos a limitarnos a los operadores + y *. Establecemos que los argumentos sean identificadores. Todo identificador debe comenzar por a o b, y deber ir seguido por cualquier cadena perteneciente a {a, b, 0, l}*. En esta gramtica necesitamos dos variables. E, representa expresiones, se trata del smbolo inicial y representa el lenguaje de las expresiones que se van a definir. La otra variable, I, representa los identificadores. Su lenguaje, que es regular, es el de la expresin regular: (a + b) (a + b + 0 + l )*. No vamos a emplear expresiones regulares directamente en las gramticas. En lugar de ello, utilizaremos un conjunto de producciones que prcticamente es lo mismo que una expresin regular. La gramtica para expresiones se define formalmente como G = ({E, I}, T, P, E), donde T es el conjunto de smbolos {+, *, (, ), a, b, 0, l} y P es el conjunto de producciones mostrado en la figura:
El proceso de derivacin de cadenas aplicando producciones desde la cabeza hasta el cuerpo requiere la definicin de un nuevo smbolo de relacin . Supongamos que G = (V, T, P, S) es una GIC. Sea A una cadena de smbolos terminales y variables, siendo y cadenas de (V + T)* y A una variable. Sea A una produccin de G. Entonces decimos que variable de cualquier parte de la cadena por el cuerpo de una de sus producciones. Podemos extender la relacin para representar cero, uno o ms pasos de derivaciones, utilizaremos el smbolo * para indicar "cero o ms pasos", como sigue: Base. Para cualquier cadena de smbolos terminales y variables, decimos que . Es decir, cualquier cadena se
G *
y se cumple .
G G G
en lugar de .
G
Ejemplo 5.5. La inferencia de que a*(a + b00) est en el lenguaje de la variable E se puede reflejar en una derivacin de dicha cadena, partiendo de la cadena E.
para condensar la derivacin: E a*(a + b00). Los dos puntos de vista, inferencia w.
*
recursiva y derivacin, son equivalentes. Es decir, se infiere que una cadena de smbolos terminales w pertenece al lenguaje de cierta variable A si y slo si A
Notacin compacta para producciones Es conveniente pensar que una produccin "pertenece" a la variable que aparece en su cabeza. A menudo se usar "las producciones de A" o "producciones-A" para hacer referencia a las producciones cuya cabeza es la variable A. Otra forma de escribir varias producciones pertenecientes a la misa variable, A1, A2 A3n es A1|2||n. Notacin para las derivaciones de las GIC 1. Las letras minsculas del principio del alfabeto (a, b,), dgitos y otros caracteres como el signo ms (+) o los parntesis son smbolos terminales. 2. Las letras maysculas del principio del alfabeto (A, B) son variables. 3. Las letras minsculas del final del alfabeto, como w o z, son cadenas de smbolos terminales. 4. Las letras maysculas del final del alfabeto, como X o Y, son smbolos terminales o variables. 5. Las letras griegas minsculas, como y , son cadenas formadas por smbolos terminales y/o variables.
o
lm
. Tambin se puede hacer por la derecha, con la derivacin ms a la derecha representada mediante o .
lm rm rm
Ejemplo 5.6. Se realizar la misma derivacin que en el ejemplo 5.6, pero por la izquierda y por la derecha:
Para cualquier derivacin existe una derivacin ms a la izquierda equivalente y una derivacin ms a la derecha equivalente.
w}.
G
Si un lenguaje L es el lenguaje de cierta gramtica independiente del contexto, entonces se dice que L es un lenguaje independiente del contexto o LIC (CFL, context-free language).
una forma sentencial. Si S , entonces es una forma sentencial por la izquierda y si S entonces es una forma
lm rm
sentencial por la derecha. Observe que el lenguaje L(G) est formado por aquellas formas sentenciales que pertenecen a T*, es decir, que solamente constan de smbolos terminales. Ejemplo 5.8. Considere la gramtica para las expresiones del ejemplo 5.5. Por ejemplo, E*(I + E) es una forma sentencial, dado que existe una derivacin: , aunque no es una derivacin ms a la izquierda ni a la derecha, ya que en el ltimo paso se sustituye la variable central. Ejemplos de formas sentenciales por la izquierda o la derecha seran:
4. A w.
rm
5. Existe un rbol de derivacin cuya raz es A y cuyo resultado es w. Excepto para el uso de la inferencia recursiva, que slo hemos definido para cadenas terminales, todas las dems condiciones tambin son equivalentes si w es una cadena que contiene variables. La siguiente figura muestra un esquema de demostracin de todas estas equivalencias; cada arco del diagrama indica que existe un teorema que establece que si w cumple la condicin en la cola del arco, entonces tambin la cumple en el origen del mismo.
Teorema 5.12. 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 derivacin con raz A y resultado w.
Teorema 5.14, 5.16. Sea G = (V, T, P, S) una GIC y supongamos que existe un rbol de derivacin con una raz etiquetada con la variable A y resultado w, donde w pertenece a T*. Entonces existe una derivacin ms a la izquierda A Entonces existe una derivacin ms a la derecha A
w en la gramtica G.
lm *
w en la gramtica G.
rm * G
Teorema 5.18. Sea G = (V, T, P, S) una GIC, y supongamos que existe una derivacin A w, donde W pertenece a T*. Entonces el procedimiento de inferencia recursiva aplicado a G determina que w pertenece al lenguaje de la variable A.
cada cadena del lenguaje. Sin embargo, existen algunos lenguajes independientes del contexto que son "inherentemente ambiguos"; cualquier gramtica para dicho lenguaje proporciona ms de una estructura a algunas cadenas del lenguaje.
En la derivacin (1), la segunda E es reemplazada por E * E, mientras que en la derivacin (2), la primera E es reemplazada por E + E. La diferencia entre estas dos derivaciones es significativa. En lo que se refiere a la estructura de las expresiones, la derivacin (1) establece que la segunda y la tercera expresiones se multiplican, y el resultado se suma a la primera expresin, mientras que la derivacin (2) suma las dos primeras expresiones y multiplica el resultado por la tercera. La primera de ellas, y no la segunda, se corresponde con nuestra idea de cmo agrupar correctamente las expresiones aritmticas. Dado que la gramtica proporciona dos estructuras diferentes para cualquier cadena de smbolos terminales que se haya derivado reemplazando las tres expresiones de E + E * E por identificadores, vemos que esta gramtica no es adecuada para proporcionar una estructura nica. En concreto, puede proporcionar cadenas con la agrupacin correcta como expresiones aritmticas, pero tambin proporciona agrupaciones incorrectas. Para utilizar esta gramtica de expresiones en un compilador, tendramos que modificarla de manera que slo proporcionara las agrupaciones correctas. Por otro lado, la mera existencia de diferentes derivaciones para una cadena (en oposicin a diferentes rboles de derivacin) no implica que la gramtica sea defectuosa. Ejemplo 5.26. Utilizando la misma gramtica de expresiones, vamos a determinar que la cadena a + b tiene muchas derivaciones diferentes, por ejemplo: 1. E E + E I + E a + E a + I a + b; 2. E E + E E + I E + b I + b a + b. Sin embargo, no existe ninguna diferencia real entre las estructuras proporcionadas por estas derivaciones; ambas especifican que a y b son identificadores y que sus valores deben sumarse. De hecho, ambas derivaciones dan como resultado el mismo rbol de derivacin. Los dos ejemplos anteriores sugieren que no es la multiplicidad de derivaciones lo que causa la ambigedad, sino la existencia de dos o ms rboles de derivacin. Por tanto, decimos que una GIC G = (V, T, P, S) es ambigua si existe al menos una cadena w de T* para la que podemos encontrar dos rboles de derivacin diferentes, teniendo cada uno de ellos una raz S y un resultado w. Si cada una de las cadenas tiene como mximo un rbol de derivacin en la gramtica, entonces la gramtica es no ambigua. Existen algunas derivaciones ambiguas que pueden ser transformadas para dejar de serlo, mientras que otras son inherentemente ambiguas.