Coordinación de Ciencias Computacionales - Capítulo 5grodrig/Descargas/AutomatasLengua... ·...
Transcript of Coordinación de Ciencias Computacionales - Capítulo 5grodrig/Descargas/AutomatasLengua... ·...
Capítulo 5
Gramáticas Libres de Contexto
Gramáticas Libres de Contexto y Lenguajes
• Hemos visto que muchos lenguajes no pueden ser regulares. Así necesitamos considerar clases más grandes de lenguajes.
• Lenguajes libres de contexto (LLCs) jugaron un papel central en lenguajes naturales desde los 1950's, y en compiladores desde los 1960's.
• Gramáticas Libres de Contexto (GLCs) son la base de la sintaxis BNF.
Gramáticas Libres de Contexto y Lenguajes
• Hoy LLCs son cada día más importantes para XML y sus DTDs.
Veremos GLCs, los lenguajes que ellas generan, árboles de análisis, autómatas de pila y propiedades de cerradura de los LLCs.
Ejemplo Informal de GLCs
Considere Lpal = { w ∈Σ* : w = wR }
Por ej. oso ∈ Lpal , abaaaccaaaba∈ Lpal. En Español, por ejemplo, se tiene anitalavalatina ∈ Lpal
Sea ∑ = {0, 1} y suponga que Lpal fuera regular.
Sea n dado por el lema de “bombeo”.Entonces 0n10n ∈Lpal. Al leer 0n el AF debe hacer un ciclo. Omitase el ciclo; contradicción.
Ejemplo Informal de GLCs (Cont.)
Definamos Lpal inductivamente:
Base: ε, 0, y 1 son palíndromas.
Inducción: Si w es una palíndroma, así lo son 0w0 y 1w1.
Circunscripción: Nada más es una palíndroma.
Ejemplo Informal de GLCs (Cont.)
GLCs es un mecanismo formal para definiciones tales como aquella para Lpal.
0 y 1 son terminales
P es una variable (o no terminal, o categoría sintáctica)
P es en esta gramática también el símbolo inicial.
1-5 son producciones (o reglas)
Definición Formal de GLCs
Una gramática libre de contexto es un cuádruple
G = (V, T, P, S)donde
V es un conjunto finito de variables. T es un conjunto finito de terminales. P es un conjunto finito de producciones de la forma
A → α , donde A es una variable y α ∈ (V U T)* S es una variable distinguida llamada el símbolo inicial.
Ejemplos
Gpal = ({P}, {0, 1}, A, P), dondeA = {P → ε, P → 0, P → 1, P → 0P0, P → 1P1}.
A veces agrupamos producciones con la misma cabeza, por ej. A = {P → ε | 0 | 1 | 0P0 | 1P1}.
Expresiones regulares sobre {0, 1} pueden ser definidas por la gramática
Gregex = ({E}, {0, 1}, A, E)
donde A = { E→ 0, E→ 1, E→ E. E, E→ E + E, E→ E*, E→ (E)}
Ejemplos (Cont.)
Expresiones (simples) en un lenguaje de programación típico. Los operadores son + y * y los argumentos son identificadores, i.e. cadenas en
L((a + b)(a + b + 0 + 1)*)Las expresiones están
definidas por la gramáticaG = ({E, I}, T, P, E)
donde T = {+, *, (, ), a, b, 0,1} y P es el siguiente conjunto de producciones:
Derivaciones usando gramáticas
• Inferencia recursiva , usando producciones desde el cuerpo a la cabeza
• Derivaciones, usando producciones de cabeza a cuerpo.
Derivaciones usando gramáticas (Cont.)
Ejemplo de inferencia recursiva:Cadena Para
lenguaje de Producción Cadenas Usadas
(i) a I 5 ‐
(ii) b I 6 ‐
(iii) b0 I 9 (ii)
(iv) b00 I 9 (iii)
(v) a E 1 (i)
(vi) b00 E 1 (iv)
(vii) a+b00 E 2 (v), (vi)
(viii) (a+b00) E 4 (vii)
(ix) a*(a + b00) E 3 (v), (viii)
Derivaciones usando gramáticas (Cont.)
Sea G = (V, T, P, S) una GLC, A ∈ V,{α, β} ⊂ (V ∪ T)*, y A→ γ ∈ P.
Entonces escribimosαAβ ⇒G αγβ
o si G es entendidaαAβ ⇒ αγβ
y decimos que αAβ deriva αγβ.
Derivaciones usando gramáticas (Cont.)
Definimos ⇒* a ser la cerradura reflexiva y transitiva de ⇒, en otras palabras:
Base: Sea α ∈ (V ∪ T)*. Entonces α ⇒* α
Inducción: Si α ⇒* β y β ⇒* γ,entonces α ⇒* γ.
Ejemplo
Derivación de a*(a + b00) a partir de E en la gramática de pantalla previa:
E ⇒ E * E ⇒ I * E ⇒ a * E ⇒ a * ( E ) ⇒a * (E + E) ⇒ a * (I + E) ⇒ a*(a + E) ⇒a * (a + I) ⇒
a * (a+I0) ⇒ a*(a+I00) ⇒ a*(a+b00)
Nota 1: En cada paso podriamos tener varias reglas a elegir, por ejemplo
I * E ⇒ a * E ⇒ a * (E) en contraste conI * E ⇒ I * (E ) ⇒ a * (E).
Ejemplo (Cont.)
Nota 2: No todas las elecciones conducen a derivaciones exitosas de una cadena en particular, por ejemplo
E ⇒ E + E
no llevará a derivaciones de a * (a + b00).
Derivaciones por Derecha y por Izquierda
Derivación por izquierda : Siempre reemplazar la variable mas a la izquierda por uno de los cuerpos de sus reglas.
Derivación por derecha : Siempre reemplazar la variable mas a la derecha por uno de los cuerpos de sus reglas.
Por la izquierda: E ⇒ E * E ⇒ I * E ⇒ a * E ⇒ a * ( E ) ⇒a * (E + E) ⇒ a * (I + E) ⇒ a*(a + E) ⇒a * (a + I) ⇒
a * (a+I0) ⇒ a*(a+I00) ⇒ a*(a+b00)
Derivaciones por Derecha y por Izquierda (Cont.)
Por la derecha:E ⇒rm E * E ⇒ rm
E*(E) ⇒rm E*(E+E) ⇒rm E*(E+I) ⇒rm E*(E+I0)⇒rm E*(E+I00) ⇒rm E*(E+b00) ⇒rm E*(I+b00)⇒rm E*(a+b00) ⇒rm I*(a+b00) ⇒rm a*(a+b00)
Podemos concluir que E ⇒*rm a*(a+b00)
El Lenguaje de una Gramática
Si G(V, T, P, S) es una GLC, entonces el lenguajede G es
L(G) = { w ∈T* : S ⇒*G w }
i.e. el conjunto de cadenas sobre T* derivables a partir del simbolo inicial.
Si G es una GLC, decimos que L(G) es un lenguajelibre de contexto.
Ejemplo
L(Gpal) es un lenguaje libre de contexto.
Teorema 5.7:L(Gpal) = { w ∈ {0, 1}* : w = wR }
Dem: (Dirección ⊇) Suponga w = wR. Mostramos por inducción en |w| que w ∈L(Gpal)
Ejemplo (Cont.)
Base: |w| = 0, o |w| = 1. Entonces w es ε, 0, o 1. Ya que P→ε,P→0, y P→1 son producciones, concluimos que P ⇒* w entodos los casos base.
Inducción: Suponga que |w| ≥ 2. Dado que w = wR , tenemosw = 0x0, o w = 1x1, y x = xR.
Si w = 0x0 sabemos de la HI que P ⇒* x. EntoncesP ⇒ 0P0 ⇒* 0x0 = w
Asi w ∈ L(Gpal).
El caso para w = 1x1 es similar.
Ejemplo (Cont.)
(Dirección ⊆) Suponemos que w ∈ L(Gpal) y debemostrarse que w = wR.
Dado que w ∈ L(Gpal), tenemos P ⇒* w.
Hacemos una inducción en la longitud de ⇒* .
Base: La derivación P ⇒* w es hecha en un paso.
Entonces w debe ser ε, 0, o 1, todas palindromas.
Ejemplo (Cont.)
Inducción: Sea n ≥1, y suponga que la derivacióntoma n+1 pasos. Entonces debemos tener
w = 0x0 ⇐* 0P0 ⇐ Po
w = 1x1 ⇐* 1P1 ⇐ Pdonde la segunda derivación es hecha en n pasos.
Por HI x es una palindroma y la demostracióninductiva está completa.
Formas oracionales
Sea G(V, T, P, S) una GLC, y α ∈ (V ∪ T)*.Si
S ⇒* αDecimos que es una forma oracional.
Si S ⇒lm α decimos que es una forma oracionalizquierda, y si S ⇒rm α decimos que es una forma oracional derecha.
Nota: L(G) es aquellas formas oracionales que están en T*.
Ejemplos
Dada G de expresiones.
Entonces E*(I+E) es una forma oracional ya que E ⇒ E*E ⇒ E*(E) ⇒ E*(E+E) ⇒ E*(I+E)
Esta derivación no es ni izquierda ni derecha.
a*E es una forma oracional izquierda, ya que E ⇒lm E*E ⇒lm I*E ⇒lm a*E
E*(E+E) es una forma oracional derecha dado que E ⇒rm E*E ⇒rm E*(E) ⇒rm E*(E+E)