Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
n
i 1 =
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Anlisis Sintctico Descendente
Clculo del conjunto de SIGUIENTES.
En este caso se aade una produccin inicial: X S$
Definicin:
Si A es un smbolo no terminal de la gramtica, SIGUIENTES(A) es el conjunto de
terminales que pueden aparecer a continuacin de A en alguna forma sentencial
derivada del smbolo inicial.
Definicin formal:
a e SIGUIENTES(A) si a e (T {$}) | - S * oAa| para algn par de tiras o, |.
Reglas para el clculo del conjunto de los SIGUIENTES
1. Inicialmente, SIGUIENTES(A)= C
2. Si A es el smbolo inicial, entonces SIGUIENTES(A)=SIGUIENTES(A) {$}
3. (s1) Para cada regla de la forma:
B oA| entonces SIGUIENTES(A)=SIGUIENTES(A) PRIMEROS(|)-{}
4. (s2) Para cada regla de la forma:
B oA o bien B oA| en la que e PRIMEROS(|) entonces
SIGUIENTES(A)=SIGUIENTES(A) SIGUIENTES(B)
5. Repetir los pasos 3 y 4 hasta que no se puedan aadir ms smbolos a SIGUIENTES(A)
Nota: Las reglas (s1) y (s2) no son excluyentes
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Anlisis Sintctico Descendente
Clculo del conjunto PREDICT
La funcin PREDICT se aplica a producciones de la gramtica (A o) y devuelve
un conjunto, llamado conjunto de prediccin, que puede contener cualesquiera
terminales de la gramtica y el smbolo $, pero nunca puede contener .
Reglas para el clculo del conjunto PREDICT
PREDICT(A o) =
Si e PRIMEROS(o) entonces = (PRIMEROS(o)-{}) {SIGUIENTES(A)}
sino = PRIMEROS(o)
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Anlisis Sintctico Descendente
La condicin LL(1)
La condicin LL(1) es necesaria y suficiente para poder construir un ASDP para una
gramtica.
Dadas todas las producciones de la gramtica para un mismo no terminal:
A1| 2| | n e N
Se debe cumplir la siguiente condicin:
i,j (i=j) PREDICT(A i) PREDICT(A j) = u
Modificacin de gramticas no LL(1)
1.Eliminacin de la ambigedad
2. Factorizacin izquierda
A|1| |2|| |n| i
Sustituir por: A A| I
A |1| |2|| |n
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Anlisis Sintctico Descendente
3. Eliminacin de la recursividad izquierda
AA1| A2|| Am| |1| |2|| |n
Sustituir por: A |1A| |2A|| |nA| I
A 1A|2A|| mA|
Eliminacin de recursividad indirecta
Pasos:
1. Ordenar los no terminales segn A1.A2,,An
2. Desde I 1 hasta n hacer
Desde j1 hasta I-1 hacer
Sustituir cada AiAj por Aio1 | o2|| ok
donde Aj o1 | o2 | | ok son las producciones actuales de Aj
Eliminar la recursividad izquierda directa de la produccin de Ai
Fin_para
Fin_para
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Anlisis Sintctico Descendente
Algoritmo de ejecucin del Analizador Descendente Dirigido por Tabla:
Entrada: cadena de elementos lxicos devueltos por el A.L.
Salida: producciones que construyen su rbol de anlisis sintctico
Pasos:
push($)
push(S)
Repetir
Sea A el smbolo en el tope de la pila
Sea a smbolo de preanlisis
Si A es un terminal o $ entonces
Si A = a entonces
pop(A)
a:= analex()
sino
Error sintctico (encontrado lexema, esperaba A)
finsi
sino /* Es un no terminal */
Si Tabla[A,a]=Ao1o2ok entonces
pop(A)
Desde I:=k hasta 1 hacer push(oI) findesde
sino
Error sintctico
finsi
Hasta A=$ /* La pila esta vaca */
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Traduccin dirigida por sintaxis
Una definicin dirigida por sintaxis es un instrumento que nos permite planear
las acciones que queremos que se realicen por el analizador gramatical al
cumplimiento de ciertas reglas gramaticales.
Ejemplo:
E E escribe(E.s)
E E opsr T E.s = concatena (E.s, T.s, opsr.o)
E T E.s = T.s
T T opmd F T.s = concatena (T.s, F.s, opmd.o)
T F T.s = F.s
F (E) F.s = E.s
F numero F.s = numero.s
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Anlisis semntico
Verificacin de Tipos
1 2 3 4
1 1 2
2 2 2
3
Multiplicar/Dividir
1 Entero
2 Real
3 Caracter
Declaracin de Funciones
a 2
b 2
c 3
x Fun+2
y Fun+1
a 0
b 0
w 2
c 2
a 2
b 1
Variable
Tipo
Argumentos
Apuntador
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Anlisis semntico
Cdigo intermedio
Iteracion -> MIENTRAS expresion REPITE orden FMIENTRAS
-> REPITE orden HASTA QUE expresion FREPITE
En el caso de MIENTRAS-REPITE:
Evaluar
expresin
Orden
Falsa?
no
si
2
3
1
Iteracion -> MIENTRAS (1)
expresion (2)
REPITE orden
FMIENTRAS (3)
(1)
inicio_mientras=Genera_etiqueta();
fin_mientras=Genera_etiqueta();
Escribe(inicio_mientras,:);
(2)
Escribe(CMP, Expresion.I,0);
Escribe(JZ,fin_mientras);
(3)
Escribe(JMP,inicio_mientras);
Escribe(fin_mientras,:);
Inicio_mientras
Cdigo de expresin
CMP Expresin,0
JZ fin_mientras
Cdigo de orden
JMP inicio_mientras
Fin_mientras
COMPILADORES
M.C. Hilda Castillo Zacatelco
BUAP
Cdigo intermedio
En el caso de REPITE-HASTA:
Iteracion -> REPITE (1) orden
HASTA QUE expresion (2)
FREPITE
(1)
inicio_repite=Genera_etiqueta();
Escribe(inicio_repite,:);
(2)
Escribe(CMP, Expresion.I,0);
Escribe(JZ,inicio_repite);