El documento describe el análisis sintáctico ascendente o por desplazamiento y reducción. Este método construye el árbol sintáctico comenzando por las hojas y avanzando hacia la raíz mediante la reducción de formas sentenciales derechas usando las producciones de la gramática. Se explican conceptos como mangos, formas sentenciales derechas y el uso de una pila y buffer de entrada. También se detalla el análisis sintáctico LR y por precedencia de operadores.
1. Universidad Nacional San Luis Gonzaga
Facultad de Ing. De Sistemas
Lenguajes y Compiladores
Análisis Sintáctico
Parte II
Teoría Lenguajes
1
2. Análisis Ascendente
El análisis ascendente es conocido como análisis por
desplazamiento y reducción.
Intenta construir el árbol sintáctico comenzando por
las hojas y avanzando hacia la raíz.
Se puede considerar este proceso como una
reducción de la cadena de entrada al símbolo inicial.
Existen los siguientes métodos:
Sintáctico LR y sus variantes
Sintáctico por Precedencia de operadores
Teoría Lenguajes
2
3. Análisis Ascendente
Para la gramática:
S → aABe
A → Abc b
B→d
La frase abbcde se puede reducir a S:
abbcde
aAbcde
aAde
aABe
S
Teoría Lenguajes
3
4. Análisis Ascendente
Se usaron las siguientes producciones:
A→b
A → Abc
B→d
S → aABe
Estas reducciones trazan la siguiente derivación por la
derecha en orden inverso:
S → aABe → aAde → aAbcde → abbcde
Teoría Lenguajes
4
5. Definición
Si S →* αAw → αβw →* xw es a rightmost
derivation (derivación más a la derecha)
Se dice que αAw, αβw y xw son formas sentenciales
derecha.
• La forma sentencial derecha αβw puede ser reducida
con la producción A → β a la forma sentencial αAw.
• La subcadena β es “a handle” de αβw (mango o mando de
αβw).
• El análisis ascendente está basado en el uso del
mango para encontrar la reducción a realizar
Teoría Lenguajes
5
6. Ejemplo
Para la gramática
S → Ac Bd
A → aAb ab
B → aBbb abb
Para la forma sentencial aabbbbd el único mango es
abb ya que usando B → abb, podemos reducirla a
aBbbd que es una forma sentencial derecha. Observe
que ab es el lado derecho de la producción A → ab
pero ab no es mango de aabbbbd ya que de aplicar
A → ab se tendría aAbbbd que no es una forma
sentencial derecha.
Teoría Lenguajes
6
7. Ejemplo de reconocimiento
Para la gramática
( 1) E→ E+E
( 2) E→ E*E
( 3) E→ (E)
( 4) E→ id
Considere la cadena de entrada id + id * id
Se muestra los pasos realizados por el analizador por
desplazamiento y reducción.
Note que siempre a la derecha del mango sólo hay
símbolos terminales
Teoría Lenguajes
7
8. Ejemplo de reconocimiento
Forma sentencial Mango Producción de
derecha reducción
id + id * id id E → id
E + id * id id E → id
E + E * id id E → id
E + E * E E*E E→E * E
E + E E+E E→E + E
E
Teoría Lenguajes
8
9. Análisis Ascendente por
desplazamiento y reducción (AADR)
Hay que resolver dos problemas:
Determinar el mango
Escoger la producción para la reducción caso exista
más de una.
Para el análisis ascendente por desplazamiento y
reducción se usa una pila para guardar los símbolos
gramaticales, un buffer de entrada para la cadena a
analizar.
El símbolo $ sirve para marcar el fondo de la pila y el
final de la cadena de entrada.
Teoría Lenguajes
9
10. AADR
Pila Entrada Acción
1. $ id + id * id$ desplazar
2. $id + id * id$ reducir por E → id
3. $E + id * id$ desplazar
4. $E + id * id$ desplazar
5. $E + id * id$ reducir por E → id
6. $E + E * id$ desplazar
7. $E + E* id$ desplazar
8. $E + E * id $ reducir por E → id
9. $E + E*E $ reducir por E→E*E
10. $E + E $ reducir por E→E+E
11. $E $ aceptar
Teoría Lenguajes
10
11. AADR
Aunque las acciones básicas realizadas por el AADR
son el desplazamiento y la reducción, en realidad
existen cuatro acciones:
• Desplazar: el símbolo de la entrada se empila, se
toma otro símbolo de entrada
• Reducir: Desempila el tope y empila el lado
izquierdo de la producción que se está reduciendo
• Aceptar: fin del análisis sintáctico con éxito ($ en
la entrada y $S en el tope de la pila)
• Error: hay un error de sintaxis y se llama a la rutina
de recuperación de errores
Teoría Lenguajes
11
12. AADR
Para usar el método de desplazamiento y reducción
es necesario que la gramática no sea ambigua.
Ejemplo
Prop → if Expr then Prop
if Expr then Prop else Prop
otro
Si tenemos:
Pila: ... if Expr then Prop
Entrada: else ...$
Teoría Lenguajes
12
13. AADR
Si no es posible escoger de manera única la
producción para la reducción esa gramática no es
LR(1).
Ejemplo:
1 prop → id ( lista-param)
2 prop → exp := exp
3 lista-param → lista-param, paramparam
4 param → id
5 exp → id ( lista-exp) id
6 lista-exp → lista-exp, exp exp
Teoría Lenguajes
13
14. AADR
Si tenemos:
Pila: ... id1(id
Entrada: ,id) ...$
¿Cuál es la reducción a aplicar?
Si id1 es un nombre de procedimiento entonces
usaremos la producción 4, si id1 es un arreglo
usaremos la producción 5.
Una solución es que el léxico determine si el token es
un nombre de procedimiento para lo cual tendría que
consultar la tabla de símbolos pero ayudaría al
sintáctico.
Teoría Lenguajes
14
15. Análisis Sintáctico LR
Entrada a + b $
Pila Programa para Salida
X Parser LR
Y
Z
$ Acción ir-a
Teoría Lenguajes
15
16. Análisis Sintáctico LR
El analizador LR consta de:
Una entrada
Una pila
Un programa conductor
Una tabla de análisis sintáctico dividida en dos
partes:
»Acción: indica la acción del analizador.
»Ir - a: indica las transiciones entre estados.
Teoría Lenguajes
16
17. Codificación de la tabla LR
Acción
di indica desplazar, empilar la entrada y el
estado i
rj indica reducir por la producción número j
acep indica aceptar
un blanco indica error de sintaxis
Ir-a
Indica el estado a empilar junto a un no
terminal
Teoría Lenguajes
17
18. Uso de la tabla LR
Normalmente se usa la sección Acción de la tabla para
realizar un desplazamiento o una reducción
Desplazamiento: empilar entrada y estado indicado
Cuando se reduce se usa la sección Ir-a de la tabla:
Desempilar hasta encontrar, en la pila, el símbolo más a
la izquierda de la producción usada
Accesar la tabla con la combinación
(tope expuesto, lado izquierdo de la producción usada)
en la sección Ir-a y empilar el lado izquierdo de la
producción y el estado hallado en la tabla
Teoría Lenguajes
18
19. Ejemplo de Análisis Sintáctico LR
Para la gramática
( 1) E→E+T
( 2) E→T
( 3) T→T*F
( 4) T→F
( 5) F → (E)
( 6) F → id
Analizar la frase id + id * id
Teoría Lenguajes
19
20. Ejemplo de Tabla LR
Estado Acción ir-a
id + * ( ) $ E T F
0 d5 d4 1 2 3
1 d6 acep
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
Teoría Lenguajes
20
21. Ejemplo de análisis LR
Pila Entrada Acción
(1) 0 id * id + id $ desplazar
(2) 0 id 5 * id + id $ reducir por F → id
(3) 0F3 * id + id $ reducir por T → F
(4) 0T2 * id + id $ desplazar
(5) 0 T 2* 7 id + id $ desplazar
(6) 0 T 2* 7 id 5 + id $ reducir por F → id
(7) 0 T 2* 7 F 10 + id $ reducir por T → T * F
Teoría Lenguajes
21
22. Ejemplo de análisis LR
Pila Entrada Acción
(8) 0T2 + id $ reducir por E → T
(9) 0E1 + id $ desplazar
(10) 0E1+6 id $ desplazar
(11) 0 E 1 + 6 id 5 $ reducir por F → id
(12) 0E1+6F3 $ reducir por T → F
(13) 0E1+6T9 $ E→E + T
(14) 0E1 $ aceptar
Teoría Lenguajes
22
23. Ejemplo de análisis LR
Pasos del analizador:
Se comienza con 0 en la pila e id en la entrada
Accion[0,id] = d5: empilar id y 5
Acción [5,+] = r6: se usará la producción F → id para
reducir,
desempilar hasta encontrar id
el tope expuesto es 0 y el no terminal del lado izquierdo
de la producción es F
Ir-a [0,F] = 3
empilar F y 3
Teoría Lenguajes
23
24. Gramática de operadores
Son gramáticas que cumplen:
Ningún lado derecho de la producción es ε
No tiene dos no terminales adyacentes
Las gramáticas de operadores permiten la
construcción manual de analizadores por
desplazamiento y reducción
Estas gramáticas permiten implementar el análisis
sintáctico por precedencia de operadores.
Tiene restricciones que hace que su uso sea limitado
para un tipo especial de gramáticas.
Teoría Lenguajes
24
25. Ejemplos de gramáticas de operadores
La siguiente gramática
E → EAE (E) -E id
A → + - * / ↑
No es una gramática de operadores, pero se puede
transformar fácilmente a
E → E + EE - EE * EE / EE ↑ E (E) -E id
Que sí es una gramática de operadores y permite aplicar
el método de precedencia de operadores.
Teoría Lenguajes
25
26. Análisis Sintáctico por Precedencia de
Operadores (ASPO)
Se deben definir tres relaciones de precedencia
disjuntas <. , >. e =. entre algunos pares de
terminales.
Estas reglas de precedencia guían la selección de
mangos con el siguiente significado
Relación Significado
a cede precedencia a b
a <. b
a tiene la misma precedencia que b
a =. b
a tiene más precedencia que b
a .> b
Teoría Lenguajes
26
27. ASPO
Para determinar la precedencia de operadores se
puede:
Hacer un estudio intuitivo basado en el concepto de
precedencia de operadores y determinar por ejemplo
que + <. *. Esto resolverá las ambigüedades de la
última gramática propuesta.
Construir una gramática no ambigua que refleje la
precedencia de operadores como la gramática usada en
el ejemplo de análisis LR.
Teoría Lenguajes
27
28. ASPO
Ejemplo de análisis por precedencia de operadores
Relación de precedencia de operadores
id + * $
id
.> .> .>
+
<. .> <. .>
*
<. .> .> .>
$
<. <. <.
Teoría Lenguajes
28
29. ASPO
Dada la frase: id + id * id
Se insertan las precedencias considerando que la
frase comienza y termina con $.
Para insertar la precedencia entre dos terminales se
busca el operador de precedencia en la matriz . Para
el primer caso caso se busca entre la fila de $ y la
columna de id (resulta <. ).
La cadena con las relaciones de precedencia
resultante es: $ <. id >. + <. id >. * <. id >. $
Teoría Lenguajes
29
30. ASPO
Para encontrar el mango se usa el siguiente
algoritmo:
Buscar desde el extremo izquierdo el primer .>
Luego buscar hacia atrás el primer <. Saltando los =.
El mango es todo lo que está entre <. y .>
Para la frase mostrada el primer mango sería id
entonces se reduce a E obteniendo la forma
sentencial E + id * id. Luego de reducir todos los id
se obtiene E + E * E.
Teoría Lenguajes
30
31. ASPO
Eliminando los no terminales se tiene: $+*$
Insertando las relaciones de precedencia se
obtiene: $ <. + <. * .>$
El mango es E * E que se reduce a E.
Quedando $+$ ($E + E$) o $ <. +.> $
El proceso se repite hasta tener $$ en la frase (sin
considerar los no terminales).
Teoría Lenguajes
31
32. ASPO
En una implementación no es necesario:
Insertar las precedencias en la frase
Examinar toda la frase para determinar el mango.
Se debe usar una pila para guardar los elementos
de la entrada ya examinados.
Se usa la matriz de precedencia de operadores
para determinar el mango
Teoría Lenguajes
32
33. Algoritmo para ASPO
Si se cumple <. o =. entre el tope de la pila y el
elemento de la entrada se realiza un desplazamiento
(empilar entrada y avanza la entrada).
Si se cumple .> ya se encontró el mango y hay que
reducir (desempilar hasta encontrar la relación <.)
Si no cumple ninguna relación de precedencia se ha
detectado un error de sintaxis.
Teoría Lenguajes
33
34. Algoritmo para ASPO
repetir
si Tope(Pila) <. Entrada o Tope(Pila) =. Entrada
entonces Empilar(Entrada, Pila)
Lexico(Entrada)
sino si Tope(Pila) >. Entrada
entonces repetir
Desempilar(X, Pila)
hasta Tope(Pila) <. X
frepetir
fsi
fsi
hasta Tope(Pila) = $ y Entrada = $
frepetir
Teoría Lenguajes
34