Académique Documents
Professionnel Documents
Culture Documents
ndice general
I Introduccin 3
I.1 Lenguaje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
I.1.1 Lenguajes particulares . . . . . . . . . . . . . . . . . . . . . . 4
I.1.2 Operadores de utilidad . . . . . . . . . . . . . . . . . . . . . . 4
I.2 Expresiones regulares . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
II Gramtica 7
II.1 Gramticas independientes del contexto . . . . . . . . . . . . . . . . . 10
IV Autmatas a pila 19
V Gramticas de atributos 23
V.1 Anlisis semntico . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
VI Analizador morfolgico 34
VIIAnalizador sintctico 36
VII.1 Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
VII.2 Tablas de anlisis ascendente . . . . . . . . . . . . . . . . . . . . . . 38
VII.2.1 Tablas LR(0) . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
VII.2.2 Tablas SLR(1) . . . . . . . . . . . . . . . . . . . . . . . . . . 44
VII.2.3 Tablas LR(1) . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
VII.2.4 Tablas LALR(1) . . . . . . . . . . . . . . . . . . . . . . . . . 51
VII.3 Anlisis descendente . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
VII.3.1 Forma normal de Greigbach . . . . . . . . . . . . . . . . . . . 53
VII.3.2 Cundo nos interesa eliminar las transiciones ? . . . . . . . . 56
VII.3.3 Anlisis LL(1) usando la tabla . . . . . . . . . . . . . . . . . . 56
VII.3.4 Anlisis LL(2) usando la tabla . . . . . . . . . . . . . . . . . . 59
VII.3.5 Anlisis LL(*) . . . . . . . . . . . . . . . . . . . . . . . . . . 60
1 de 100
Autmatas y lenguajes - 2014/2015 - UAM Pedro Valero y Alberto Parramn
A Ejercicios 70
A.1 Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
B Ejercicios 1a Hoja 73
B.1 Ejercicios sobre autmatas finitos y lenguajes regulares . . . . . . . . . 73
B.2 Ejercicios sobre autmatas a pila y gramticas independientes del contexto 77
C Ejercicios 2a Hoja 79
C.1 Ejercicios sobre Gramticas de Atributos . . . . . . . . . . . . . . . . 79
D Ejercicios 3a Hoja 86
D.1 Ejercicios de anlisis . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
2 de 100
Autmatas y lenguajes - 2014/2015 - UAM Pedro Valero y Alberto Parramn
Captulo I
Introduccin
Mquinas/Autmata
Autmatas finitos Expresiones regulares
Autmatas de pila Lenguajes independientes del contexto
Problemas Qu se puede computar?. Conjeturas que se creen ciertas pero cuya
veracidad, por ahora, no se ha demostrado.
Lenguajes/Gramtica
Nuestro objetivo es ver qu relacin existe entre estos tres elementos. Para ello,
primero debemos establecer algunas definiciones.
I.1. Lenguaje
Palabra Definicin I.3 Palabra (Cadena). Secuencia finita de smbolos tomados de un alfa-
(Cadena) beto. La palabra vaca tiene 0 smbolos y se representa por .
Ser conveniente acostumbrarnos a usar el trmino cadena en lugar del trmino
palabra ya que representa mejor el concepto que queremos representar.
P P
Lenguaje Definicin I.6 Lenguaje universal (sobre ). Denotado por representa el
universal
P conjunto de todas las palabras que se pueden formar con los smbolos de , incluido
(sobre ) .
Lenguaje Definicin I.8 Lenguaje vaco. Lenguaje que no contiene ningn elemento: .
vaco
Lenguaje Definicin I.9 Lenguaje {}. Lenguaje que slo contiene . El lenguaje {} es
{} distinto del lenguaje vaco aunque sea la palabra vaca. En particular |{}| = 1 y
|| = 0.
Lenguajes Definicin I.11 Lenguajes Regulares. Son lenguajes que pueden ser admitidos por
Regulares autmatas finitos.
En otras palabras, estos conceptos nos sirven para entender por qu representa todas
las palabras posibles. Para poder entender esto debemos entender la multiplicacin
como una concatenacin y la suma como un OR. As el elemento neutro del producto
sera la cadena vaca.
Tomemos ahora el alfabeto binario = {0, 1} Entonces:
1.
L() =
2.
L()={}
3. a
L(a) = {a}
1. + (Unin de lenguajes)
L( + ) = L() L()
2. . (Concatenacin de lenguajes)
L(.) = L(). L()
3. (Cierre)
L( ) = L()
L( ) = L()
El cierre es la repeticin de cero o ms veces de las expresiones regulares a las
que aplica.
1. *
2. .
3. +
Ejemplo: Encontrar los lenguajes definidos por las siguientes expresiones regulares:
1. a.(b + a).b
Cadenas de tres smbolos que empiezan por a y acaban por b y el smbolo
central es una a o una b: {abb,aab}
2. (a + b)
Cadenas de un solo smbolo, que es o a o b: {a,b}
3. (a + b)
Todas las cadenas posibles formadas por los smbolos a y b (incluso la cadena
vaca)
4. (a + b).(a + b)
Todas las cadenas posibles formadas por los smbolos a y b. Pero no incluye la
cadena vaca ya que por (a + b) necesariamente deben contener una a o una
b.
5. (aa + bb)
Todas las cadenas posibles formadas por a y b con la condicin de que siempre
aparezcan los smbolos consecutivos un nmero par de veces. Es decir, cadenas
del tipo aaaabbaabbbbbb, (no valdra aaabb) (incluyendo la cadena vaca).
Captulo II
Gramtica
Gramtica Definicin II.1 Gramtica. Hay varias definiciones para este trmino. No son muy
precisas pero nos dan una idea de su significado:
3. PREDICADO VERBO
4. ARTCULO el | un
Estas reglas constituyen una gramtica que nos permite generar un lenguaje. En este
caso el lenguaje estara por formado todas las cadenas que se pueden construir a partir
de estas reglas. Empezando siempre por el axioma (en este caso: ORACIN).
Una gramtica est compuesta por una serie de elementos que definiremos a con-
tinuacin.
Smbolos Definicin II.2 Smbolos terminales (T). Conjunto de smbolos que pueden aparecer
terminales en la cadena final (o sentencia). En el ejemplo anterior seran elementos terminales
(T) aquellos escritos en minscula. Para ellos no existe ninguna regla que indique cmo se
derivan.
Smbolos Definicin II.3 Smbolos no terminales (N). Conjunto de smbolos que no pue-
no ter- den aparecer en la cadena final. Simplemente son usados para definir las reglas de
minales derivacin.
(N)
Los conjuntos T y N deben ser disjuntos, es decir T N = . Utilizaremos el smbolo
para referirnos a la unin de ambos, = T N .
Reglas de Definicin II.4 Reglas de produccin (P). Explican cmo se transforma un smbolo
produccin no terminal en un conjunto de smbolos terminales y/o no terminales.
(P)
Smbolo Definicin II.5 Smbolo inicial / Axioma (S). Indica dnde empieza a construirse
inicial / la cadena. En el ejemplo anterior, el axioma sera el smbolo ORACIN. Una gramtica
Axioma slo puede tener un nico axioma.
(S)
G = (T, N, P, S)
Una gramtica permite generar cadenas para un lenguaje. Por ejemplo, para la
gramtica anterior:
ORACIN (derivamos ORACIN:)
SUJETO PREDICADO (derivamos SUJETO:)
ARTCULO NOMBRE PREDICADO (derivamos ARTCULO:)
el NOMBRE PREDICADO (derivamos NOMBRE;)
el coche PREDICADO (derivamos PREDICADO:)
el coche VERBO (derivamos VERBO:)
el coche corre (acabamos, pues no hay ms que derivar)
Este proceso se llama derivacin. Cada una de las cadenas en una derivacin se de-
nomina forma sentencial. La ltima de ellas es una cadena vlida del lenguaje generado
por la gramtica, y se denomina sentencia. Est formada nicamente por smbolos ter-
minales de la gramtica. El lenguaje generado por una gramtica, L(G), es el conjunto
de todas las sentencias posibles, es decir, el conjunto de todas las cadenas de smbolos
no terminales que pueden derivarse a partir del axioma.
Vamos a ver algunos ejemplos de gramticas y los lenguajes que generan:
1. S aSb
2. S
T = {a, b}
N = {S}
Y su axioma es S.
El lenguaje generado por esta gramtica seran todas las palabras de la forma: ai bi
con i = 0, 1, ...
1. S abS
2. S a
Gramticas Definicin II.7 Gramticas independientes del contexto. Son aquellas cuyas
indepen- reglas tienen un nico smbolo no terminal en el lado izquierdo.
dientes del
contexto
Ejemplo: Gramtica dependiente de contexto
aSb abb
cSd cdd
A aA
Aa
B aA
Ba
B Aa
Ba
Ax
Con A N , x con = T N
Ejemplo: El lenguaje:
L = {wwR : w (a + b) }
es independiente del contexto puesto que puede representarse por medio de una gra-
mtica G independiente del contexto, que sera:
S aSa
S bSb
Para demostrar que el lenguaje generado por la gramtica, L(G), es el mismo que
L, habra que hacer dos cosas:
El punto 1 es fcil de ver, pues est claro que cualquier cadena generada por G es
simtrica (siempre que aadimos una a al principio aadimos otra al final, y lo mismo
para b).
Para demostrar el punto 2 vamos a probar que si w L entonces w L(G)
usando induccin:
Derivacin Definicin II.9 Derivacin directa. Dada una gramtica independiente del contexto
directa G=(N,T,S,P) y sean v, w dos formas sentenciales, decimos que w es derivacin directa
de v:
v w v = xZy w = xy regla en P Z
con Z N y .
Derivacin Definicin II.10 Derivacin. Dada una gramtica G=(N,T,S,P) y sean v, w dos
formas sentenciales, decimos que w es derivacin de v, y lo escribimos v + w, si
existe una cadena de formas sentenciales a0 , a1 , a2 ,... an , tales que:
v = a0 a1 a2 ... an = w
Lenguaje Definicin II.11 Lenguaje generado por G. Dada una gramtica G=(N,T,S,P)
generado definimos el lenguaje generado por ella como:
por G
L(G) = {w T : S + w}
L = {an bn : n 0}
S aSb
L = {w (a + b) na (w) = nb (w)}
S aSb|bSa|
S SS
Para construirla nos hemos fijado en que una palabra w puede ser de 4 formas:
aw0 b con w0 L
bw0 a con w0 L
w=
aw0 a w = w1 w2 con w1 , w2 L
bw0 b w = w1 w2 con w1 , w2 L
Una sentencia puede ser derivada de diferentes formas a partir de una misma
gramtica. Para estos casos vamos a definir derivaciones leftmost y rightmost:
Leftmost Definicin II.12 Leftmost. Consiste en derivar, en cada paso, el elemento no terminal
colocado ms a la izquierda. Se deja para el lector el arduo trabajo de deducir que
significa una derivacin rightmost.
Esto nos lleva a definir un nuevo concepto:
Ambigedad Definicin II.13 Ambigedad. Una gramtica se define como ambigua si existen dos
o ms rboles de derivacin distintos para la misma sentencia.
Otra forma de definirlo sera considerar ambiguas aquellas gramticas para las que
existen dos derivaciones leftmost (o rightmost) distintas para la misma sentencia.
E E + E|E E|I
I a|b|c
1. E E + E I + E a + E a + E E a + I E a + b E
a+bI a+bc
2. E E E E + E E I + E E a + E E a + I E
a+bE a+bI a+bc
Ya vimos que dos gramticas son equivalentes si generan el mismo lenguaje pero
vamos a recalcar que hay infinitas gramticas que generan el mismo lenguaje.
Dada una gramtica G=(T,N,S P) para obtener otra equivalente basta con hacer
otra:
G0 = (T, N {Z}, Z, P {Z E})
Captulo III
Q = conjunto de estados
= alfabeto de entrada
= funcin de transicin: : Q Q
q0 = estado inicial Q
F = conjunto de estados finales, F Q
Lenguaje Definicin III.3 Lenguaje aceptado por un AFD. El lenguaje aceptado por un
aceptado autmata finito determinista, A, es el conjunto de palabras que llevan al autmata a
por un un estado final.
AFD
L(A) = {w : (q0 , w) F }
Observacin: : Un autmata determinista tiene que tener todas las transiciones de-
finidas, se sobreentiende que las transiciones que no estn dibujadas van a un sexto
estado en el cual se quedan colgadas.
Este autmata es determinista y su transicin de estados dada una entrada "101"
sera:
entrada: 1 0 1
q0 q1 q3 q4
entrada: 1 0 1
q0 q1 q4 q5
q2 - -
Como al menos uno de los caminos lleva a un estado final, la cadena "101" forma
parte del lenguaje del autmata (los guiones indican transicin no definida, o a un
estado vaco).
La ventaja de un autmata no determinista es que podemos explorar varias ramas
en paralelo.
Transicin Definicin III.4 Transicin . Transicin que puede ocurrir sin consumir ningn valor
de entrada. Un autmata finito que tenga transiciones de este tipo se considera no
determinista.
Autmata Definicin III.5 Autmata finito no determinista. AFN . Autmata con funcin
finito no de transicin de la forma:
deter-
: Q ( {}) 2Q
minista.
AFN Es decir, dado un estado y una entrada (posiblemente vaca) salta a un conjunto de
estados.
Lenguaje Definicin III.7 Lenguaje aceptado por un AFN. El lenguaje aceptado por un
aceptado autmata finito no determinista, A, es el conjunto de palabras que llevan al autmata
por un a un estado final.
AFN
L(A) = {w : (q0 , w) F 6= }
El autmata queda:
Estados 1 0 1
q0 - - -
q1 q2 q4 q5
Esto significa que dado un autmata finito determinista que acepta un determinado
lenguaje, existe otro no determinista que acepta el mismo lenguaje, y viceversa. Se
utilizan los AFN por comodidad, porque las demostraciones formales son ms sencillas.
4. Mediante un AFN/AFD
Captulo IV
Autmatas a pila
Dado el lenguaje:
L = {wwR w (0 + 1) }
que representa palabras capicas sobre {0, 1} con un nmero par de smbolos, vamos
a intentar construir un autmata finito para l.
Esto no es posible ya que siempre necesito llegar hasta la mitad de la palabra
almacenando lo que hemos ledo para despus comprobar que lo leemos al revs.
Puesto que la palabra puede tener longitud arbitraria, necesitaremos una cantidad de
memoria arbitraria y esto no es viable (sera necesario un autmata con un nmero
infinito de estados).
Es aqu donde surgen los autmatas a pila. Estos autmatas se caracterizan por
que en cada salto indicamos una entrada, saca el smbolo de la cima de la pila y aade
una cadena a la pila.
Para el lenguaje dado, el autmata a pila que lo representa sera:
Acb
donde A sera la entrada leda, b el elemento que extraemos del tope de la pila y c la
cadena que insertamos en la pila. Por tanto una transicin solo se puede dar si aparte
de tener la entrada correspondiente, la cima de la pila coincide con lo que vamos a
extraer de ella. Introducir az implica que la a se queda como cima de la pila, y la z
detrs.
En algunos ejercicios usaremos la notacin {b, A, c} con idntico significado.
siendo:
Q: conjunto de estados
: alfabeto de entrada
: funcin de transicin: : Q ( {}) T 2QT
q0 : estado inicial Q
T : alfabeto de la pila
Autmata Definicin IV.2 Autmata a pila determinista. Un autmata a pila ser determi-
a pila de- nista si cumple las siguientes condiciones:
terminista
No hay transiciones o, si las hay, no hay ninguna otra transicin con un smbolo
diferente. Es decir, si desde un estado p y con a en la pila pudieras pasar a otro
q por una transicin lambda, no habra otra posible transicin desde el estado p
y con a en la pila.
3. A = Contenido de la pila, A T
Precedencia Definicin IV.4 Precedencia entre descripciones instantneas. Decimos que una
entre des- descripcin instantnea precede a otra:
cripciones
instant- (q, xX, aA) ` (p, X, bA)
neas
si:
(p, b) (q, x, a)
Siendo p,q nodos del autmata, x el siguiente smbolo de entrada que se va a leer,
X el resto de la cadena de entrada; a el carcter que hay en la cima de la pila, A el
resto del contenido de la pila y,b una cadena de smbolos que insertamos en la pila.
En este transicin se lee x, se saca a de la cima de la pila y se introduce b.
Es decir, una descripcin instantnea precede a otra si hay una transicin que nos
lleva de una a otra.
Precedencia Definicin IV.5 Precedencia *. Decimos que hay precedencia * entre dos descrip-
* ciones instantneas:
(q, X, A) ` (p, Y, B)
cuando hay una secuencia d0 , d1 , ..., dn de descripciones instantneas tales que:
con p, q Q, X, Y y A, B T .
Basndonos en estas definiciones, podemos representar el lenguaje aceptado por
un autmata a pila como:
con p F, X T
L = {an bn , n 0}
Captulo V
Gramticas de atributos
Por tanto, una vez obtenido el rbol de derivacin, el anlisis semntico recorrer dicho
rbol utilizando el recorrido en profundidad por la izquierda y con vuelta atrs
(lo explicamos ms adelante) corroborando el buen funcionamiento de estas nuevas
funciones.
El paso de informacin de un nodo a otro del rbol se podr realizar mediante tres
mtodos:
Vamos a ver un ejemplo con detalle, explicando sobre l algunos de los conceptos:
Como hemos dicho, la idea es que dada una gramtica independiente del contexto,
podemos conseguir que esta realice funciones especficas. Lo conseguimos aadiendo
atributos y especificaciones a las reglas de derivacin.
L (I)
I (I)
I II
I
En primer lugar vamos a derivar el axioma y obtener una sentencia, nos queda (por
ejemplo) el siguiente rbol de derivacin:
I I
I I
( ( ) ( ( ) ) )
I {I.prof = 0}
En las dos primeras reglas, debemos realizar una propagacin hacia arriba, aumen-
tando en uno la profundidad. As estas dos primeras reglas quedan de la forma:
L (I){L.prof = I.prof + 1}
Para la tercera regla, podemos ver que la profundidad que asciende ser el mximo
de las profundidades de cada uno de los smbolos en los que deriva. La tercera regla
quedara:
I1 I2 I3 {I1 .prof = max(I2 .prof, I3 .prof )}
Con P:
I {0 : I.prof = 0}
As, hemos conseguido una gramtica de atributos que realiza una funcin especfica
(obtener la profundidad). Lo hemos logrado a partir de una gramtica independiente
del contexto aadiendo atributos y el instante en el que debo realizar cada asignacin
en las reglas de derivacin.
Adems, una gramtica de atributos contiene una informacin global. En este caso
no la vamos a usar por lo que la declaramos vaca (es el ltimo smbolo que se ha
aadido a G).
Tambin debemos saber que el rbol se recorre en profundidad por la izquierda y
con vuelta atrs. Esta tcnica consiste en recorrer siempre el hijo ms a la izquierda,
cuando no queden hijos a la izquierda, continuamos con el siguiente hijo ms a la
izquierda. Cuando no queden hijos volvemos al nodo superior y as sucesivamente.
I1
p=2 en instante 2
I2 I3
p=1 en instante 2 p=2 en instante 2
I4 I5
p=0 en instante 0 p=1 en instante 2
I6
p=0 en instante 0
( ( ) ( ( ) ) )
Sntesis
G = {{(, )}, {L(n), I(n)}, L, P }
Herencia
G = {{(, )}, {L(n), I(antes, despues)}, L, P }
Hemos usado alguna accin que se sale de un esquema puro de herencia por ser
imposible realizarlo de otra forma.
Informacin global
L (I){0 : n = 0; 1 : n = n + 1}
I1 (I2 ){0 : n = n + 1}
I1 I2 I3
I
En las transparencias podis ver estos tres ejemplos para diferenciar la herencia, la
sntesis y la informacin global (llamada tabla de smbolos):
AutLen () Gramaticas de atributos 7 de octubre de 2014 2 / 27 AutLen () Gramaticas de atributos 7 de octubre de 2014 3 / 27
E E
E E
E E
E E
c c c
c c c
c.valor = 4 c.valor = 2 c.valor = 3
c.tipo = int c.tipo = int c.tipo = int
( 4 + 2 ) * 3
( 4 + 2 ) * 3
AutLen () Gramaticas de atributos 7 de octubre de 2014 4 / 27 AutLen () Gramaticas de atributos 7 de octubre de 2014 5 / 27
E E
E E E E
E
E E.valor = 6
E.tipo = int
E E E E
E.valor = 4 E.valor = 2 E.valor = 4 E.valor = 2
E.tipo = int E.tipo = int E.tipo = int E.tipo = int
c c c c c c
c.valor = 4 c.valor = 2 c.valor = 3 c.valor = 4 c.valor = 2 c.valor = 3
c.tipo = int c.tipo = int c.tipo = int c.tipo = int c.tipo = int c.tipo = int
( 4 + 2 ) * 3 ( 4 + 2 ) * 3
AutLen () Gramaticas de atributos 7 de octubre de 2014 6 / 27 AutLen () Gramaticas de atributos 7 de octubre de 2014 7 / 27
E
E E.valor = 18
E.tipo = int
E E E E
E.valor = 6 E.valor = 3 E.valor = 6 E.valor = 3
E.tipo = int E.tipo = int E.tipo = int E.tipo = int
E E
E.valor = 6 E.valor = 6
E.tipo = int E.tipo = int
E E E E
E.valor = 4 E.valor = 2 E.valor = 4 E.valor = 2
E.tipo = int E.tipo = int E.tipo = int E.tipo = int
c c c c c c
c.valor = 4 c.valor = 2 c.valor = 3 c.valor = 4 c.valor = 2 c.valor = 3
c.tipo = int c.tipo = int c.tipo = int c.tipo = int c.tipo = int c.tipo = int
( 4 + 2 ) * 3 ( 4 + 2 ) * 3
AutLen () Gramaticas de atributos 7 de octubre de 2014 8 / 27 AutLen () Gramaticas de atributos 7 de octubre de 2014 9 / 27
Ejemplo 2 (herencia) Ejemplo 2 (herencia)
AutLen () Gramaticas de atributos 7 de octubre de 2014 10 / 27 AutLen () Gramaticas de atributos 7 de octubre de 2014 11 / 27
T
L
T L T.tipo = int
L
L
L
L
i i i
i i i
i.nombre = x i.nombre = y i.nombre = z
i.nombre = x i.nombre = y i.nombre = z
int x , y , z
int x , y , z
AutLen () Gramaticas de atributos 7 de octubre de 2014 12 / 27 AutLen () Gramaticas de atributos 7 de octubre de 2014 13 / 27
T L T L
T.tipo = int L.tipo = int T.tipo = int L.tipo = int
L L
L.tipo = int
L L
i i i i i i
i.nombre = x i.nombre = y i.nombre = z i.nombre = x i.nombre = y i.nombre = z
int x , y , z int x , y , z
AutLen () Gramaticas de atributos 7 de octubre de 2014 14 / 27 AutLen () Gramaticas de atributos 7 de octubre de 2014 15 / 27
T L T L
T.tipo = int L.tipo = int T.tipo = int L.tipo = int
L L
L.tipo = int L.tipo = int
L L
L.tipo = int L.tipo = int
i i i i i i
i.nombre = x i.nombre = y i.nombre = z i.nombre = x i.nombre = y i.nombre = z
int x , y , z int x , y , z
AutLen () Gramaticas de atributos 7 de octubre de 2014 16 / 27 AutLen () Gramaticas de atributos 7 de octubre de 2014 17 / 27
Ejemplo 3 (informacion global) Ejemplo 3 (informacion global)
Gramatica de atributos:
Gramatica independiente del contexto:
G = {{int, float, c(valor , tipo), i(nombre),00 ,00 , +, , (, ), =},
G = {{int, float, c, i,00 ,00 , +, , (, ), =}, {P, D, A, T , L, E }, P, R}
{P, D(tipo), A(valor , tipo), T (tipo), L(tipo), E (valor , tipo)}, P, R}
Conjunto de reglas de produccion R:
Conjunto de reglas de produccion R:
P ::= DA
P ::= DA
D ::= TL
D ::= TL{D.tipo = T .tipo; L.tipo = T .tipo}
T ::= int
T ::= int{T .tipo = int}
T ::= float
T ::= float{T .tipo = float}
L ::= L, i
L1 ::= L2 , i{L2 .tipo = L1.tipo; st(i.nombre, L1 .tipo)}
L ::= i
L ::= i{st(i.nombre, L.tipo)}
A ::= i = E
A ::= i = E {A.valor = E .valor ; A.tipo = E .tipo; sv (i.nombre, E .valor )}
E ::= E + E
E1 ::= E2 + E3 {E1 .valor = E2 .valor + E3 .valor ; E1 .tipo = E2 .tipo}
E ::= E E
E1 ::= E2 E3 {E1 .valor = E2 .valor E3 .valor ; E1 .tipo = E2 .tipo}
E ::= (E )
E1 ::= (E2 ){E1 .valor = E2 .valor ; E1 .tipo = E2 .tipo}
E ::= i
E ::= i{E .valor = gv (i.nombre); E .tipo = gt(i.nombre)}
E ::= c
E ::= c{E .valor = c.valor ; E .tipo = c.tipo}
AutLen () Gramaticas de atributos 7 de octubre de 2014 18 / 27 AutLen () Gramaticas de atributos 7 de octubre de 2014 19 / 27
D A
D A
T L E
T
L E
T.tipo = int
L E E
L E E
c c
i i i
c.valor = 3 c.valor = 5
i.nombre = x i.nombre = y i.nombre = x c c
c.tipo = int c.tipo = int i i i
c.valor = 3 c.valor = 5
i.nombre = x i.nombre = y i.nombre = x
c.tipo = int c.tipo = int
int x , y x = 3 + 5
int x , y x = 3 + 5
TS
TS
AutLen () Gramaticas de atributos 7 de octubre de 2014 20 / 27 AutLen () Gramaticas de atributos 7 de octubre de 2014 21 / 27
P P
D D
A A
D.tipo = int D.tipo = int
T L T L
E E
T.tipo = int L.tipo = int T.tipo = int L.tipo = int
L E E L
E E
L.tipo = int
c c c c
i i i i i i
c.valor = 3 c.valor = 5 c.valor = 3 c.valor = 5
i.nombre = x i.nombre = y i.nombre = x i.nombre = x i.nombre = y i.nombre = x
c.tipo = int c.tipo = int c.tipo = int c.tipo = int
int x , y x = 3 + 5 int x , y x = 3 + 5
TS TS
y(int, ?)
AutLen () Gramaticas de atributos 7 de octubre de 2014 22 / 27 AutLen () Gramaticas de atributos 7 de octubre de 2014 23 / 27
P P
D D
A A
D.tipo = int D.tipo = int
T L T L
E E
T.tipo = int L.tipo = int T.tipo = int L.tipo = int
E E
L L
E E E.valor = 3 E.valor = 5
L.tipo = int L.tipo = int
E.tipo = int E.tipo = int
c c c c
i i i i i i
c.valor = 3 c.valor = 5 c.valor = 3 c.valor = 5
i.nombre = x i.nombre = y i.nombre = x i.nombre = x i.nombre = y i.nombre = x
c.tipo = int c.tipo = int c.tipo = int c.tipo = int
int x , y x = 3 + 5 int x , y x = 3 + 5
TS TS
y(int, ?) y(int, ?)
x(int, ?) x(int, ?)
AutLen () Gramaticas de atributos 7 de octubre de 2014 24 / 27 AutLen () Gramaticas de atributos 7 de octubre de 2014 25 / 27
Ejemplo 3 (informacion global) Ejemplo 3 (informacion global)
E ::= E + E A ::= i = E
P P
A
D D
A A.valor = 8
D.tipo = int D.tipo = int
A.tipo = int
E E
T L T L
E.valor = 8 E.valor = 8
T.tipo = int L.tipo = int T.tipo = int L.tipo = int
E.tipo = int E.tipo = int
E E E E
L L
E.valor = 3 E.valor = 5 E.valor = 3 E.valor = 5
L.tipo = int L.tipo = int
E.tipo = int E.tipo = int E.tipo = int E.tipo = int
c c c c
i i i i i i
c.valor = 3 c.valor = 5 c.valor = 3 c.valor = 5
i.nombre = x i.nombre = y i.nombre = x i.nombre = x i.nombre = y i.nombre = x
c.tipo = int c.tipo = int c.tipo = int c.tipo = int
int x , y x = 3 + 5 int x , y x = 3 + 5
TS TS
y(int, ?) y(int, ?)
x(int, ?) x(int, 8)
AutLen () Gramaticas de atributos 7 de octubre de 2014 26 / 27 AutLen () Gramaticas de atributos 7 de octubre de 2014 27 / 27
Autmatas y lenguajes - 2014/2015 - UAM Pedro Valero y Alberto Parramn
Ejemplo: Para ver claramente las diferencia entre anlisis semntico y sintctico
nos podemos fijar en lo siguiente, segn el ejemplo 1, el cdigo:
int _x,_y
_x=7
int _x,_y
_z=7
Ejemplo: Vamos a tomar un caso sencillo con dos reglas sacadas del ltimo ejemplo
mostrado en las transparencias. La semntica es:
L i{st(i.nombre, L.tipo}
Captulo VI
Analizador morfolgico
Anlisis morfolgico
Anlisis sintctico
Anlisis semntico
Tras ser analizado, se genera un rbol de derivacin como los vistos hasta ahora.
Nos centramos ahora en el analizador morfolgico (tambin llamado lxico o scan-
ner). Este realiza principalmente la siguiente funcin:
Obtencin de unidades sintcticas. Son los llamados tokens. Estos pueden ser
identificadores, constantes, palabras reservadas (if , them, f or,...) u otros smbolos
(simples: +, =,... o dobles: :=,...).
begin
int A;
A := 100;
print A;
end
<"begin",TOK_BEGIN>
<"int",TOK_INT>
<"A",TOK_ID, valor=A>
.
.
.
<"100",TOK_CONST, valor=100>
.
.
.
Captulo VII
Analizador sintctico
VII.1. Introduccin
Para llevar a cabo el anlisis sintctico de una entrada se emplean tablas de anlisis.
Estas permiten analizar una sentencia, con el fin de saber si se trata de una sentencia
vlida para una gramtica dada o no.
Existen dos tipos de anlisis: ascendente y descendente
Veamos un ejemplo:
1) E E + E
2) E E x E
3) E -E
4) E (E)
5) E id
(id+id)xid
Para ello vamos a contar con la ayuda de una pila y nos basaremos en dos reglas
bsicas:
Puesto que en la pila slo queda el axioma, concluimos que la sentencia es vlida para
este lenguaje.
Tras este ejemplo podemos definir formalmente el algoritmo de anlisis ascendente.
Anlisis Definicin VII.1 Anlisis ascendente. Este algoritmo consiste de dos pasos:
ascenden-
te
Mientras queden elementos en la entrada:
desplazamos
mientras podemos reducir:
reducimos
Una vez visto el anlisis ascendente el siguiente paso es estudiar el anlisis descen-
dente.
Anlisis Definicin VII.2 Anlisis descendente. Algoritmo para determinar si una entrada es
descen- vlida o no para una gramtica dada mediante derivaciones (partiendo del axioma)
dente
Es decir, tomamos el axioma y aplicamos derivaciones sucesivas intentando llegar
a la sentencia que queremos analizar.
Si logramos generar la sentencia que estamos analizando, esta ser vlida. (En caso
contrario no)
Vamos a trabajar con gramticas sencillas en las que slo haya una derivacin
posible en cada paso. En caso de no ser as deberamos avanzar todo lo posible para
despus hacer backtracking, comprobando que no dejamos caminos sin explorar.
Vemoslo con un ejemplo:
E TB
B +TB |
T FX
X *FX |
F i | (E)
i*i
Para hacerlo apoyndonos en una pila, como en el ejemplo anterior, los pasos a seguir
son los siguientes:
Instante Pila Accin
1 E Derivamos
2 B|T Derivamos
3 B|X|F Derivamos
4 B|X|i Extraemos, pues i est en la sentencia dada
5 B|X Derivamos
6 B | X | F | * Extraemos, pues * est en la sentencia dada
7 B|X|F Derivamos
8 B|X|i Extraemos, pues i est en la sentencia dada
9 B|X Derivacin
10 B Derivacin
Si al finalizar nos queda la pila vaca concluimos que la sentencia estudiada es
correcta.
A lo largo de esta seccin profundizaremos sobre el anlisis ascendente y el anlisis
descendente.
Tabla Definicin VII.3 Tabla LR(n). Tabla empleada para el procesamiento de entrada
LR(n) desde la izquierda (Left) mediante derivaciones Right-most con n smbolos de entrada.
Veamos un ejemplo de como funciona esta tabla de anlisis
E T | E+T
T i | (E)
E E$
E E $
ET
E E+T
Ti
T (E)
Ahora lo que hacemos es aadir un . delante del smbolo que estemos analizando
en cada paso.
Para realizar el anlisis por este mtodo vamos a construir un autmata finito
determinista, que procesa una cadena de smbolos, empezando por el estado S0:
A partir de este autmata se puede crear una tabla, denominada tabla de anlisis
LR(0) que resume el funcionamiento del autmata:
En la cual vemos que se indica la accin a realizar segn el estado en el que nos
encontremos y el smbolo de entrada que leamos.
As, para realizar el anlisis de una entrada nos basta con utilizar esta tabla y una
pila en la que vayamos guardando las acciones que vamos realizando.
A la hora de analizar una entrada realizamos los siguientes 5 tipos de acciones:
Ejemplo: Veamos un ejemplo del anlisis de una expresin que termina en error:
Veamos un ejemplo
E T E0
E 0 +T E 0
E0
T FT0
T 0 F T 0
T0
F (E)
F i
(0) B B $
(1) B bD;Ef
(2) D d
(3) D D;d
(4) E e
(5) E e;E
En el cual podemos observar que en el estado final S7 tenemos dos posibles acciones
si entra un ;, la de reducir (por ser estado final y encontrarse el . a la derecha de la
regla) o la de desplazar al estado S10
Por tanto nos quedara la siguiente tabla de anlisis LR(0):
Concluimos que no es por tanto un autmata LR(0) ya que tenemos conflictos que
debemos solucionar. Para ello usaremos SLR(1).
Tabla Definicin VII.6 Tabla SLR(1). Tabla que mejora la tabla de anlisis LR(0) modifi-
SLR(1) cando las transiciones de los estados finales del autmata.
En el caso de LR(0) realizaban una reduccin siempre, mientras que en SLR(1) se
especfica cundo hay que realizar una reduccin, cundo un desplazamiento, y cundo
vamos a un estado de error.
Por tanto el autmata quedar igual a simple vista (slo que ahora habr ms
transiciones a estados de error aunque estas no aparezcan dibujadas). Los cambios los
mostraremos en la tabla de anlisis.
La idea principal del anlisis SLR(1) es que slo aplicaremos las reducciones de
reglas de la forma X algo, delante del Siguiente(X).
Vamos a calcular los elementos siguientes de los no terminales B, D y E.
Como podemos observar, en el estado S7, se reduce siguiendo la regla (4) (ver
las reglas de la gramtica definidas al principio del ejemplo), pero slo si el siguiente
elemento de la entrada es una f, ya que siguiente(E)=f.
3. Modificar las filas de la tabla que correspondan a estados finales. Poniendo huecos
en blanco en todas las casillas salvo en aquellas en las que haya desplazamiento
y aquellas en las que realmente reduzcamos, es decir, en las que el siguiente
elemento del que vayamos a reducir coincida con el de la entrada.
(0) E E $
(1) E E+E
(2) E E*E
(3) E i
(0) S S $
(1) S xb
(2) S A
(3) A aAb
(4) A x
En el cual vuelve a ocurrir algo parecido a lo del ejemplo anterior. En este caso
tenemos que:
siguiente(S)={$}
siguiente(A)={b, $}
1. Ahora la gramtica extendida no va a tener una regla que sea S 0 S$ sino que
esta regla ser S 0 S{$}.
2. Vamos a formar cada estado como en LR(0), poniendo un . delante del smbolo
que estamos evaluando y cerrando ese smbolo como ya explicamos anterior-
mente.
3. A cada regla que aparezca en cada estado del autmata se deber aadir entre
corchetes lo que llamaremos el smbolo de adelanto.
Este smbolo es el siguiente(X) si tenemos X ABC..., es decir, el siguiente
del smbolo no terminal situado a la izquierda de la regla.
Esto es algo ms complicado de lo que parece.
El procedimiento a aplicar, consiste en partir nicamente de la regla que est
generando el autmata (En el estado inicial esta regla ser la derivacin del
axioma y en otros estados la regla que acabamos de derivar).
Para esta regla ya conocemos el smbolo de adelanto: si es un estado intermedio
conserva el smbolo de adelanto del estado anterior y si es el estado inicial su
smbolo de adelanto es $.
Una vez tenemos la regla inicial, calculamos su cierre en pequeos pasos. Es
decir, primero aadimos las reglas que se derivan del no terminal situado inme-
diatamente despus del punto (hasta aqu un paso), luego aplicamos calculamos
el cierre de cada una de estas nuevas reglas (por cada regla un paso).
Por qu realizamos esta distincin entre pasos que antes no hacamos? Por que
ahora ser necesario realizar un pequeo trabajo entre estos pasos.
En cada paso tomamos nicamente la regla que estamos cerrando y las reglas que
acabamos de aadir y, restringindonos a ese subconjunto de reglas, calculamos
los smbolos de adelanto de las mismas.
S aSb
S ab
Para empezar derivamos el axioma con la primera regla (en realidad dara igual
cual coger).
Obtenemos por tanto S->aSb y vemos que es compatible con la cadena buscada.
Nos hemos quedado sin reglas por aplicar, de modo que debemos deshacer una
accin ms. Volvemos al estado S->aSb y tratamos de aplicar la segunda regla:
Llegamos a S->aSb->aabb y vemos que coincide con la cadena buscada.
Compatibilidad Definicin VII.7 Compatibilidad. Para comprobar si la cadena que tenemos ahora
mismo es compatible con la cadena que estamos buscando simplemente vemos si los
primeros smbolos terminales (hasta el primer no terminal) coinciden.
Tal y como lo hemos explicado ,el algoritmo de anlisis descendente presenta dos
problemas graves:
1. Es extremadamente ineficiente
2. Recursividad por la izquierda.
Si nos encontramos con una gramtica del tipo
Sb
S Sb
y buscamos la cadena abb entraramos en un problema de recursin infinita pues
aplicar la primera regla no nos da la solucin final en ningn caso y con la segunda
regla tendremos siempre al inicio de la cadena un smbolo que no es terminal.
Para clasificar las gramticas segn puedan causarnos o no este problema vamos a
definir un nuevo concepto
Gramtica Definicin VII.8 Gramtica LL(1). Gramtica en la que todas las reglas presentan
LL(1) en la parte derecha 1 smbolo no terminal seguido de un smbolo cualquiera (terminal
o no terminal).
Adems, dos reglas con la misma parte izquierda deben un terminal distinto al
inicio de su parte derecha.
Estas gramtica son muy interesantes ya que presentan un claro determinismo, que
nos evita de hacer backtracking con lo que hacen la bsqueda muy eficiente.
Veremos dos mtodos para el anlisis de gramticas de este tipo pero antes debemos
definir un nuevo concepto muy importante de cara al anlisis descendente: Forma
normal de Greigbach
Forma Definicin VII.9 Forma normal de Greigbach. Decimos que una gramtica est en
normal de forma normal de Greigbach si todas las reglas son de la forma:
Greigbach
A a donde a T, N
A A
A
la convertimos en otra
A X
X X|
a) A aZ
b) Ai Aj con Ai precediendo a Aj
c) Ai Aj con Aj precediendo a Ai
4. Eliminar reglas
5. Eliminar indeterminismo
Dadas reglas de la forma
a) A aZ
b) A aB
a) A aW
b) W B
c) W Z
Tras este paso vemos si aparecen reglas recursivas. En caso afirmativo, las eli-
minamos antes de seguir.
E E+T
ET
T T T
T F
F i
Primero eliminamos las reglas recursivas por la izquierda y nos quedamos en:
E T X (tipo 2)
X +T X| (tipo 1)
T F Y (tipo 2)
Y T Y | (tipo 1)
F i (tipo 1)
donde hemos indicado el tipo de cada regla, preparndonos as para el paso siguiente.
Ahora tenemos que eliminar los smbolos no terminales del principio de la parte
derecha de las reglas. Para ello aplicamos las siguientes transformaciones
T FY = T iY
E T X = E F Y X = F iY X
E iY X
X +T X
T iY
Y T Y
F i
Pero a esta gramtica an le falta algo para ser de Greibach, tenemos que eliminar
las transiciones vacas, obteniendo:
E iY X
E iY
E iX
Ei
X +T X
X +T
T iY
T i
Y T Y
Y T
F i
En el ejemplo anterior ninguna de las reglas nos molestaban de modo que poda-
mos prescindir del ltimo paso para garantizar que la gramtica es LL(1)
a) pila=entrada=$ FIN
b) pila contiene x T
1) x = entrada = desplazamos entrada y pop
2) x 6= entrada = ERROR
c) pila contiene x N = saco x de la pila y meto .
S E$
E T E0
E 0 +T E 0
E0
T FT0
T 0 F T 0
T0
F i
F (E)
i + i i$
La tabla queda:
Smbolo + * i ( ) $
E E TE E T E0
E E 0 +T E 0 E0 E0
T T FT0 T FT0
T T0 T 0 F T 0 T0 T0
F F i F (E)
y el anlisis resulta:
P iEtP P 0 $
P a
P 0 eP
P0
Eb
Smbolo a t e b i $
P P a P iEtP P 0
P P 0 EP P0
P0
E Eb
Ejemplo: La gramtica
S aSb
S ab
Bb
S aW
W aW b
W b
S aSb
S ab
Smbolo aa ab
S S ab S aSb
Pero an quedan casos en los que no podemos resolver los conflictos ni usando
LL(2).
Por ejemplo, en la gramtica
ARGS ->
ARG -> ID
En este caso no hay problemas pues es bastante sencilla la tabla mostrada. No obstante,
en un caso ms general sera necesario cuidar que no se solapen las expresiones regulares
empleadas en el anlisis.
Captulo VIII
B F
G C
A-B -> X B-E -> X E-F -> X F-G -> X G-H -> X
A-E -> V B-F -> X E-G -> V F-H -> X
A-F -> X B-G -> X E-H -> H
A-G -> V B-H -> V
A-H -> X
Ejemplo:
y nos queda:
Como |xy| m podemos escoger un xy que sean todo as, de manera que xy i z
tendra mas as que bs y por tanto no pertenecera a L.
Hemos encontrado una palabra w que no cumple las condiciones que debera
cumplir toda palabra si el lenguaje fuese regular. Concluimos que el lenguaje no
es regular.
El truco esta en coger una palabra que no cumpla la implicacin, con la cual si
tenemos un A B y B no se cumple, se deduce que A tampoco. B A
Veamos otro ejemplo:
3. Tenemos: abab
| {z . . . ab} ab |aa {z
. . . a}
2m m
2m
z }| {
m m
z }| { z }| {
abab
| {z . . . ab} . . . ab ab aa . . . a
xy
Como |xyz| m tenemos que en xyz o bien no hay as o bien no hay cs, y por
tanto ux0 yz 0 v
/ L.
Hemos encontrado una palabra w que no cumple las condiciones que debera
cumplir toda palabra si el lenguaje fuese independiente del contexto. Concluimos
que el lenguaje no es independiente del contexto.
2. Elegimos una palabra w L con |w| m. Cogemos w = am1 bam1 b que tiene
|w| = 2m m
Vemos que si escogemos xyz = a, a, ..., b, a, a, ..., a, con esta divisin la palabra
ux0 yz 0 v L, y por tanto no nos vale como contraejemplo.
Se deja como ejercicio para e lector comprobar que la eleccin correcta es coger
un w = am bm am bm . Con esta palabra conseguiremos demostrar que el lenguaje
no es independiente del contexto.
n n m
Ejemplo: Tomemos el lenguaje L1 = a b c |n, m 1 generado por la
gramtica:
S AB
A aAb| ab
B cB| c
S AB
A aA| a
B bBc| bc
L1 LR es I.C.
L1 L2 = L1 L2 = L1 L2
Pero sin embargo acabamos de ver que L1 L2 no tiene por qu ser I.C.
L1 L2 no es necesariamente I.C.
Apndice A
Ejercicios
A.1. Ejercicios
S abB
A aaBb
B bbAa
S BaB
B Bb
B
El autmata sera:
S XaX
X XZ|
Z a|b
El autmata sera:
El autmata sera:
1. L = {a2n bn+1 }
2. L = {an bm n > m 0}
3. L = {an bm ck k = n + m}
1. Gramtica
S aaSb|b
Autmata
2. Gramtica
S aSb|aS|a
Autmata
3. Gramtica
S aSc|aAc|
A bAc|
Autmata
Apndice B
Ejercicios 1a Hoja
Apartado a)
(aa) .(a + b).(bb)
Apartado b)
(1 + 0) .1010.(1 + 0)
Apartado c)
@.(a + b + ... + z).(0 + 1 + ... + 9 + a + b + ... + z)
Apartado b)
Las transiciones no indicadas sobreentendemos que van a un nodo residuo.
Aunque nos pida el lenguaje nos vale con poner la expresin regular.
Ejercicio 1.5: Para el autmata siguiente encuentra (q0 , 1011) y (q1 , 01)
Explicacin: Nos piden la salida del autmata dada un estado inicial y una palabra.
(q0 , 1011) = q2
Estados 1 0 1 1
q0 q1 q0 q1 q2
q2 - -
q2 - - - -
(q1 , 01) = q1
Estados 0 1
q1 q0 q1
q2 -
En cada regla, si aparecen dos X estas tienen que acabar en el mismo smbolo
terminal. La otra opcin era poner muchas reglas ms tipo X0 , ..., X9 .
S XZX
Z XZX|X|
X 0|1|2|3|4|5|6|7|8|9
Ejercicio 2.2: Disea una gramtica independiente del contexto que genere
el lenguaje de los nmeros formados con el alfabeto = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 que
tengan el mismo nmero de dgitos pares e impares. Puede suponer por simplicidad
que los nmeros pueden tener ceros a la izquierda.
Apndice C
Ejercicios 2a Hoja
genera frases que consisten en una secuencia de pelculas con sus respectivas valora-
ciones realizadas por los usuarios.Al principio de las frases generadas por la gramtica
siempre aparece el nombre de un usuario. A continuacin se muestran tres ejemplos:
jaime Star_Wars(jaime:10)(ana:10) Spiderman(ana:10)(pepe:1)
ana Kapax(pepe:100)(jaime:1) Avatar(ana:40) Pi(pepe:100)(ana:1)
mike Kapax(pepe:100)(jaime:1) Avatar(ana:40) Pi(pepe:100)(ana:1)
Se desa aadir a esta gramtica un sistema de atributos que haga lo siguiente:
Por ejemplo, para las tres cadenas anteriores se mostraran respectivamente los
mensajes siguientes:
Se han valorado 2 pelculas. La mejor valorada por jaime es Star_Wars, con una
valoracin de 10.
Se han valorado 3 pelculas. La mejor valorada por ana es Avatar, con una valoracin
de 40.
Se han valorado 3 pelculas. Ninguna pelcula ha sido valorada por mike.
Notas:
Debe responderse a cada una de las cuestiones usando las plantillas correspon-
dientes
INSTATE ACCIN
axioma ::= USUARIO peliculas
1 peliculas.usuario_actual = USUARIO.nombre
2 print("Se han valorado " + peliculas.num + " pelculas")
print("la mejor valorada por " + USUARIO.nombre + " es " + peliculas.titulo
+ " con una valoracin de " + peliculas.nota + ".")
peliculas_1 ::= peliculas_2 pelicula
0 peliculas_2.usuario_actual = peliculas_1.usuario_actual
pelicula.usuario_actual = peliculas_1.usuario_actual
2 if(peliculas_2.nota>pelicula.nota){
peliculas_1.nota=peliculas_2.nota
peliculas_1.titulo=peliculas_2.titulo}
else{peliculas_1.nota=pelicula.nota
peliculas_1.titulo=pelicula.titulo}
peliculas_1.num = peliculas_2.num+1
peliculas ::= pelicula
0 pelicula.usuario_actual = peliculas.usuario_actual
1 peliculas.titulo = pelicula.titulo
peliculas.nota = pelicula.nota
peliculas.num=1
pelicula ::= TITULO valoraciones
0 valoraciones.usuario_actual = pelicula.usuario_actual
1 pelicula.titulo = TITULO.titulo
2 pelicula.nota=valoraciones.notamax
valoraciones_1 ::= valoraciones_2 valoracion
0 valoraciones_2.usuario_actual = valoraciones_1.usuario_actual
2 if(valoraciones_1.usuario_actual==valoracion.usuario AND valoraciones_2.notamax
6= 0){
print("ERROR")
}else if(valoraciones_1.usuario_actual==valoracion.usuario)}
valoraciones_1.notamax=valoracion.nota
}else if(valoraciones_2.notamax 6=0){
valoracion_1.notamax=valoraciones_2.notamax
}else{valoraciones_1.notamax=0}
valoraciones ::= valoracion
0 valoraciones.notamax=0
1 if(valoraciones.usuario_actual==valoracion.usuario){
valoraciones.notamax=valoracion.nota}
valoracion ::= (USUARIO:NUMERO)
2 valoracion.nota = NUMERO.valor
valoracion.usuario=USUARIO.nombre
Esta gramtica genera sentencias que consisten en una cantidad de DINERO se-
guida de una lsita de compras, cada una con un PRODUCTO y el PRECIO del
mismo. Tanto el DINERO como el PRECIO son nmeros reales.
Se desa aadir a esta gramtica un sistema de atributos que compruebe si
se puede hacer la compra con el dinero disponible. Se indicarn los productos de
la lista que se pueden comprar y el saldo disponible al final. Se supone que los
productos se adquieren en el mismo orden en el que aparecen en la lista.
Notas:
Esta gramtica genera sentencias entre las que se encuentran los nmeros romanos
hasta el 8.
Se pide aadir a la gramtica un sistema de atributos que compruebe si la
sentencia corresponde a un nmero romano correcto y, en caso afirmativo, imprima
su valor numrico.
No est permitido el uso de informacin global
romano ::= I V
{romano.esValido = true}
IList ::=
{IList.esValido = true}
{IList.items = 0}
Esta gramtica genera sentencias formadas por dos cadenas separadas por el signo
=. La primera cadena es igual que las generadas por la gramtica del ejercicio 5.
La segunda cadena es una lista de smbolos I.
Se pide aadir a la gramtica un sistema de atributos que compruebe si, en el
caso de que la primera cadena sea un nmero romano correcto, el valor del mismo
coincide con el nmero de smbolos I en la segunda cadena.
No est permitido el uso de informacin global
romano ::= I V
{Sntesis; romano.esValido = true}
{Sntesis; romano.value = 4}
IList ::=
{IList.esValido = true}
{IList.items = 0}
Apndice D
Ejercicios 3a Hoja
S ::= A
S ::= B
A ::= cA+b
A ::= a
B ::= cB+a
B :== b
Primeros:
Primero(A) ={c, a}
Primero(B) ={c, b}
Primero(S) ={a, c, b}
Sigueintes
siguiente(A) ={$, +}
siguiente(B) ={$, +}
siguiente(S) ={$}
E ::= T
E ::= E + T
T ::= i
T ::= (E)
E ::= .ES
E ::= .T
E ::= .E + T
T ::= .i
T ::=.(E)
E ::= (L)
E ::= i
L ::= L,E
L ::= E
a)
E ::= (.L)
L ::= .L,E
L ::= .E
E ::= .(L)
E ::= .i
b)
E ::= (L.)
D ::= iPSn
P ::= :n
S ::=
S ::= n
Para trabajar con esta gramtica primero aadimos la regla: D ::= D$, con lo que
nos queda el conjunto de reglas:
(3) S ::= .
(4) S ::= .n
a)
Estado i n : $ D P S
S0 d1 2
S1 d3 F3
S2 dacc F5
SF3 r3 r3/df4 r3 r3 4
b)
S3 dF2
SF4 r4 r4 r4 r4
S4 dF5
SF2 r2 r2 r2 r2
SF5 r1 r1 r1 r1
c) No se trata de una gramtica LR(0) ya que hay ocasiones en las que
observamos un conflico desplazamiento-reduccin. Por ejemplo, en el estado inicial
podemos reducir la S o desplazar segn la entrada dada.
Para ver si se trata de una gramtica SLR(1) vamos a ver si somos capaces de
solucionar los conflictos sabiendo cuales son los elementos siguientes:
Estado i n : $ D P S
S0 d1 2
S1 d3 F3
S2 dacc F5
SF3 r3/df4 4
S3 dF2
SF4 r4
S4 dF5
SF2 r2
SF5 r1
S ::= bLd
L ::= E;L
L ::=
E ::= i=c
E ::= b
(0) S ::= S $
(3) L ::=
(5) E ::= b
Estado i = c ; b d $ L E S
S0 dF0 1
S1 dacc
SF0 r3/d7 r3 r3 r3 r3/dF3 r3 r3 3 4
S3 dF1
SF1 r1 r1 r1 r1 r1 r1 r1
b) S4 dF4
SF4 r3 r3 r3 r3 r3 r3 r3 F5 4
SF5 r2 r2 r2 r2 r2 r2 r2
SF3 r5 r5 r5 r5 r5 r5 r5
S7 d8
S8 dF2
SF2 r4 r4 r4 r4 r4 r4 r4
c) No se trata de una gramtica LR(0) ya que hay ocasiones en las que
observamos un conflicto desplazamiento-reduccin.
Para ver si se trata de una gramtica SLR(1) vamos a ver si somos capaces de
solucionar los conflictos sabiendo cuales son los elementos siguientes:
Se corrigen los dos conflictos que hay ya que en el estado SF0 solo reduciremos
si llega una d, por tanto en el caso de que llegue una b o una i desplazaremos.
Quedando la tabla as:
Estado i = c ; b d $ L E S
S0 dF0 1
S1 dacc
SF0 d7 dF3 r3 3 4
S3 dF1
SF1 r1
S4 dF4
SF4 r3 F5 4
SF5 r2
SF3 r5
S7 d8
S8 dF2
SF2 r4
Ejercicio 1.6: Calcula los conjuntos primero y siguiente de todos los smbolos
no terminales de las gramticas siguientes
a)
X ::= Ye
X ::= eYZf
Y ::= g
Y ::= Yg
Z ::= h
b)
Q ::= fXY
X ::= cQ
X ::=
Y ::= iQ
Y ::=
c)
A ::= BXB
X ::= ,
X ::= .
X ::= e
B ::= 0B
B ::= 1B
B ::=
Apartado a)
primero(X)={e,g}
primero(Y)={g}
primero(Z)={h}
siguiente(X)={$}
siguiente(Y)={$,e,h}
siguiente(Z)={$,f}
Apartado b)
primero(Q)={f}
primero(X)={c,}
primero(Y)={i,}
siguiente(Y)=siguiente(Q) = {$, i}
Apartado c)
primero(X)={",",.,e}
primero(A)={0,1,",",.,e}
primero(B)={0,1,",",.,e}
siguiente(X)={$,0,1}
siguiente(A)={$,}
siguiente(B)={$,",",.,e}
Ejercicio 1.7: Cacula los smbolos de adelanto para el cierre de las siguientes
reglas y gramticas:
a) Cierre de E ::= .E {$} para la siguiente gramtica
E ::= E
E ::= T
E ::= E+T
T ::= i
T ::= (E)
S ::= S
S ::= L=R
S ::= R
L ::= *R
L ::= i
R ::= L
E ::= (L)
E ::= a
L ::= L,E
L ::= E
E ::= .E {$}
E ::= .T {$}
T ::= .i {+, $}
b)
S ::= .S {$}
S ::= .R {$}
L ::= .i {=, $}
R ::= .L {$}
c)
L ::= .L,E {, , )}
L ::= .E {, , )}
E ::= .a {, , )}
E ::= .(L) {, , )}
S ::= aSb
S ::= ab
a)
Estado S a b $
S0 S2 S1
S1 S3 S4 SF4
S2 ACC
S3 SF2
b) S4 S5 S4 SF1
S5 SF3
SF1 r3
SF2 r2
SF3 r2
SF4 r3
c) La secuencia de acciones sera la siguiente:
d) Cuando pasemos de LR(1) a LALR(1) vamos a agrupar los nodos SF4 y SF1
en uno solo as como SF2 y SF3, manteniendo las mismas reglas en cada caso y
estableciendo como smbolos de adelanto la unin de los smbolos de adelanto de las
reglas de los estados a unir.
S ::= XX
X ::= aX
X ::= b
(0) S ::= S
(1) S ::= XX
(2) X ::= aX
(3) X ::= b
Estado a b X S
S0 d1 dF0 acc 2
SF0 r3 r3
S1 d1 dF3 F4
SF3 r3 r3
b) SF4 r2 r2
S2 d3 dF2 F1
SF1 r1 r1
S3 d3 dF2 F5
SF5 r2 r2
SF2 r3 r3
D ::= iPSn
P ::= :n
S ::=
S ::= n
(0) S ::= S
(1) S ::= XX
(2) X ::= aX
(3) X ::= b
Estado i n : $ D P S
S0 d1 2
S1 d3 F3
S2 dacc F5
SF3 r3 r3/df4 r3 r3 4
b)
S3 dF2
SF4 r4 r4 r4 r4
S4 dF5
SF2 r2 r2 r2 r2
SF5 r1 r1 r1 r1