Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Teoria Analisis Sintactico
Teoria Analisis Sintactico
Tema 3.
Anlisis Sintctico.
Todo lenguaje de programacin tiene reglas que describen la estructura sintctica de programas
bien formados. En Pascal, por ejemplo, un programa se compone de bloques, un bloque de
proposiciones, una proposicin de expresiones, una expresin de componentes lxicos, y as
sucesivamente. Se puede describir la sintaxis de las construcciones de los lenguajes de
programacin por medio de gramticas de contexto libre o notacin BNF ( Backus-Naur Form).
Las gramticas ofrecen ventajas significativas a los diseadores de lenguajes y a los
desarrolladores de compiladores.
La mayor parte de este tema est dedicada a los mtodos de anlisis sintctico de uso tpico en
compiladores. Primero se introducen los conceptos bsicos, despus las tcnicas adecuadas para
la aplicacin manual. Adems como los programas pueden contener errores sintcticos, los
mtodos de anlisis sintctico se pueden ampliar para que se recuperen de los errores sintcticos
ms frecuentes.
Qu es el analizador sintctico ?
Es la fase del analizador que se encarga de chequear el texto de entrada en base a una
gramtica dada. Y en caso de que el programa de entrada sea vlido, suministra el rbol
sintctico que lo reconoce.
En teora, se supone que la salida del analizador sintctico es alguna representacin del
rbol sintctico que reconoce la secuencia de tokens suministrada por el analizador lxico.
En la prctica, el analizador sintctico tambin hace:
Acceder a la tabla de smbolos (para hacer parte del trabajo del analizador
semntico).
Chequeo de tipos ( del analizador semntico).
Generar cdigo intermedio.
Generar errores cuando se producen.
En definitiva, realiza casi todas las operaciones de la compilacin. Este mtodo de trabajo
da lugar a los mtodos de compilacin dirigidos por sintaxis.
Anlisis Sintctico
Realizados por: Mara del Mar Aguilera Sierra y Sergio Glvez Rojas
Anlisis Sintctico.
Un buen compilador debe hacerse siempre teniendo tambin en mente los errores que se
pueden producir; con ello se consigue:
Anlisis Sintctico
Realizados por: Mara del Mar Aguilera Sierra y Sergio Glvez Rojas
Anlisis Sintctico.
Ejemplo:
aux = a[i]
a[i] = a[j];
a[j] = aux;
Error
id = id [ id ] id [ id ] = id [ id ] ; id [ id ] = id ;
Token especial, seguimos
compilando a partir de l
sent_sin_acabar sentencia_acabada ;
sentencia ;
sentencia
Anlisis Sintctico
Realizados por: Mara del Mar Aguilera Sierra y Sergio Glvez Rojas
Anlisis Sintctico.
Gramtica : G (N, T, P, S)
N = No terminales.
T = Terminales.
P = Reglas de Produccin.
S = Axioma Inicial.
Ejemplo : Se considera la gramtica que reconoce las operaciones aritmticas.
E E+T
|T
T T*F
|F
F ID
| NUM
|(E)
En el que: N = {E, T, F} estn a la izquierda de la regla.
T = {ID, NUM, ( ,) ,+ ,*}
P = Son las siete reglas de produccin.
S = Axioma inicial. Podra ser cualquiera, en este caso es E.
Derivaciones : La idea central es que se considera una produccin como una regla de
reescritura, donde el no terminal de la izquierda es sustituido por la cadena del lado
derecho de la produccin.
De un modo ms formal:
.
con ., (N F T)* , si
D {V A G
E { V W G
con A N; 1, 2, / (N
F T)*; y
} regla de produccin A 2
Anlisis Sintctico
Realizados por: Mara del Mar Aguilera Sierra y Sergio Glvez Rojas
Anlisis Sintctico.
E+E
| E- E
| E* E
| E/ E
| E^ E
| id
Constryase una derivacin por la izquierda y por la derecha para la siguiente frase:
a*c+b
( id1 * id2 + id3)
Derivacin ms a la izquierda:
E < E + E < E * E + E< id1 * E + E < id1 * id2 + E < id1 * id2 + id3
Derivacin ms a la derecha::
E < E + E < E + id3 < E * E + id3
E+T|T
T*F|F
(E)|a|b
Realizados por: Mara del Mar Aguilera Sierra y Sergio Glvez Rojas
Anlisis Sintctico.
E
E
T
T
Anlisis Sintctico
aux + cont +
i
<ID><+><ID><+><ID>
Realizados por: Mara del Mar Aguilera Sierra y Sergio Glvez Rojas
Tipos de Anlisis
De la forma de construir el rbol sintctico se desprenden dos tipos o clases de
analizadores sintcticos. Pueden ser descendentes o ascendente
Descendentes : Parten del axioma inicial, y van efectuando derivaciones a izquierda hasta
obtener la secuencia de derivaciones que reconoce a la sentencia.
Pueden ser:
Con retroceso.
Con recursin.
LL(1)
Anlisis Sintctico
Realizados por: Mara del Mar Aguilera Sierra y Sergio Glvez Rojas
Anlisis Descendentes
Objetivo : El mtodo parte del axioma inicial y aplica todas las posibles reglas al
no terminal ms a la izquierda.
E
E
T
T
F
F
F
T+E
T
F*T
F
a
b
(E)
Anlisis Sintctico
Realizados por: Mara del Mar Aguilera Sierra y Sergio Glvez Rojas
Anlisis Descendentes
Mediante este rbol se pueden derivar todas las posibles sentencias reconocibles por esta
gramtica y el objetivo de este algoritmo es hacer una bsqueda en este rbol de la rama
que culmine en la sentencia a reconocer. El mecanismo funciona mediante una bsqueda
primero en profundidad.
Mira si todos los tokens a la izquierda de un No Terminal coincide con la cabeza de la
secuencia a reconocer.
En todo el rbol de derivaciones, se pretende profundizar por cada rama hasta llegar a
encontrar una forma sentencial que no puede coincidir con lo que se busca, en cuyo caso
se desecha, o que coincide con lo buscado, momento en que se acepta la sentencia. Si por
ninguna rama se puede reconocer, se rechaza la sentencia.
Algoritmo :
En el programa principal
Ensayar (S, cadena a reconocer)
if not Sentencia reconocida !
Sentencia no reconocida !!
endif;
Anlisis Sintctico
Realizados por: Mara del Mar Aguilera Sierra y Sergio Glvez Rojas
10
Anlisis Descendentes
Reconocer con el algoritmo (a+b)*a+b
forma_sentencial
T+E
1-3
F * T +E
1-3-5
a*T+E
1-3
F * T +E
1-3-6
b*T+E
1-3
F * T +E
1-3-7
(E) * T +E
1-3-7-1
(T + E) * T + E
1-3-7-1-3
(F * T + E) * T + E
1-3-7-1-3-5
(a * T + E) * T + E
1-3-7-1-3
(F * T + E) * T + E
1-3-7-1-3-6
(b * T + E) * T + E
1-3-7-1-3
(F * T + E) * T + E
1-3-7-1-3-7
((E) * T + E) * T + E
1-3-7-1-3
(F * T + E) * T + E
1-3-7-1
(T + E) * T + E
1-3-7-1-4
(F + E) * T + E
1-3-7-1-4-5
(a + E) * T + E
1-3-7-1-4-5-1
(a + T + E) * T + E
1-3-7-1-4-5-1-3
(a + F * T + E) * T + E
1-3-7-1-4-5-1-3-5
(a + a * T + E) * T + E
1-3-7-1-4-5-1-3
(a + F * T + E) * T + E
1-3-7-1-4-5-1-3-6
(a + b * T + E) * T + E
1-3-7-1-4-5-1-3
(a + F * T + E) * T + E
1-3-7-1-4-5-1-3-7
(a + (E) * T + E) * T + E
1-3-7-1-4-5-1-3
(a + F * T + E) * T + E
1-3-7-1-4-5-1
(a + T + E) * T + E
1-3-7-1-4-5-1-4
(a + F + E) * T + E
....
(a + E) * T + E
1-3-7-1-4-5-2
(a + T) * T + E
...
Anlisis Sintctico
Realizados por: Mara del Mar Aguilera Sierra y Sergio Glvez Rojas
11
Anlisis Descendentes
Para demostrar que permite representar las mismas gramticas que la BNF, se hace por
induccin sobre las operaciones bsicas de BNF:
Operacin
BNF
Yuxtaposicin
AB
Opcin
A|B
Diagrama de Comway
J|B
Repeticin
1 o ms veces
{B}
0 o ms veces
[B]
De esta forma todos los posibles caminos desde el inicio del grafo hasta el final,
representan formas sentenciales vlidas.
En todo diagrama de Conway hay un origen y un destino.
Anlisis Sintctico
Realizados por: Mara del Mar Aguilera Sierra y Sergio Glvez Rojas
12
Anlisis Descendentes
Vamos a intentar establecer una comparacin entre el flujo de un programa y el camino
que puedo establecer en los diagramas de Conway
Ejemplo: Yuxtaposicin
Flujo
AxiomaInicial( )
A( );
B( );
Fin AxiomaInicial
Prog ( );
sent ( );
if el siguiente token es ; entonces
consumir el token
else
!Error sintctico
fi
FinProg
prog: sent ; FIN
Prog ( );
sent ( );
if el siguiente token es ; entonces
Consumir el token
else
!Error sintctico
fi
if el siguiente token es FIN entonces
Consumir el token
else
!Error sintctico
fi
FinProg
Anlisis Sintctico
Realizados por: Mara del Mar Aguilera Sierra y Sergio Glvez Rojas
13
Anlisis Descendentes
Secuencia
main ( ) {
get_token ( );
do {
expresin ( );
while (token != PUNTOYCOMA) {
!Error en expresin
get_token ( );
};
get_token( );
}while (token != EOF);
};
En este caso se considera al ; como un token de seguridad, lo que permite hacer una
recuperacin de errores mediante el mtodo panic mode.
Se supone que el sintctico pide al lexicogrfico tokens a travs de get_token ( );, y que
el lexicogrfico deja el token actual en la variable global token.
Antes de entrar a una funcin, en token debemos tener el token de lookahead, que esa
funcin necesita consultar.
expresin ( ){
expr_simple ( );
if ((token == IGUAL)|| (token == ME)|| (token == MEI)||
(token == DIST)|| (token == MAI)|| (token == MA))
get_token ( ) ;
expr_simple ( ) ;
}
}
Anlisis Sintctico
Realizados por: Mara del Mar Aguilera Sierra y Sergio Glvez Rojas
14
Anlisis Descendentes
expr_simple ( ) {
if ((token == IGUAL) || (token == MENOS)) {
get_token( );
}
trmino ( );
while ((token == MAS) || (token == MENOS) || (token == OR)) {
get_token( );
trmino ( );
}
}
Anlisis Sintctico
Realizados por: Mara del Mar Aguilera Sierra y Sergio Glvez Rojas
15
Anlisis Descendentes
trmino ( ){
factor ( );
while ((token == POR) || (token == DIV) || (token == DIV_ENT) ||
(token == MOD) || (token == AND) {
get_token( );
factor( );
}
factor ( ){
switch (token) {
case ID : get_token ( ); break;
case NUM : get_token ( ); break;
case NOT : get_token ( ); factor ( ); break;
case AB_PARID : get_token ( ); expresin ( );
if (token != CE_PAR) {Error: Parntesis de cierre}
else get_token ( );
break;
default : Error : Expresin no vlida.
}
}
Anlisis Sintctico
Realizados por: Mara del Mar Aguilera Sierra y Sergio Glvez Rojas
16
Anlisis Descendentes
5.- Ir al paso 1.
Una vez aplicada una regla, no ser desaplicada por ningn tipo de retroceso.
El algoritmo comienza con $ y con el axioma inicial metidos en la pila.
Anlisis Sintctico
Realizados por: Mara del Mar Aguilera Sierra y Sergio Glvez Rojas
17
Anlisis Descendentes
Este tipo de anlisis tiene el inconveniente de que muy pocas gramticas son LL(1),
aunque muchas pueden traducirse a LL(1), tras un adecuado estudio. Por ejemplo:
E+T|T
T*F|F
( E ) | id
E
T
F
T E
+ T E | J
F T
* F T | J
( E ) | id
E
E
T
T
F
id
N
E
TE
F T
T
T
T
F
+TE
TE
E
T
id
* F T
F
F T
(E)
Reconocer a* (b + c) id * ( id + id) $
Anlisis Sintctico
Realizados por: Mara del Mar Aguilera Sierra y Sergio Glvez Rojas
18
Anlisis Descendentes
Inicialmente
E
$
T
E
$
id * ( id + id ) $
F
T
E
$
id
T
E
$
T
E
$
T
E
)
T
E
$
Anlisis Sintctico
M[T, id] = T
F T
M[F, id] = F
id
id * ( id + id ) $
M[T, *] = T
* F T
* = * Avanzar apuntador
id * ( id + id ) $
(
E
)
T
E
$
E
)
T
E
$
T E
id = id Avanzar apuntador
*
F
T
E
$
F
T
E
$
M[E, id] = E
M[F, (] = F
(E)
( = ( Avanzar apuntador
id * ( id + id ) $
M[E,id] = E
T E
M[T,id] = T
F T
Realizados por: Mara del Mar Aguilera Sierra y Sergio Glvez Rojas
19
Anlisis Descendentes
F
T
E
)
T
E
$
M[F, id] = F
id
T
E
)
T
E
$
T
E
)
T
E
$
id = id Avanzar apuntador
id * ( id + id ) $
E
)
T
E
$
+
T
E
)
T
E
$
T
E
)
T
E
$
Anlisis Sintctico
id
M[T,+] = T
M[E,+] = E
+ T E
+ = + Avanzar apuntador
id * ( id + id ) $
M[T,id] = T
F T
Realizados por: Mara del Mar Aguilera Sierra y Sergio Glvez Rojas
20
Anlisis Descendentes
F
T
E
)
T
E
$
M[F, id] = F
id
T
E
)
T
E
$
T
E
)
T
E
$
E
)
T
E
$
id
id = id Avanzar apuntador
id * ( id + id ) $
M[T,)] = T
M[E,)] = E
Las reglas que hemos ido aplicando en cada caso, nos van dando el parse izquierdo que
reconoce la sentencia.
Anlisis Sintctico
Realizados por: Mara del Mar Aguilera Sierra y Sergio Glvez Rojas
21
Anlisis Ascendentes
Aqu se construye el rbol sintctico de abajo hacia arriba, lo cual disminuye el nmero
de reglas mal aplicadas con respecto al caso descendente (si hablamos del caso con
retroceso).
Tanto si hay retroceso como si no, en un momento dado, la cadena de entrada estar
dividida en dos partes . y :
.: coincidir siempre con el resto de la cadena de entrada, trozo al que se habrn aplicado
algunas reglas de produccin, . (NFT)* en sentido inverso.
id + id + id
+ id + id
id
.
Ahora, . es F
. F
+ id + id
id
. T
+ id + id
id
Forma sentencial
.
Secuencia de tokens
...
T
|
F
T
|
|
id + id
+ id
Anlisis Sintctico
Realizados por: Mara del Mar Aguilera Sierra y Sergio Glvez Rojas
22
Anlisis Ascendentes
En un momento dado, el analizador sintctico se encuentra en con un par ., concreto,
al que se llama configuracin.
El analizador sintctico para poder trabajar puede realizar una de las cuatro operaciones
siguientes:
- Aceptar : Cadena reconocida.
- Rechazar : La entrada no es vlida.
- Reducir : Aplicar una regla de produccin a los elementos de .
Anlisis Sintctico
Realizados por: Mara del Mar Aguilera Sierra y Sergio Glvez Rojas
23
Anlisis Ascendentes
Mediante reducciones y desplazamientos, tenemos que llegar a aceptar o rechazar la cadena de
entrada. Antes de hacer los desplazamientos tenemos que hacerles todas las reducciones posibles
a .. Cuando . es el axioma inicial y es la tira nula, se acepta la cadena de entrada. Cuando no
es la tira nula o . no es el axioma inicial y no se puede aplicar ninguna regla, entonces se rechaza
la cadena de entrada.
Cuando se da cuenta que llega a una situacin en la que no puede continuar, entonces vuelve atrs
deshaciendo todos los cambios.
En el anlisis con retroceso no se permiten las reglas J, puesto que estas se podrn aplicar de
forma indefinida.
El algoritmo es el siguiente:
Ensayar (., )
for pi P hacer
if consecuente (pi) == cola(.)
. = Reducir la cola de . por pi
if (. == Axioma inicial) AND ( == J)
ACEPTAR
else
Ensayar (., )
Endif
endif
endfor
if ( gJ)
., = Desplazar de a .
Ensayar (., )
endif
endEnsayar
En el programa principal pondremos:
Ensayar(J, cadena a reconocer);
if NOT se ha aceptado then
RECHAZAR
endif;
Anlisis Sintctico
Realizados por: Mara del Mar Aguilera Sierra y Sergio Glvez Rojas
24
Anlisis Ascendentes
Ejemplo: (Vamos a ver por que no se permiten las reglas J). Supongamos la siguiente
gramtica.
E
E
T
T
F
F
F
F
T+E
T
F*T
F
(E)
id
num
J
Anlisis Sintctico
Realizados por: Mara del Mar Aguilera Sierra y Sergio Glvez Rojas
25
Anlisis Ascendentes
Ejemplo: Reconocer a*a
E
E
T
T
F
F
F
E+T
T
T*F
F
(E)
id
num
Accin
id * id
Desplazar
id
* id
* id
6-4
* id
id
T F
E T
6-4-2
* id
Desplazar
6-4-2
E*
id
Desplazar
6-4-2
E * id
6-4-2-6
E*F
6-4-2-6-4
E*T
id
T F
E T
6-4-2-6-4-2
E*E
Retroceso
6-4
* id
Desplazar
6-4
T*
id
Desplazar
6-4
T * id
6-4-6
T*F
6-4-6-3
id
T T * F
E T
6-4-6-3-2
Aceptar
Anlisis Sintctico
Realizados por: Mara del Mar Aguilera Sierra y Sergio Glvez Rojas
26
Anlisis Ascendentes
Analizadores LR
Vamos a analizar una tcnica eficiente de anlisis sintctico ascendente que se puede
utilizar para analizar una amplia clase de gramticas de contexto libre. La tcnica se denomina
anlisis sintctico LR(k); la L es por el examen de la entrada de izquierda a derecha (en ingls,
left-to-right), la R por construir una derivacin por la derecha (en ingls, rightmost derivation)
en orden inverso, y la k por el nmero de smbolos de entrada de examen por anticipado utilizados
para tomar las decisiones del anlisis sintctico. Cuando se omite, se asume que k, es 1. El anlisis
LR es atractivo por varias razones.
Pueden reconocer la inmensa mayora de los lenguajes de programacin que puedan ser
generados mediante gramticas de contexto-libre.
Realizados por: Mara del Mar Aguilera Sierra y Sergio Glvez Rojas
27
Anlisis Ascendentes
Como puede apreciarse en la figura, el analizador consta de una tira de entrada donde se
encuentra la cadena a reconocer finalizada con el smbolo $ que representa el delimitador. Esta
tira lee de izquierda a derecha un smbolo cada vez en el proceso de reconocimiento.
El contenido de la pila tiene la forma
s0 X1 s1 X2 s2 ... Xm sm
donde el smbolo sm se encuentra en la cabeza tal y como se muestra en la figura. Cada uno de
los Xi son smbolos de la gramtica y a los si vamos a denominarlos estados del analizador.
Los estados se utilizan para representar toda la informacin contenida en la pila y situada
antes del propio estado. Es mediante el estado en cabeza de la pila por el que se decide qu
reduccin ha de efectuarse o bien qu desplazamiento.
Tradicionalmente, una tabla de anlisis para un reconocedor LR consta de dos partes
claramente diferenciadas entre s que representan dos funciones, la funcin GOTO y la funcin
ACCION. Seguidamente estudiaremos los cometidos de ambas acciones.
El funcionamiento del analizador LR es el siguiente
1.- Se determina el estado sm en cabeza de la pila y el smbolo actual ai en el instante de
la cadena de entrada.
2.- Se consulta en la tabla de anlisis la funcin accin con los parmetros anteriores y que
puede dar como resultado.
D esp lazar S
Accin (sm,ai) =
R edu cir A o E
A ceptar
R ech azar
Realizados por: Mara del Mar Aguilera Sierra y Sergio Glvez Rojas
28
Anlisis Ascendentes
Anlogamente puede definirse una configuracin de un analizador LR como un par de
la forma
(s0 X1 s1 X2 s2 ... Xm sm , ai ai+1 ... an $)
es decir, el primer componente es el contenido actual de la pila, y el segundo la subtira de entrada
que resta por reconocer, ai es el smbolo de entrada actual de anlisis.
El movimiento del analizador se realiza teniendo en cuenta:
1. El smbolo ledo ai.
2. El smbolo en cabeza de la pila sm.
Actuando con la funcin accin y dependiendo de las cuatro posibles alternativas pueden
obtenerse las configuraciones que seguidamente se detallan.
1. Si accin (sm, ai) = desplazar s.
entonces se introducen en la pila el smbolo actual analizado de la cadena de entrada y en
la cabeza de la pila el nuevo estado obtenido mediante la funcin GOTO(sm, ai) = S.
La configuracin as obtenida es la mostrada seguidamente.
(s0 X1 s1 X2 s2 ... Xm sm ai s , ai+1 ... an $)
pasando s a estar situado en cabeza de la pila y ai+1 el siguiente smbolo a explorar en la
cinta de entrada.
Anlisis Sintctico
Realizados por: Mara del Mar Aguilera Sierra y Sergio Glvez Rojas
29
Anlisis Ascendentes
3. Si accin (sm, ai) = aceptar
entonces se ha llegado a la finalizacin en el proceso de reconocimiento y el anlisis
termina reconociendo la tira de entrada.
4. Si accin (sm, ai) = error
entonces es muestra de que el analizador LR ha descubierto un error sintctico y
proceder en consecuencia activando las rutinas de correccin de errores. Una de las
ventajas de este tipo de anlisis es que , cuando se produce una accin de error, el token
errneo suele estar al final de . o al principio de , lo que permite depurar con cierta
facilidad las cadenas de entrada (programas).
La configuracin inicial del analizador es
(s0
a1 a2 ... an $)
Anlisis Sintctico
S
S
T
T
F
F
S+T
T
T*F
F
(S)
id
Realizados por: Mara del Mar Aguilera Sierra y Sergio Glvez Rojas
30
Anlisis Ascendentes
La figura siguiente muestra la tabla de anlisis con las funciones ACCIN y GOTO para
la gramtica anterior.
funcin ACCIN
ESTADO
0
id
D5
funcin GOTO
D4
D6
R2
D7
R2
R2
R4
R4
R4
R4
D4
R6
ACEP
D5
R6
R6
D5
D4
D5
D4
R6
10
D6
D11
R1
D7
R1
R1
10
R3
R3
R3
R3
11
R5
R5
R5
R5
Anlisis Sintctico
Realizados por: Mara del Mar Aguilera Sierra y Sergio Glvez Rojas
31
Anlisis Ascendentes
En la siguiente figura muestra un ejemplo de reconocimiento para la cadena de entrada
a * ( a + a)
id * (id + id)
PILA
CADENA DE
ENTRADA
id * (id + id )$
0a5
* (id + id ) $
0F3
* (id + id ) $
0T2
* (id + id ) $
0T2*7
(id + id ) $
0T2*7(4
id + id ) $
0T2*7(4a5
+ id ) $
0T2*7(4F3
+ id ) $
0T2*7(4T2
+ id ) $
10
0T2*7(4S8
+ id ) $
11
0T2*7(4S8+6
12
0T2*7(4S8+6a5
)$
13
0T2*7(4S8+6F3
)$
14
0T2*7(4S8+6T9
)$
15
0T2*7(4S8
)$
16
0 T 2 * 7 ( 4 S 8 ) 11
17
0 T 2 * 7 F 10
18
0T2
19
0S1
20
aceptacin de la cadena
Anlisis Sintctico
id ) $
Realizados por: Mara del Mar Aguilera Sierra y Sergio Glvez Rojas
32
Anlisis Ascendentes
Hemos estudiado como funcionan los analizadores LR mediante la utilizacin de sus
correspondientes tablas de anlisis. En las lneas de reconocimiento anteriores puede observarse
como el estado que siempre se encuentra en cabeza de la pila seala en todo momento la
informacin necesaria para la reduccin, si esto procede.
Hemos dejado al margen intencionadamente la estructura del programa de proceso puesto
que se trata esencialmente de un autmata finito con pila.
En general puede afirmarse que, dada la estructura de los analizadores LR, con la sola
inspeccin de k smbolos de la cadena de entrada a la derecha del smbolo actual puede decidirse
con toda exactitud cual es el movimiento (reduccin, desplazamiento, etc) a realizar. Es por este
motivo por lo que suele denominarse a este tipo de gramticas como LR(k). Como ya se
coment, en la prctica casi todos los lenguajes de programacin pueden ser analizados mediante
gramticas LR(0) o LR(1).
Las tablas LR(1) ideadas por Knuth en 1965 son demasiado grandes para las gramticas
de los lenguajes de programacin. En 1969 De Remer y Korenjack descubrieron formas de
compactar estas tablas, haciendo prctico y manejable este tipo de parser. El algoritmo es el
mismo ya visto. Hay para ellos las gramticas Simples- LR (SLR) o bien Look-Ahead LR (LALR)
estando las gramticas incluidas de la siguiente forma:
LR(k)
H LALR(k) H SLR(k)
Anlisis Sintctico
Realizados por: Mara del Mar Aguilera Sierra y Sergio Glvez Rojas
33
Anlisis Ascendentes
y ):
lista ID
| lista , ID
lista ID
| ID , lista
y ?
pila.
Anlisis Sintctico
Realizados por: Mara del Mar Aguilera Sierra y Sergio Glvez Rojas
34
Anlisis Ascendentes
Por la forma de construir las tablas pueden aparecer conflictos :
- Shift/Reduce
- Reduce/Reduce
- Shift/Reduce :aparece cuando en la tabla de acciones hay que poner una R de reducir y
una D de desplazar, el conflicto es que el programa no sabe si reducir o desplazar.
Ej : expr
expr + expr
| NUM
aaBdd
aCd
a
aa
Anlisis Sintctico
Realizados por: Mara del Mar Aguilera Sierra y Sergio Glvez Rojas
35
Anlisis Ascendentes
Suponemos la secuencia aaad
Aqu aunque lo correcto sera reducir por C, como el reconocimiento LALR(1) slo
permite ver un token a la entrada, pues slo se ve la d. Como no se sabe si detrs hay otra
d o no, pues es imposible tomar una decisin. Estamos ante una gramtica LALR(2).
Los conflictos reduce/reduce se pueden eliminar en la mayora de los casos. Ej:
S
S
B
C
aaBdd
aCd
a
aa
S
S
aaadd
aaad
En este caso lo que se ha hecho ha sido aadir las secuencias que producen el conflicto
como parte de la gramtica.
Anlisis Sintctico
Realizados por: Mara del Mar Aguilera Sierra y Sergio Glvez Rojas