Sie sind auf Seite 1von 16

Autómatas y Lenguajes - Año 2007

Teorı́a 4: Lenguajes Libres del Contexto - Gramáticas Libres del Contexto


Autómatas Push-Down

Departamento de Informática
Facultad de Cs. Fco. Matemáticas y Naturales

Universidad Nacional de San Luis


San Luis - Argentina

Autómatas y Lenguajes - Año 2007– p.1/32

Lenguajes Tipo 2 o Independientes del contexto

La principal característica de este tipo de lenguajes es la de generar cadenas en modalidad espejo,

aunque también engloba las características Tipo 3 (L3 ⊂ L2 ).

Su importancia radica en que permiten describir los aspectos sintácticos de los lenguajes de

programación. Es decir, como debe escribirse correctamente un programa, por lo tanto tienen un rol

central en el contexto de compiladores.

Sin embargo tienen sus limitaciones desde el punto de vista semántico (declaración y uso de

identificadores en Pascal)

Ejemplos:

Uso de paréntesis en expresiones aritméticas: (3 × x) + (z/(x + y))

Delimitación de bloques a través de begin y end en lenguajes estructurados a bloque (Pascal).

Autómatas y Lenguajes - Año 2007– p.2/32


Dispositivos descriptores asociados a los lenguajes tipo 2.

Generadores: Gramáticas Libres de Contexto (GLC).

Reconocedores: Autómatas Push-Down (a pila).

Autómatas y Lenguajes - Año 2007– p.3/32

Gramáticas Libres de Contexto (GLC)

Definición: Una gramática G = (N, Σ, P, S) es libre de contexto, si sus producciones en P tienen la

siguiente forma: A → α, con A ∈ N y α ∈ (N ∪ Σ)∗ . Con N , Σ y S somo se definieron en el contexto

general de gramáticas.

El nombre “libre de contexto” se debe a que cada una de las producciones pueden ser aplicadas

independientemente del contexto en donde aparezca un no terminal en una forma sentencial.

Ejemplo: Analicemos como construir una GLC para generar expresiones aritméticas que incluyan los sím-

bolos + y ∗ y los identificadores que pueden estar formados por las letras a y b y los números 0 y 1, pero

que comienzan con letra:

Autómatas y Lenguajes - Año 2007– p.4/32


P : E→I

E →E+E

E →E∗E

E → (E)

I →a

I →b

I → Ia

I → Ib

I → I0

I → I1

Autómatas y Lenguajes - Año 2007– p.5/32

Derivaciones en una GLC

Las producciones de una gramática se utilizan para inferir que ciertas cadenas están en el lenguaje

generado por dicha gramática.

Hay dos aproximaciones para esta inferencia: inferencia recursiva, que es una aproximación convencional

y las más comúnmente usada denominada derivación, que es con la que trabajaremos en la materia.

Como ya vimos, el proceso de derivar cadenas requiere de la definición de la relación deriva ⇒,

recordemos:

Sean α, β, γ ∈ (Σ ∪ N )∗ y A ∈ N , definimos la relación deriva (⇒) sobre (Σ ∪ N )∗ como sigue:

αAβ ⇒ αγβ sii existe A → γ ∈ P

Esto significa que αγβ es obtenida a partir de αAβ por la aplicación de la regla o producción

A → γ ∈ P.

Autómatas y Lenguajes - Año 2007– p.6/32



Podemos extender la relación ⇒ (como ya vimos) para representar cero, una o más derivaciones (⇒), tal

como extendimos δ, la función de transición de un AF a δ ∗ , lo hacemos de la siguiente manera:



Base: para cualquier cadena α de terminales y no terminales, decimos que α ⇒ α.
∗ ∗
Induccción: si α ⇒ β y β ⇒ γ, entonces α ⇒ γ.

Ejemplo:

Apliquemos esta definición para derivar la cadena b ∗ (b + a00), usando la gramática de las expresiones

aritméticas:

E ⇒ E ∗ E ⇒ I ∗ E ⇒ b ∗ E ⇒ b ∗ (E) ⇒ b ∗ (E + E) ⇒ b ∗ (I + E) ⇒ b ∗ (b + E) ⇒

b ∗ (b + I) ⇒ b ∗ (b + I0) ⇒ b ∗ (b + I00) ⇒ b ∗ (b + a00)

Autómatas y Lenguajes - Año 2007– p.7/32

Derivaciones de más a la izquierda y más a la derecha

La forma de aplicar las producciones en una secuencia de derivación puede ser arbitraria, en el sentido

que cualquier símbolo no terminal de una forma sentencial puede ser escogido para reemplazarlo por su

parte derecha. Sin embargo, es posible establecer algún criterio de selección del no terminal a expandir,

con la idea de restringir el número de elecciones que se tienen para derivar una cadena. Tales criterios

son:

Elegir siempre el no terminal de más a la izquierda. Tal derivación se denomina derivación de más

a la izquierda, y se usan las relaciones ⇒lm ⇒lm .

Elegir siempre el no terminal de más a la derecha. Tal derivación se denomina derivación de más

a la derecha, y se usan las relaciones ⇒rm ⇒rm .

Autómatas y Lenguajes - Año 2007– p.8/32


Ejemplo:

E ⇒lm E ∗ E ⇒lm I ∗ E ⇒lm b ∗ E ⇒lm b ∗ (E) ⇒lm b ∗ (E + E) ⇒ b ∗ (I + E)lm ⇒lm

b ∗ (b + E) ⇒lm b ∗ (b + I) ⇒lm b ∗ (b + I0) ⇒lm b ∗ (b + I00) ⇒lm b ∗ (b + a00)

Inferir la misma cadena utilizando derivaciones de más a la derecha.

Lenguaje generado por una GLC



El lenguaje generado por una gramática G (denotado L(G)) es: L(G) = {w ∈ Σ∗ /S ⇒ w}.

Autómatas y Lenguajes - Año 2007– p.9/32

Árbol de derivación o de parser

Es un recurso alternativo para mostrar derivaciones en una gramática Tipo 2. Este es un concepto muy

importante en el contexto de análisis sintáctico (etapa importante en el proceso de compilación) de

lenguajes de programación.

Definición: Sea G = (N, Σ, P, S) una GLC, luego un árbol es un Árbol de Derivación para G si:

1. Cada vértice está rotulado por un símbolo de (N ∪ Σ) ∪ {λ}.

2. El rótulo de la raíz del árbol es S, el símbolo distinguido.

3. Si un vértice es un nodo interior con rótulo A, luego A ∈ N .

4. Si n tiene rótulo A y los vértices n1 , n2 , ..., nk son los descendientes de n, de izquierda a

derecha, con rótulos X1 , X2 , ..., Xk respectivamente, luego A → X1 X2 ...Xk ∈ P

5. Si el vértice n tiene rótulo λ, luego n es una hoja y es el único descendiente de su padre. (Para las

producciones del tipo A → λ).

Autómatas y Lenguajes - Año 2007– p.10/32


Ejemplo: A partir de la gramática que genera expresiones aritméticas dada previamente y la cadena

w = b ∗ (b + a00) obtenemos el siguiente Árbol de Derivación:

E * E

I ( E )

b E + E

I I

b I 0

I 0

Autómatas y Lenguajes - Año 2007– p.11/32

Frontera de un Árbol de Derivación.

Dado un Árbol de Derivación para una gramática G. Si los rótulos de las hojas del árbol son leídos de

izquierda a derecha, tenemos una forma sentencial. La cadena formada por la concatenación de tales

rótulos es denominada frontera del árbol. Por ejemplo, para el árbol previamente mostrado, la frontera es

w = b ∗ (b + a00).

Autómatas y Lenguajes - Año 2007– p.12/32


Ambigüedad.

Definición: Una gramática G, libre de contexto es ambigüa si existe al menos una cadena w en L(G)

para la cual existe más de un Árbol de Derivación con frontera w.

La existencia de esta condición, impediría en principio, implementar un reconocedor determinístico.

Teorema 1: para cada gramática G = (N, Σ, P, S) y la cadena w ∈ Σ, w tiene dos árboles de parser

distintos sí y sólo sí tiene dos derivaciones de más a la izquierda distintas, partiendo de S.

Ejemplo: conjunto de producciones que generan la construcción if-the-else al estilo del lenguaje ’C’:

Introducimos la notación especial para los no terminales usando corchetes angulares para diferenciarlos

de los terminales (BNF).

Autómatas y Lenguajes - Año 2007– p.13/32

hsentenciai → if( hexpresioni )hsentenciai

if(hexpresioni)hsentenciai elsehsentenciai

hotrasentenciai

Consideremos la cadena “if ( expr1 ) if ( expr2 ) f() else g()”. Puede comprobarse que para ella existen

dos árboles de derivación distintos, dado que es ambigüa la correspondencia de la parte “else” de la

sentencia. Es decir, ¿cierra el primer “if” o el segundo?.

Autómatas y Lenguajes - Año 2007– p.14/32


Removiendo ambigüedad de las gramáticas

Así como es posible eliminar estados inaccesibles desde un AF, sería útil poder eliminar la ambigüedad

en una gramática de manera algorítmica. Sin embargo, el hecho es que no hay un algoritmo para

determinar si una gramática es ambigüa y que a veces resulta imposible eliminar la ambigüedad

(gramáticas inherentemente ambigüas). Es decir, no xiste un algoritmo práctico que permita eliminar la

ambigüedad en una gramática.

Autómatas y Lenguajes - Año 2007– p.15/32

Reconocimiento de lenguajes Tipo 2.

¿Cómo podríamos extender el AF para que pueda reconocer lenguajes en modalidad espejo?.

Agregamos una Memoria Auxiliar (pila).

... Cinta

Cabeza Lectora (mov. a derecha implicito)

UC Pila

Autómata Push-Down (APD)

Autómatas y Lenguajes - Año 2007– p.16/32


Características del APD:

Cinta de entrada de sólo lectura.

Pila, acepta lectura y escritura (pop y push).

Cabeza lectora, se mueve a derecha (movimiento implícito).

El APD es esencialmente un AFND-ǫ con el agregado de una pila.

Autómatas y Lenguajes - Año 2007– p.17/32

Autómata Push-Down.

Definición: Un APD es una 7-upla P = (Q, Σ, Γ, δ, q0 , Z0 , F ), donde:

Q : es el conjunto de estados,

Σ : Alfabeto de entrada,

Γ : Alfabeto de la Memoria Auxiliar (pila),

q0 : el estado inicial,

Z0 : símbolo inicial de la pila,

F : Conjunto de estados finales (puede ser vacío),


La función de transición es, δ : Q × (Σ ∪ {λ}) × Γ → 2Q×Γ , analicemos el dominio y el rango de esta

función:

Autómatas y Lenguajes - Año 2007– p.18/32


Dominio:

1. Q: estado actual.

2. (Σ ∪ {λ}): símbolo corriente en la entrada. Aquí, λ significa movimiento independiente de la

entrada (explicado más adelante).

3. Γ: representa el símbolo corriente en el tope de la pila.

O sea que δ toma como argumento una triupla: δ(q, a, X).

Rango:

Conjunto de posibles estados (no determinismo) con el correspondiente cambio del símbolo en el tope de

la pila. Observe que el tope (un símbolo) puede ser reemplazado por una cadena, incluyendo a la cadena

de longitud nula o λ. Es decir que el rango de δ es un conjunto del tipo: {(q, γ)|q ∈ Q ∧ γ ∈ Γ∗ }, si

γ = λ entonces se hace pop en la pila. Si γ = Y Z, entonces X es reemplazado por Z e Y es puesto en

la pila. Si γ = X, entonces la pila no se modifica.

Autómatas y Lenguajes - Año 2007– p.19/32

Un APD es por definición no determinístico. Antes de ver un ejemplo, veamos en detalle los tipos de

movimientos que un APD puede realizar.

Movimiento Dependiente de la entrada

Tiene en cuenta el símbolo corriente en la cinta de entrada. Luego, una transición de este tipo

tendría la siguiente forma:

δ(q, a, Z) = {(p1 , γ1 ), (p2 , γ2 ), ..., (pn , γn )}

donde

q ∈ Q, a ∈ Σ es el símbolo de la entrada, Z ∈ Γ es el tope de la pila y finalmente, pi ∈ Q,

γi ∈ Γ∗ con i = 1, 2, ..., n.

¿Cómo se interpreta?

Autómatas y Lenguajes - Año 2007– p.20/32


Movimiento Independiente de la entrada

No se tiene en cuenta el símbolo corriente en la entrada.

δ(q, λ, Z) = {(p1 , γ1 ), (p2 , γ2 ), ..., (pn , γn )}

Interpretación: igual a la anterior, excepto que no miramos el símbolo de la entrada para tomar una

decisión.

¿Qué pasa cuando γ = λ? - En este caso se reemplaza el tope de la pila por la cadena de longitud nula,

es decir se realiza la operación pop sobre la pila. Esto vale para cualquier tipo de movimiento.

Autómatas y Lenguajes - Año 2007– p.21/32

Ejemplo:

Construir un APD P , tal que L(P ) = {0n 12n |n > 1}.

Un APD puede ser caracterizado por la especificación completa de la función de transición.

δ(q0 , 0, Z0 ) = {(q1 , 00Z0 )} δ(q2 , 1, 0) = {(q2 , λ)}

δ(q1 , 0, 0) = {(q1 , 000)} δ(q2 , λ, Z0 ) = {(q3 , λ)}

δ(q1 , 1, 0) = {(q2 , λ)}

Sin embargo, como lo hacíamos con un AF, podemos representar gráficamente cada una de las

transiciones y estados del APD.

Autómatas y Lenguajes - Año 2007– p.22/32


0,0 000 1, 0

0,Z0 00Z0 1,0 q2


q0 q1

λ, Z 0
q3

Autómatas y Lenguajes - Año 2007– p.23/32

Lenguaje reconocido por un APD.

Configuración: es una notación especial para describir el estado actual del autómata (una descripción

instantánea). Una configuración de un APD es una triupla (q, w, γ) ∈ Q × Σ∗ × Γ∗ donde:

q es el estado actual,

w es la cadena remanente en la entrada (aun no analizada),

γ es el contenido de la pila,

luego, un movimiento de un APD se representa relacionando dos configuraciones de la siguiente manera:

(q, aw, Zα) ⊢ (p, w, γα) si δ(q, a, Z) contiene a (p, γ)

Estando en el estado q, consumiendo a (el cual puede ser λ) de la entrada, reemplazamos Z por γ y se

mueve al estado p.

Autómatas y Lenguajes - Año 2007– p.24/32


En forma similar a la relación deriva, definimos:

i
⊢: movimiento en i pasos.
+
⊢: movimiento en uno o más pasos (clausura transitiva).

⊢: movimiento en cero o más pasos (clausura reflexo- transitiva).

Configuraciones especiales:

Configuración Inicial: (q0 , w, Z0 ) con w ∈ Σ∗ .

Configuración Final: (q, λ, α), con q ∈ F y α ∈ Γ∗ .


Una cadena w ∈ Σ∗ es aceptada por un APD P , si (q0 , w, Z0 ) ⊢ (q, λ, α) y q ∈ F .

Es decir, partiendo de una configuración inicial y con la aplicación de sucesivos movimientos legales,

llegamos a una configuración final.

Autómatas y Lenguajes - Año 2007– p.25/32


Teorema 2: Si P = (Q, Σ, Γ, δ, q0 , Z0 , F ) es un APD, y (q, x, α) ⊢ (p, y, β), entonces para cualquier

cadena w ∈ Σ∗ y γ ∈ Γ∗ , es también verdad que:



(q, xw, αγ) ⊢ (p, yw, β, γ)

Lenguaje aceptado por un APD.

Existen dos maneras de aceptar un lenguaje. Una es por estado final (forma clásica de un autómata) y la

otra, relacionada con un APD, es por pila vacía. A continuación definimos cada una de ellas:

Lenguaje aceptado por estado final.



L(P ) = {w ∈ Σ∗ |(q0 , w, Z0 ) ⊢ (p, λ, α), p ∈ F y α ∈ Γ∗ }

Lenguaje aceptado por pila vacía.



N (P ) = {w ∈ Σ∗ |(q0 , w, Z0 ) ⊢ (p, λ, λ), p ∈ Q}

Autómatas y Lenguajes - Año 2007– p.26/32


Se puede demostrar que los lenguajes aceptados por APDs por pila vacía son exactamente los mismos

que los aceptados por APDs por estado final.

Pila vacía a estado final

Mostramos que las clases de lenguajes que son L(P ) para algún APD P es lo mismo que la clase de

lenguajes que son N (P ) para algún APD P . Es decir que, mostraremos como a partir de un APD PN

que acepta el lenguaje L por pila vacía construímos un APD PF que acepta L por estado final.

Teorema 3: si L = N (PN ) para algún APD PN = (Q, Σ, Γ, δN , q0 , Z0 ), entonces hay un APD PF tal

que L = L(PF ).

Demostración: usamos un nuevo símbolo X0 , que cumple la función de símbolo de comienzo de PF y de

marcador sobre el fin de la pila cuando PN llega a pila vacía. Podemos observar en la figura, en la

próxima página, cual es la idea de la prueba de este teorema:

Autómatas y Lenguajes - Año 2007– p.27/32

λ ,X 0 / λ

λ ,X 0 / λ

λ ,X 0 /Z 0 X
p 0 q0 p
0 f
λ ,X 0 / λ

λ ,X 0 / λ

También necesitamos un nuevo símbolo de comienzo p0 . Entonces PF simula PN , hasta que la pila de

PN está vacía, lo cual PF lo detecta porque ve X0 en el tope. Además necesiat un estado más, pf , el

cual es el estado final de PF . La especificación de PF es como sigue:

PF = (Q ∪ {p0 , pf }, Σ, Γ, δf , p0 , X0 , {pf })

donde δf se define así:

Autómatas y Lenguajes - Año 2007– p.28/32


1. δf (p0 , λ, X0 ) = {(q0 , Z0 , X0 )}

2. Para todo estado q ∈ Q, las entradas a ∈ Σ o a = λ, y los símbolos de la pila Y ∈ Γ, δ(q, a, Y )

contiene todos los pares en δN (q, a, Y ).

3. Además de la regla 2., δF (q, λ, X0 ) contiene (pf , λ) para todo estado q ∈ Q.

Ahora debemos probar que w ∈ L(PF ) sí y sólo sí w ∈ N (PN ).



(Sí) Tenemos que (q0 , w, Z0 ) ⊢PN (q, λ, λ).

Por teorema 2 podemos insertar X0 y concluímos que (q0 , w, Z0 X0 ) ⊢PN (q, λ, X0 ).

Por la regla 2., PF tiene todos los movimientos de PN , concluímos que (q0 , w, Z0 X0 ) ⊢PF (q, λ, X0 ).

Si ponemos todo junto, desde la regal 1. a la 3., tenemos:



(p0 , w, X0 ) ⊢PF (q0 , w, Z0 X0 ) ⊢PF (q, λ, X0 ) ⊢PF (pf , λ, lambda) (3.1)

Por lo tanto PF acepta w por estado final.

Autómatas y Lenguajes - Año 2007– p.29/32

(Sólo Sí) Basta observar las transiciones adicionales de las reglas 1. a 3. Cualquier computación de PF

que acepta w debe ser como (3.1). Excepto por el primer y último paso PF no puede usar otras

transiciones que no sean también transiciones de PN . Por lo tanto w ∈ N (PN ).

Estado final a pila vacía

Se puede también demostrar que dado un APD PF que acepta un lenguaje L por estado final, se puede

construir otro APD PN que acepta L por pila vacía.

Teorema 4: sea L = L(PF ) para algún APD PF = (Q, Σ, Γ, δF , q0 , Z0 , F ), entonces hay un APD

PN tal que L = N (PN ).

Ver demostración en la bibliografía (página 235).

Autómatas y Lenguajes - Año 2007– p.30/32


Autómata Push-Down Determinístico

Definición: Un APD P = (Q, Σ, Γ, δ, q0 , Z0 , F ) es determinístico, si la función de transición satisface las

siguientes restricciones:

∀q ∈ Q ∧ Z ∈ Γ siempre que δ(q, λ, Z) esté definida, luego δ(q, a, Z) está indefinida ∀a ∈ Σ.

No permite simultáneamente movimientos independientes y dependientes de la entrada para un

mismo q y Z.

Para ningún q ∈ Q, Z ∈ Γ, a ∈ (Σ ∪ {λ}); δ(q, a, Z) no contiene más de un elemento. La

cardinalidad del conjunto de posibles acciones puede ser uno o cero.

Autómatas y Lenguajes - Año 2007– p.31/32

Sin embargo, la familia de lenguajes reconocidos por APDs no determinísticos (LAP D−nodet ) no es

equivalente a la reconocida por los APD Determinísticos (LAP D−det ). En particular se cumple que

LAP D−det ⊂ LAP D−nodet .

Veamos esto planteando el siguiente problema: Diseñar un APD Determinı́stico que reconozca el lenguaje

L = {xxt |x ∈ {a, b}∗ }. ¿Es esto posible de realizar? (Ejercicio)

Autómatas y Lenguajes - Año 2007– p.32/32

Das könnte Ihnen auch gefallen