Está en la página 1de 27

1

1
ANLISIS SINTCTICO
Cadena de
tokens
rbol
Sintctico
2
Anlisis Sintctico
Funciones
Comprobar que la secuencia de componentes lxicos cumple las
reglas de la gramtica
Generar el rbol sintctico
Ventajas de utilizar gramticas
Son especificaciones sintcticas y precisas de lenguajes
Se puede generar automticamente un analizador
El proceso de construccin puede llevar a descubrir
ambigedades
Imparte estructura al lenguaje de programacin, siendo ms fcil
generar cdigo y detectar errores
Es ms fcil ampliar y modificar el lenguaje
2
3
Analizador Sintctico, Tipos
Tres tipos generales de analizadores sintcticos:
Mtodos Universales: Cocke-Younger-Kasami y Earley
Sirven para cualquier gramtica
Muy ineficientes
Descendentes (top-down)
Construyen el rbol de anlisis sintctico desde arriba (raz, axioma)
hasta abajo (hojas, terminales)
Analizadores Descendentes Recursivos
Analizadores LL(1) con tabla
Ascendentes (bottom-up)
Construyen el rbol de anlisis sintctico desde abajo hacia arriba
Analizadores de Precedencia de Operador
Analizadores LR(1)
4
Analizador Sintctico
Tanto para el anlisis descendente como para el
ascendente:
La entrada se examina de izquierda a derecha, un smbolo cada
vez
Trabajan con subclases de gramticas
En general las gramticas sern LL y LR
LR(k) LL(k)
En la prctica solo se utilizan LR(1) y LL(1)
Muchos compiladores se llaman parser-driven debido
a que el analizador sintctico es el que llama al lxico
Existen herramientas para generar automticamente
analizadores sintcticos (YACC, Bison)
3
5
Anlisis Sintctico Descendente
Algoritmo
1. Poner el axioma como raz del rbol de derivacin
2. Hasta que solo haya smbolos terminales, derivar ms a la izquierda
Ejemplo
Entrada: Id.*.Id.+.Id
Gramtica:
Expresin::=Expresin.*.Trmino | Expresin.+.Trmino | Trmino
Trmino ::= Id | Nmero
Derivacin:
Expresin Expresin.+.Trmino
Expresin.*.Trmino.+.Trmino
Trmino.*.Trmino.+.Trmino
Id.*.Trmino.+.Trmino
Id.*.Id.+.Trmino Id.*.Id.+.Id
6
Anlisis Sintctico Ascendente
Definicin: Pivote
Secuencia ms larga de smbolos (E
T
y E
N
) en la parte ms izquierda
de la entrada que se puede encontrar en la parte derecha de una
produccin y tal que todos los smbolos a su derecha son terminales
Ejemplo:
Si entrada es: Expresin.*.Trmino.+.Id
el pivote es: Expresin.*.Trmino
Algoritmo
1. Empezar con la cadena de entrada
2. Intentar llegar hasta el axioma, encontrando el pivote y reducindolo
con la produccin correspondiente
Ejemplo
Id.*.Id.+.Id Trmino.*.Id.+.Id Expresin.*.Id.+.Id
Expresin.*.Trmino.+.Id Expresin.+.Id
Expresin.+.Trmino Expresin
4
7
Analizadores Sintcticos,
Problemas
Descendentes
Mas de una opcin: A::= o | |
Retroceso
Analizar los siguientes elementos de la entrada
Recursividad izquierda
Eliminacin de la recursividad
Ambigedad
Factorizacin por la izquierda
Ascendentes
Ms de una opcin: A::= o y o es el pivote
Otros
Problemas semnticos
8
Anlisis Sintctico Predictivo
No necesita realizar retroceso para analizar bien las
sentencias del lenguaje
Slo con ver el siguiente carcter de la entrada puede
decidir cul va a ser la siguiente produccin a emplear
Condiciones
Disear bien la gramtica
Eliminar la recursividad izquierda
Factorizar por la izquierda
No est asegurado el tener una gramtica predictiva
Las gramticas son difciles de leer
Para las partes de las gramticas que no son
predictivas se pueden utilizar otros analizadores
5
9
Anlisis Sintctico Predictivo
rbol sintctico
Ejemplo: Id.*.Id.+.Id
Expresin
Expresin Trmino
Id Trmino
Id
+
* Expresin
Trmino
Id
10
Anlisis Sintctico Predictivo:
Descendente Recursivo
Se ejecuta un conjunto de procedimientos recursivos para procesar
la entrada
A cada NO Terminal de una gramtica se le asocia un
procedimiento
Decide la produccin que utilizar analizando el smbolo de preanlisis,
si est en PRIMERO(o) entonces se usa la produccin con lado derecho o
si no est en ningn PRIMERO entonces se usa una produccin
Usa una produccin imitando al lado derecho
no terminal da como resultado una llamada a otro procedimiento
terminal (que coincide con el smbolo de preanlisis) produce otra lectura de
otro token. Si el token no coincide entonces Error
La secuencia de procedimientos llamados para procesar la entrada
define implcitamente un rbol de anlisis sintctico
6
11
Anlisis Sintctico Predictivo:
Descendente Recursivo
Ejemplo:
S if B then S | write B | i := B
B i = i | i <> i | true | false
Procedure S;
begin
if car= i then begin scan;
if car = asig then scan else error;
B
end
elseif car= if then begin scan;
B;
if car= then scan else error;
S;
end
elseif car=write then begin scan;
B
end
else error
end;
Procedure B;
begin
if car= i then begin scan;
if car in [igual, noigual] then scan else error;
if car = i then scan else error;
end
elseif car = in [true, false] then
scan
else
error
end;
12
Anlisis Sintctico Predictivo,
DEFINICIONES: PRIMERO
Si o es una cadena de smbolos gramaticales, PRIMERO(o) es el
conjunto de terminales que inician las cadenas derivadas de o.
PRIMERO(o)={x | (o
*
x.|), (x e E
T
{}), (o eE
*
)}
Conjunto PRIMERO(X) para todos los smbolos gramaticales X
1. Repetir hasta que no se puedan aadir ms terminales o a ningn
conjunto PRIMERO
2. Si X e E
T
PRIMERO(X) es { X }
3. Si X aadir a PRIMERO(X)
4. Si X e E
N
y X Y
1
Y
2
...Y
K
Y a e PRIMERO(X) si a e PRIMERO(Y
i
) y e
PRIMERO(Y
1
), PRIMERO(Y
2
),..., PRIMERO(Y
i-1
)
Si Y
1
deriva a se aade PRIMERO(Y
2
)
Si Y
1
no deriva a no se aade ms a PRIMERO(X)
7
13
Anlisis Sintctico Predictivo,
DEFINICIONES: PRIMERO
PRIMERO(o), Ejemplo:
E ::= T.E
E ::= +.T.E |
T ::= F.T
T ::= *.F.T |
F ::= (.E.) | Id
PRIMERO(E) = { (, Id } PRIMERO(T.*.Id) = { (, Id }
PRIMERO(T) = { (, Id } PRIMERO(Id.+.Id) = { Id }
PRIMERO(F) = { (, Id } PRIMERO(Id) = { Id }
PRIMERO(E) = { +, } PRIMERO(T) = { *, }
14
Anlisis Sintctico Predictivo,
DEFINICIONES: SIGUIENTE
Conjunto SIGUIENTE(A)
SIGUIENTE(A)={x|(S
*
oA|), (AeE
N
), (oeE
*
), (|eE
+
),
(xePRIMERO(|)-{})}
Conjunto de terminales que pueden aparecer inmediatamente
a la derecha de A en alguna forma sentencial, si A es el ltimo
smbolo entonces se incluye el separador $
Algoritmo
1. SIGUIENTE(S)={$}
2. La regla AoB|
SIGUIENTE(B) = (PRIMERO(|)-{}) SIGUIENTE(B)
3. La regla AoB| | |=, |
*
( ePRIMERO(|))
SIGUIENTE(B) = SIGUIENTE(A) SIGUIENTE(B)
4. Repetir hasta que no cambie ningn conjunto SIGUIENTE
8
15
Anlisis Sintctico Predictivo,
DEFINICIONES: SIGUIENTE
SIGUIENTE(A), Ejemplo:
E ::= T.E
E ::= +.T.E |
T ::= F.T
T ::= *.F.T |
F ::= (.E.) | Id
E
N
SIGUIENTE
E $, )
E $, )
F $, *, ), +
T $, +, )
T $, +, )
16
Anlisis Sintctico Predictivo:
Condiciones
Pregunta:
Que debe cumplir una gramtica para que
pueda ser reconocida sin retroceso, con solo
mirar el siguiente elemento de la entrada, de
forma descendente?
Respuesta:
Si A::= o | |
PRIMERO(o) PRIMERO(|) = C. para ningn terminal a
tanto o y | derivan a la vez cadenas que comiencen con a
No puede ocurrir que o
*
y |
*

Si |
*
, entonces o no deriva ninguna cadena que comience
con un terminal en SIGUIENTE(A)
Condicin LL(1)
9
17
Anlisis Sintctico Predictivo:
Condiciones
Condicin LL(1)
No puede haber conflictos PRIMERO/PRIMERO
NeE
N
, el conjunto PRIMERO de todas sus alternativas debe ser
disjunto
No puede haber mltiples alternativas nulas
NeE
N
, solo pueden tener una produccin N
No puede haber conflictos PRIMERO/SIGUIENTE
NeE
N
, con una alternativa nula, SIGUIENTE(N) debe ser disjunto
de los conjuntos PRIMERO de todas sus alternativas
No puede haber entradas con definiciones mltiples en la tabla
de anlisis
18
Anlisis Sintctico Predictivo:
Tabla de Anlisis Sintctico
Funcionamiento
Sea Ao con aeE
T
| aePRIMERO(o). El analizador sintctico
expandir A por o cuando el smbolo actual de la entrada sea a
Algoritmo
1) ForAll (A::= o) e P do
a) ForAll a e PRIMERO(o) do TABLA[A,a]= o
b) Si e PRIMERO(o) Entonces ForAll b e SIGUIENTE(A) do TABLA[A,b]= o
c) Si e PRIMERO(o) . $ e SIGUIENTE(A) Entonces do TABLA[A,$]= o
2) ForAll AeE
N
y ceE
T
do
a) If TABLA[A,c]= C Then TABLA[A,c]= error
10
19
Anlisis Sintctico Predictivo:
Tabla de Anlisis Sintctico
Ejemplo
E ::= T.E
E ::= +.T.E |
T ::= F.T
T ::= *.F.T |
F ::= (.E.) | Id
Id + * ( ) $
E T.E T.E
E +.T.E
T F.T F.T
T *.F.T
F Id (.E.)
20
Anlisis Sintctico Predictivo
No Recursivo; LL(1)
Modelo de analizador sintctico predictivo no
recursivo
Tabla de Anlisis
Sintctico M
a + b $
ENTRADA
X
Y
Z
$
Programa de
Anlisis Sintctico
Predictivo
SALIDA
PILA
11
21
Anlisis Sintctico Predictivo
No Recursivo; LL(1)
Los smbolos de la entrada actual a y cima de
la pila X determinan la accin del analizador
Hay tres posibilidades:
X=a=$, el analizador se detiene y anuncia el xito del
anlisis
X=a=$, el analizador saca X de la pila y mueve el
apuntador de la entrada al siguiente smbolo de
entrada
XeE
N
, el programa consulta la entrada M[X,a]
Si M[X,a]=UVW, se sustituye la X de la pila por WVU (U queda
como cima de la pila)
Si M[X,a]= error, se llama a la rutina de recuperacin de error
22
Anlisis Sintctico LL(1)
Algoritmo:
pila =$;
meter$ al final de la entrada;
a:= GetToken;
Push S;
Repeat
If X eE
T
or X=$ then
If X=a then
Pop;
a:= GetToken;
Else
error;
Else
If M[X,a]=XY
1
Y
2
..Y
k
then
Pop;
Push Y
k
,Y
k-1
,...,Y
1
Emitir la produccin X
else
error();
until X=$
If X=$ and a=$ then
Aceptar;
else
error();
12
23
Anlisis Sintctico LL(1)
Ejemplo:
Pila Entrada Produccin
$ E Id * Id + Id $ E::= T E
$ E T Id * Id + Id $ T::= F T
$ E T F Id * Id + Id $ F::= Id
$ E T Id Id * Id + Id $
$ E T * Id + Id $ T::= * F T
$ E T F * * Id + Id $
$ E T F Id + Id $ F::= Id
$ E T Id Id + Id $
$ E T + Id $ T::=
$ E + Id $ E::= + T E
$ E T + + Id $
$ E T Id $ T::= F T
$ E T F Id $ F::= Id
$ E T Id Id $
$ E T $ T::=
$ E $ E::=
$ $
24
Anlisis Sintctico Ascendente
Anlisis por desplazamiento y reduccin
Por precedencia de operadores
LR
Construir un rbol de anlisis sintctico para una
cadena de entrada que comienza por las hojas y avanza
hacia la raz.
Reducir una cadena de entrada w al smbolo inicial de
la gramtica
En cada paso de reduccin se sustituye una subcadena
que concuerde con el lado derecho de una produccin
por el smbolo del lado izquierdo, se traza una
derivacin por la derecha en sentido inverso
13
25
Anlisis Sintctico Ascendente:
Gramtica de Operadores
Para una pequea clase de gramticas se puede
construir con facilidad, a mano, eficientes analizadores
sintcticos por desplazamiento y reduccin
Gramtica de operadores
No tiene reglas de produccin del tipo A::=
No tiene dos no terminales adyacentes A::=oBC| | A,B,C eE
N
Ejemplo
No es G. de operadores Si es G. de operadores
EEAE | (E) | -E | id EE+E | E-E | E*E | E/E | (E) | -E | id
A+ | - | * | /
26
Anlisis Sintctico Ascendente:
Precedencia de Operador
Inconvenientes
Es difcil de manejar componentes lxicos con dos precedencias
distintas, como el signo menos (unario y binario)
No se puede tener la seguridad de que el analizador acepta
exactamente el lenguaje deseado
Slo una pequea clase de gramticas puede analizarse
Ventajas
Sencillez
Se pueden establecer relaciones de precedencia (* precede a +)
Se aplican con otros analizadores para la parte que no
son de operador
14
27
Anlisis Sintctico Ascendente:
Precedencia de Operador
El anlisis recorre la entrada de izquierda a derecha y
se encuentra en dos posibles estados:
Esperando un operador
Esperando un operando
El anlisis mantiene dos pilas
Pila de Operadores
Pila de Operandos
Cuando un operador en la cima de su pila es de ms
prioridad que el siguiente de la pila, entonces el pivote
consiste en ese operador junto a los dos operandos
situados ms arriba de la pila de operandos
28
Anlisis Sintctico Ascendente:
Precedencia de Operador
Entrada:
Id+Id*Id
Gramtica
E:=E+E | E*E | (E) | Id
La gramtica es ambigua pero este tipo de anlisis
proporciona una nica derivacin
Entrada Pila de Operadores Pila de Operandos
Id
a
+Id
b
*Id
c
C C
+Id
b
*Id
c
C Id
a
Id
b
*Id
c
+ Id
a
*Id
c
+ Id
b
Id
a
Id
c
*+ Id
b
Id
a
C *+ Id
c
Id
b
Id
a
15
29
Precedencia de Operador:
Relaciones de Precedencia
Se definen tres relaciones de precedencia
disjuntas
a<b si a tiene menos precedencia que b
a=b si a tiene igual precedencia que b
a>b si a tiene ms precedencia que b
Algoritmo
Sustituir todos los smbolos no terminales por un nico smbolo
Insertar $ al principio y al final de la cadena de entrada
Insertar las relaciones de precedencia en la cadena de entrada
Mientras entrada=$S$ hacer
Recorrer entrada desde la izquierda hasta encontrar >
Buscar a la izquierda, a partir de ese punto, el primer <
Reducir el pivote que se encuentra en el medio
Reinsertar las relaciones de precedencia, ignorando los no terminales
30
Precedencia de Operador:
Ejemplo
Entrada: $(Id+Id)$
Gramtica: E::= E+E | E*E | (E) | Id
Tabla de precedencia:
( Id * + ) $
) > > > >
Id > > > >
* < < > > > >
+ < < < > > >
( < < < < =
$ < < < < =
Anlisis Entrada Derivacin
$ < ( < Id > + < Id > ) >$ $(E+Id)$
$ < ( < E + < Id > ) > $ $(E+E)$
$ < ( < E + E > ) > $ $(E)$
$ < ( E = ) > $ $E$
16
31
Obtencin de las relaciones de
precedencia
x y sii existe:
A::=...xBy... Be{N }
x < y sii existe:
A::=...xB... Ce{N }
B::=+Cy...
x > y sii existe:
A::=...By... Ce{N }
B::=+...xC
32
Precedencia de Operador:
Construir la Tabla de
Precedencia
Si el operador u
1
tiene mayor precedencia que u
2
entonces hacer u
1
>u
2
y u
2
< u
1
Si los operadores u
1
y u
2
son de igual precedencia (por
ejemplo el mismo operador), entonces hacer:
u
1
>u y u
2
> u
1
si son asociativos por la izquierda
u
1
<u y u
2
< u
1
si son asociativos por la derecha
Hacer u<Id, Id>u, u<(, (<u, )> u, u>), u>$, $< u
(=) $< ( $<Id
(< ( Id>$ )>$
(<Id Id>) )>)
17
33
Precedencia de Operador:
Construir la Tabla de
Precedencia
Definiciones:
Cabecera(A) = { x | (A
*
ox|)
. (x e E
T
) . (A e E
N
) . (o e E
N
*
) . (| e E
*
)}
ltimo(A) = { x | (A
*
ox|)
. (x e E
T
) . (A e E
N
) . (o e E
*
) . (| e E
N
*
)}
Ejemplo:
E::=E+E | T Cabecera(E)={+, *, (, Id}
T::=T*F | F ltimo(E)={+, *, ), Id}
F::=(E) | Id
Propiedad:
(A::= oBaC|) e P, a e E
T
, A, B, C e E
N
, o, | e E
*
, a siempre
aparece en un nivel superior a los smbolos terminales de
Cabecera(C) y ltimo(B) en el rbol de derivacin
34
Precedencia de Operador:
Construir la Tabla de
Precedencia
Reglas:
(A::= oBaC|) e P, a e E
T
, A, B, C e E
N
, o, | e E
*
1. c e Cabecera(C), a < c
2. b e ltimo(B), b > a
3. (A::= oa|b) e P, a, b e E
T
, a=b , | e E
*
Si existe ms de una relacin de precedencia entre dos smbolos
terminales, no es una gramtica de precedencia
Algoritmo
ForAll (A::= oBaC|) e P do
Calcular Cabecera(C)
Calcular ltimo(B)
Calcular las precedencias usando las reglas 1, 2 y 3
ForAll a e Cabecera(S) do $ < a
ForAll a e ltimo(S) do a > $
18
35
Precedencia de Operador:
Construir la Tabla de
Precedencia
Gramtica
E::=E+E | T
T::=T*F | F
F::=(E) | Id
Cabecera y ltimo
E
N
Cabecera ltimo
E +, *, (, Id +, *, ), Id
T *, (, Id *, ), Id
F (, Id ), Id
Tabla
Regla Precedencias(R
2
) Precedencias (R
1
)
E::=E+T +, *, ), Id > + + < *, (, Id
E::=T+F *, ), Id > * * < (, Id
36
Precedencia de Operador:
Operadores Unarios ()
Manejo de Operadores Unarios ()
Operador Unario que no es adems Binario
u < u
> u u si tiene mayor precedencia que u
< u u si tiene menor precedencia que u
Operador Unario que adems es Binario
Mediante la tabla de precedencia no puede analizarse correctamente
cadenas como: Id*-Id
Solucin: Utilizar el analizador lxico para devolver dos componentes
lxicos distintos, recordando el componente lxico anterior debe
distinguir uno de otro.
Ejemplo: Es el menos unario si antes el componente lxico ledo era
un operador, un parntesis izquierdo, una coma o un smbolo de
asignacin
19
37
Precedencia de Operador: Funciones de
Precedencia
La tabla de precedencia se puede simplificar, con el
objetivo de ahorrar memoria y aumentar la velocidad de
proceso, mediante dos funciones f y g
Transforman los smbolos terminales en enteros
Tienen que cumplir que a,b eE
T
si a < b, f(a) < g(b)
si a = b, f(a) = g(b)
si a > b, f(a) > g(b)
Para encontrar la relacin de precedencia entre a y b se
realiza una comparacin entre f(a) y g(b)
No todas las relaciones de precedencia tienen
funciones de precedencia
38
Precedencia de Operador:
Funciones de Precedencia
Construccin de las Funciones de Precedencia
1. Crear los smbolos f
a
y g
a
aeE
T
{$}
2. Se dividen los f
a
y g
a
en tantos grupos como sea
posible:
Si a=b entonces f
a
y g
b
estn en el mismo grupo
3. Crear un grafo dirigido cuyos nodos son los grupos
encontrados en el paso 2, los arcos se etiquetan:
si a<b, g
b
f
a
si a>b, f
a
g
b
4. Ciclos en el grafo:
Respuesta SI, entonces no existen funciones de
precedencia
Respuesta NO, entonces f(a) y g(a) son los caminos ms
largos que comienzan en f
a
y g
a
20
39
Precedencia de Operador:
Funciones de Precedencia
Ejemplo
Id + * $
Id > > >
+ < > < >
* < > > >
$ < < <
Cada smbolo est solo en un grupo
g
Id
f
Id
g
*
f
*
g
+
f
+
g
$
f
$
40
Precedencia de Operador:
Funciones de Precedencia
No hay ciclos, entonces existen las funciones de
precedencia.
Como las funciones de $ no tienen arcos entonces
f($)=g($)=0
El camino ms largo desde g
+
tiene longitud 1, entonces
g(+)=1
El camino ms largo desde g
Id
a f
*
a g
*
a f
+
a f
$
por tanto
g(id)=5
Id + * $
f 4 2 4 0
g 5 1 3 0
21
41
Anlisis Ascendente LR
LR(k): Left-to-right, rightmost derivation, o|o (oeE
*
, oeE
*
T
) k
smbolos de entrada son necesarios para tomar las decisiones de
anlisis sintctico
Ventajas
Es el mtodo de anlisis por desplazamiento y reduccin sin retroceso ms
general, a pesar de esto es igual de eficiente
La clase de gramticas que pueden analizarse es un supraconjunto de la
clase de gramticas que pueden analizarse con analizadores sintcticos
predictivos
Detectan los errores sintcticos tan pronto como es posible en un examen de
izquierda a derecha de la entrada
Se pueden reconocer prcticamente todas las construcciones de los
lenguajes de programacin descritos por una gramtica G2
Inconvenientes
La construccin a mano requiere mucho trabajo
42
Tipos de Anlizadores LR
LR simple (SLR)
Fcil de implementar
Menos poderoso, hay algunas gramticas que los
otros mtodos pueden analizar y este no puede
LR cannico
Es muy costoso de implementar
El ms potente
LALR (LR con examen por anticipado)
Intermedio entre los dos mtodos anteriores
22
43
Modelo de un Analizador LR
ENTRADA
s
m
Programa de
Anlisis Sintctico
LR
SALIDA
Accin Ir_a
a
1
a
1
a
n
... $ ...
Tabla de Anlisis
Sintctico LR
Pila
X
m
s
m-1
X
m-1
...
s
0
44
Modelo de Analizador LR
El programa es el mismo para todos los analizadores LR
X
i
es un smbolo gramatical y cada s
i
es un smbolo llamado estado
Se utiliza el smbolo de estado y el smbolo de la entrada para
indexar la tabla y determinar la accin siguiente
La tabla de anlisis sintcticos tiene dos partes:
Accin[s
m
, a
i
]=
Error: error de sintaxis
Aceptar: acepta la entrada, el anlisis sintctico finaliza
Desplazar: introduce en la pila el smbolo a
i
y el estado s
m
Reduccin: extrae smbolos de la pila, ejecuta la accin
semntica correspondiente a una produccin
Ir_a[s
m
, X
i
]= s
k
23
45
Modelo de Analizador LR
Configuracin de un analizador sintctico LR
Tupla con el contenido de la pila y la entrada que
resta por procesar (s
0
X
1
s
1
X
2
s
2
... X
m
s
m
, a
i
a
i+1
... a
n
$)
Accin[s
m
, a
i
] = desplazar s
(s
0
X
1
s
1
X
2
s
2
... X
m
s
m
a
i
s, a
i+1
... a
n
$)
Accin[s
m
, a
i
] = reducir A |
(s
0
X
1
s
1
X
2
s
2
... X
m-r
s
m-r
A s, a
i
a
i+1
... a
n
$)
donde s=Ir_a[s
m-r
, A] y r=||| (se extraen r
smbolos no terminales y r smbolos de estados de
la pila)
46
Algoritmo de Anlisis LR
apuntar ae al primer smbolo de w$ (s est en la cima y ae apunta al smbolo a)
repetir
caso Accin[s, a]
Desplazar s
push a
push s
leer en la entrada
Reducir A |
pop 2*||| smbolos
s smbolo en la cima de la pila
s= Ir_a[s, A]
push A
push s
Aceptar
Error
fincaso
hasta Aceptar o Error
24
47
Ejemplo de Anlisis LR
Gramtica
1. E::= E+T
2. E::= T
3. T::= T*F
4. T::= F
5. F::= (E)
6. F::= Id
Tabla de anlisis sintctico
Accin Ir_a
Estado Id + * ( ) $ E T F
0 d5 d4 1 2 3
1 d6 ACP
2 r2 d7 r2 r2
3 r4 r4 r4 r4
4 d5 d4 8 2 3
5 r6 r6 r6 r6
6 d5 d4 9 3
7 d5 d4 10
8 d6 d11
9 r1 d7 r1 r1
10 r3 r3 r3 r3
11 r5 r5 r5 r5
48
Ejemplo de Anlisis LR
Pila Entrada Accin
0 Id*Id+Id$ d5
0 Id 5 *Id+Id$ r6
0 F 3 *Id+Id$ r4
0 T 2 *Id+Id$ d7
0 T 2 * 7 Id+Id$ d5
0 T 2 * 7 Id 5 +Id$ r6
0 T 2 * 7 F 10 +Id$ r3
0 T 2 +Id$ r2
0 E 1 +Id$ d6
0 E 1 + 6 Id$ d5
0 E 1 + 6 Id 5 $ r6
0 E 1 + 6 F 3 $ r4
0 E 1 + 6 T 9 $ r1
0 E 1 $ ACP
25
49
Construccin de una Tabla LR
Definiciones
Item (elemento)
Produccin con un marcador de posicin
S::= if C then S
En la entrada se ha visto el
token if y queda por procesar C then S
Estado
Representa un momento en la derivacin, equivale a
un estado en el autmata que realiza el anlisis
Un estado est formado por un conjunto de items
50
Algoritmo de definicin de
estados
Crear un smbolo no terminal nuevo S
Crear una nueva produccin S::=S, donde es el axioma
Crear el estado inicial, S
0
={(S::=S)}
Mientras se creen nuevos estados hacer
Cierre:
Si A::=xXoe S
i
entonces, Para cada X::=we P
S
i
=S
i
U {(X::= w)}
Creacin
Para cada zeE | I
i
=(A::=x zw) e S
i
Crear un nuevo estado S
j
={(A::=xz w)}
Para cada I
k
=(B::=o z|) e S
i
, I
k
= I
i
S
j
=S
j
U {(B::= o z|)}
26
51
Algoritmo de tabla SLR(1)
Desplazar
Si A::=xaw e S
i
, A::=xaw e S
j
, a e E
T
Entonces Accin[S
i
,a]=Desplazar S
j
Reducir
Si A::=w e S
i
, P
j
=(A::=w)
Entonces Para cada a e SIGUIENTE(A) Accin [S
i
,a]=Reducir j
Aceptar
Si S::=S e S
i
Entonces Accin[S
i
,$]=Aceptar
Ir_a
Si A::=xBw e S
i
, A::=xBw e S
j
, B e E
N
Entonces Ir_a[S
i
,B]= S
j
52
Anlisis Sintctico:
Manejo de Errores
Caractersticas
Informar con claridad y exactitud
Recuperacin rpida
No debe retrasar el procesamiento de programas sin
errores
Estrategias de recuperacin
Modo de pnico
Nivel de frase
Producciones de error
Correccin Global
27
53
Estrategias de recuperacin de
errores (I)
Modo de pnico
Mtodo ms sencillo
Lo pueden utilizar la mayora de los mtodos de anlisis
FUNCIONAMIENTO:
Desecha los smbolos de entrada hasta que encuentra componentes lxicos
de sincronizacin (delimitadores, punto y coma, end)
Adecuado para lenguajes en los que es raro que se produzcan varios
errores en la misma lnea
Nivel de frase
FUNCIONAMIENTO:
Realizar una correccin local de la entrada restante para poder continuar con
el anlisis, (sustituir coma por punto y coma, aadir coma)
Dificultad para manejar situaciones en las que el error se produjo antes
del punto de deteccin
54
Estrategias de recuperacin de
errores (II)
Producciones de error
FUNCIONAMIENTO
Si se conocen los errores que pueden suceder, entonces
puede extenderse la gramtica para incluir producciones de
error
Correccin global
FUNCIONAMIENTO
Son algoritmos que minimiza el nmero de cambios
necesarios para convertir una cadena errnea en otra
correcta
Demasiado costoso, en tiempo y espacio
Solo tiene inters terico

También podría gustarte