Beruflich Dokumente
Kultur Dokumente
Departamento de Informática
Facultad de Cs. Fco. Matemáticas y Naturales
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
Sin embargo tienen sus limitaciones desde el punto de vista semántico (declaración y uso de
identificadores en Pascal)
Ejemplos:
general de gramáticas.
El nombre “libre de contexto” se debe a que cada una de las producciones pueden ser aplicadas
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
E →E+E
E →E∗E
E → (E)
I →a
I →b
I → Ia
I → Ib
I → I0
I → I1
Las producciones de una gramática se utilizan para inferir que ciertas cadenas están en el lenguaje
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.
recordemos:
Esto significa que αγβ es obtenida a partir de αAβ por la aplicación de la regla o producción
A → γ ∈ P.
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) ⇒
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 .
Es un recurso alternativo para mostrar derivaciones en una gramática Tipo 2. Este es un concepto muy
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:
5. Si el vértice n tiene rótulo λ, luego n es una hoja y es el único descendiente de su padre. (Para las
E * E
I ( E )
b E + E
I I
b I 0
I 0
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).
Definición: Una gramática G, libre de contexto es ambigüa si existe al menos una cadena w en L(G)
Teorema 1: para cada gramática G = (N, Σ, P, S) y la cadena w ∈ Σ, w tiene dos árboles de parser
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
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
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
¿Cómo podríamos extender el AF para que pueda reconocer lenguajes en modalidad espejo?.
... Cinta
UC Pila
Autómata Push-Down.
Q : es el conjunto de estados,
Σ : Alfabeto de entrada,
q0 : el estado inicial,
∗
La función de transición es, δ : Q × (Σ ∪ {λ}) × Γ → 2Q×Γ , analicemos el dominio y el rango de esta
función:
1. Q: estado actual.
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
Un APD es por definición no determinístico. Antes de ver un ejemplo, veamos en detalle los tipos de
Tiene en cuenta el símbolo corriente en la cinta de entrada. Luego, una transición de este tipo
donde
γi ∈ Γ∗ con i = 1, 2, ..., n.
¿Cómo se interpreta?
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.
Ejemplo:
Sin embargo, como lo hacíamos con un AF, podemos representar gráficamente cada una de las
λ, Z 0
q3
Configuración: es una notación especial para describir el estado actual del autómata (una descripción
q es el estado actual,
γ es el contenido de la pila,
Estando en el estado q, consumiendo a (el cual puede ser λ) de la entrada, reemplazamos Z por γ y se
mueve al estado p.
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:
∗
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,
∗
Teorema 2: Si P = (Q, Σ, Γ, δ, q0 , Z0 , F ) es un APD, y (q, x, α) ⊢ (p, y, β), entonces para cualquier
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:
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 ).
marcador sobre el fin de la pila cuando PN llega a pila vacía. Podemos observar en la figura, en la
λ ,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
PF = (Q ∪ {p0 , pf }, Σ, Γ, δf , p0 , X0 , {pf })
(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
Se puede también demostrar que dado un APD PF que acepta un lenguaje L por estado final, se puede
Teorema 4: sea L = L(PF ) para algún APD PF = (Q, Σ, Γ, δF , q0 , Z0 , F ), entonces hay un APD
siguientes restricciones:
mismo q y Z.
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
Veamos esto planteando el siguiente problema: Diseñar un APD Determinı́stico que reconozca el lenguaje