Análisis sintáctico LR: SLR (LR simple)
Ventajas de los analizadores sintácticos
LR
Los analizadores sintácticos son construidos por tablas, similar a los analizadores
sintácticos LL no recursivos.
El análisis sintáctico LR es atractivo por varias razones:
Pueden construirse analizadores sintácticos LR para reconocer
prácticamente todas las construcciones de lenguajes de programación para
las cuales puedan escribirse gramáticas libres de contexto.
El método de análisis sintáctico LR es el método de análisis sintáctico de
desplazamiento reducción sin rastreo hacia atrás más general que se conoce
a la fecha.
Un AS LR puede detectar un error sintáctico tan pronto como sea posible
en una exploración de izquierda a derecha en la entrada.
La clase de gramáticas que pueden analizarse mediante los métodos LR
es un superconjunto propio de la clase de gramáticas que pueden analizarse
con métodos predictivos o LL.
Desventajas
Su principal desventaja es que es demasiado trabajo construir un
analizador sintáctico LR en forma manual para una gramática común de
un lenguaje de programación.
Los elementos y el autómata LR(0)
Un elemento LR (0) de una gramática G es una producción de G con
un punto en cierta posición del cuerpo.
Por ejemplo la producción A XYZ produce los siguientes
elementos:
A.XYZ
AX.YZ
AXY.Z
AXYZ.
La producción Aε genera solo un elemento A.
Una colección de conjuntos de elementos LR(0), conocida como
la colección LR(0) canónica, proporciona la base para construir
un autómata finito determinístico, el cual se utiliza para tomar
decisiones en el análisis sintáctico.
Para construir la colección LR(0) canónica de una gramática,
definimos una gramática aumentada y dos funciones,
CERRADURA e ir__A. Si G es una gramática con el símbolo
inicial S, entonces G’ es G con un nuevo símbolo inicial S’ y la
producción S’S
Cerradura de I
ConjuntoDeElementos CERRADURA(I) {
J=I
repeat
for (cada elemento A α.Bβ en J)
for (cada producción B .γ de G)
if (B .γ no está en J)
agregar B .γ a J
until no se agreguen mas elementos a J en una ronda
return J
}
Ejemplo:
E´ E
EE+T|T
TT*F|F
F  ( E ) | id
Si I={E’.E}, entonces CERRADURA (I) Contiene el conjunto
{E’.E, E.E+T, E.T, T.T*F, T.F, F.(E), F.id}
La función ir__A
Función ir__A(I,X), donde I es un conjunto de elementos y X es un
símbolo gramatical.
ir__A (I,X) se define como la cerradura del conjunto de todos los
elementos A αX.β, de tal forma que A α.Xβ se encuentre en I.
Ejemplo:
Si I={E’E., EE.+T} entonces ir__A(I,+)={EE+.T, T.T*F, T.F,
F.(E), F.id}
I0
E’.E
E.E+T
E.T
T.T*F
T.F
F.(E)
F.id
I1
E’E.
EE.+T
E
+
I6
EE+.T
T.T*F
T.F
F.(E)
F.id
id
T
I2
ET.
ET.*F
*
id
id
(
T
I5
Fid.
id
F
(
I4
F(.E)
E.E+T
E.T
T.T*F
T.F
F.(E)
F.id
+
I8
EE.+T
F(E.)
)
)
F
I9
EE+T.
TT.*F
*
I10
TT*F.
F
E
F
I3
TF.
I7
TT*.F
F.(E)
F.id
T
)
I11
F(E).
El algoritmo de análisis sintáctico LR
Códigos para las acciones:
1. si significa desplazar y meter el estado i en la pila.
2. rj significa reducir mediante la produccion enumerada como j,
3. acc significa aceptar
4. Espacio en blanco significa error
Algoritmo: Construcción de una tabla de análisis sintáctico SLR
Entrada: Una gramática aumentada G’
Salida: Las funciones ACCION e ir_A para G’ de la tabla de análisis
sintáctico SLR.
Método:
1. Construir C={I0, I1, …, In}, la colección de conjuntos de elementos
LR(0) para G’.
2. El estado i se construye a partir de Ii. Las acciones de análisis
sintáctico i se determinan de la siguiente forma:
a) Si [Aα.aβ] está en Ii e ir__A(Ii,a)=Ij, entonces establecer
ACCION[i.a] a “desplazar j”. Aquí, a debe ser un terminal.
b) Si [A α.] esta en Ii, entonces establecer ACCION[i,a] a “reducir
A α” para toda a en SIGUIENTE(A); aquí, A tal vez no sea S’.
c) Si [S’S.] esta en Ii, entonces establecer ACCION[i,$] a “aceptar”.
Si resulta cualquier acción conflictiva debido a las reglas anteriores,
decimos que la gramática no es SLR(1). El algoritmo no produce un
analizador sintáctico en este caso.
3. Las transiciones de ir__A para el estado i se construyen para todos
lo no terminales A usando la regla: Si ir__A(Ii, A)=Ij, entonces
ir__A[i,A]=j.
4. Todas las entradas que no esten definidas por las reglas (2) y (3) se
dejan como “error”.
5. El estado inicial del analizador sintáctico es el que se construyó a
partir del conjunto de elementos que contienen [S’.S].
Entrada
ACCION
id
0
+
*
s5
(
Ir__A
)
$
s4
1
s6
2
r2
s7
r2
r2
3
r4
r4
r4
r4
4
s4
r6
T
F
1
2
3
acc
s5
5
E
r6
8
r6
6
s5
s4
7
s5
s4
2
3
9
3
r6
10
8
s6
s11
9
r1
s7
r1
r1
10
r3
r3
r3
r3
11
r5
r5
r5
r5
(1)
(2)
(3)
(4)
(5)
(6)
EE + T
ET
TT * F
TF
F( E )
Fid
Algoritmo de análisis sintáctico LR.
Entrada: Una cadena de entrada w y una tabla de análisis sintáctico LR con las funciones
ACCION e ir__A, para una gramática G.
Salida: Si w está en L(G), los pasos de reducción de un análisis sintáctico ascendentes para
w, en cualquier otro caso, una indicación de error.
Método: Al principio, el analizador sintáctico tiene s0 en su pila, en donde s0 es el estado
inicial y w$ está en el búfer de entrada.
hacer que a sea el primer símbolo de w$
while (1) {
hacer que s sea el estado en la parte superior de la pila;
if (ACCION[s,a]=desplazar t) {
meter t en la pila;
hacer que a sea el siguiente símbolo de entrada;
} else if (ACCION[s,a]=reducir Aβ ) {
sacar |β| estados de la pila y sustituir los símbolos β por A;
sea t el estado que esta en el tope de la pila;
meter ir__A[t,A] en la pila;
enviar de salida la producción Aβ;
} else if (ACCION[s,a]=aceptar) break;
else llamar a la rutina de recuperación de errores;
}
Pila
0
0 5
0
0 3
0 2
0 2
0 2
0 2
0 2
0 1
Símbolos
7
7 5
7
7 10
id
F
T
T*
T*id
T*F
T
T
E
Entrada
id*id$
*id$
*id$
*id$
id$
$
$
$
$
Accion
s5
r6
r4
s7
s5
r6
r3
r2
acc
Descargar

Análisis sintáctico LR: SLR (LR simple)