Title: Presentaci
1Compiladores e intérpretes Generación de código
intermedio II Profesor Eridan Otto
2Generación de código intermedio II
- Uso de notación polaca
- En parser desendente recursivo
3Compiladores e intérpretes
Generación de código intermedio IIUso de
notación polaca
- El código se genera cuando se encuentra el
operador - Ejemplo
- Pila Entrada Godigo Generado
- SABC
- S ABC
- SA BC
- SAB C
- SABC (,B,C,T1)
- SA T1 (,A,T1,T2)
- ST2 (,T2, ,S)
- (end,, ,)
-
4Compiladores e intérpretes
Generación de código intermedio IIEn parser
desendente recursivo
- Se pueden utilizar las rutinas de las
analizadores sintácticos desendentes para ir
creando Arboles de Sintaxis Abstracta (ASA), a
partir del código. Recordar un no terminal es un
procedimiento. - Supongamos que se genera con el análisis un arbol
binario con tres campos por nodo - Info, información del nodo
- Izda, puntero al subarbol izquierdo
- Dcha, puntero al subárbol derecho
- Se pueden definir las funciones
- CreaNodo crea nodo del árbol
- CreaHoja crea hoja del árbol
- Se añade un parámetro a cada procedimiento que
genera el árbol, el cual contiene la referencia
al árbol hasta el momento - Una vez el árbol terminado, sepuede recorrer y
generar grafos dirigidos para optimizar las
expresiones matemáticas
5Compiladores e intérpretes
Generación de código intermedio IIEn parser
desendente recursivo
- Ejemplo, código para producción E
identificadorE - Regla semántica CreaHoja(identificador,id.punter
o)E.nodo - Funcion E(VAR arbolarbol)
- cGetToken
- IF cidentificador THEN
- BEGIN
- nodo CreaHoja(identificador,token.puntero(
c)) - c GetToken
- if c THEN
- BEGIN
-
arbolCreaNodo(,arbol,NIL) -
E(nodo.dcha(arbol)) - ELSE
- error()
- ELSE
- error()
- END
6Compiladores e intérpretes
Generación de código intermedio IIEn parser
desendente recursivo
- Definición dirigida por sintaxis para construir
un ASA de una gramática para expresiones
matemáticas. - Por ejemplo, al analizar a-42c se genera el
siguiente árbol de sintáxis abstracta - En líneas punteadas aparece el arbol sintáctico
con nodos etiquetados E y T usando - atributo sintetizado .nodo, como puntero a un
nodo del árbol ASA - Para las producciones Tid y Tnum, hay un
puntero a una hoja identificador o - valor numérico
7Compiladores e intérpretes
Generación de código intermedio IIEn parser
desendente recursivo
E.nodo
E.nodo
T.nodo
E.nodo
T.nodo
id
T.nodo
T.nodo
-
num
id
2
-
id
num
Entrada id c
id
4
Entrada id a
c
-
2
Ejemplo a-42c, ASA
a
4
8Compiladores e intérpretes
Generación de código intermedio IIEn parser
desendente recursivo
- Ejercicio derivar de aa(b-c)(b-c)d su ASA y
optimizar
-
a
d
c
b
a
-
c
b
- optimizando, generando
- Un grafo dirigico acíclico
d
-
c
a
b
9Compiladores e intérpretes
Generación de código intermedio IIGeneración de
cuartetos
- Asignación y expresiones matemáticas con cuartetos
10Compiladores e intérpretes
Generación de código intermedio IIGeneración de
cuartetos
- Asignación y expresiones matemáticas con
cuartetos, Ejercicio, derivar los cuartetos a
partir de la sintaxis para a bcd
E.codigo(,b,c,t1) (,t1,d,t2) (,t2,a,)
S
E.valort2
E
id
E.codigo(,b,c,t1) (,t1,d,t2)
E.valort1
E
E
E.codigo(,b,c,t1)
E.valord
E.codigo
E.valorb
id
E
E
E.codigo
E.valorc
E.codigo
id
id
11Compiladores e intérpretes
Generación de código intermedio IIGeneración de
cuartetos
- Asignación y expresiones booleanas.
- Para el código intermedio se supondrá valor 0
representa a falso y valor 1 reprenta a
verdadero. - Representación de una expresión booleana para los
operadores lógicos, con el flujo de control del
código intermedio. Por ejemplo, dadas las
expresiones E1 or E2 ,si se determina que E1 es
verdadera, la expresión completa es verdadera,
sin nececitar evaluar E2 . And al contrario
requiere de E1 fala para ser toda la expesión
falsa. Agregando a las definiciones de asignación
12Compiladores e intérpretes
Generación de código intermedio IIGeneración de
cuartetos
- Asignación y expresiones booleanas.
EoE1 and E2
Eo.truenewlabel Eo.falsenewlabel Eo.salenewl
abel Eo.valornewtemp Eo.codigo Gen(relop, id1
, id2, Eo.true) Gen(GOTO, ,, Eo.false) Gen(LABEL,
, Eo.true) Gen(, 1 , , Eo.valor) Gen(GOTO, ,,
Eo.sale) Gen(LABEL, , Eo.false) Gen(, 0 , ,
Eo.valor) Gen(LABEL, , Eo.sale)
Eoid1 relop id2
relop lt gt lt gt ltgt
13Compiladores e intérpretes
Generación de código intermedio IIGeneración de
cuartetos
- Ejercicio, genere código intermedio para agtb or
cltd - Sentencias de control de flujo , las expresiones
booleanas se definieron en el contexto de su
utilidad para las definiciones condicionales y de
ciclo
- EjercicioEscriba las reglas semánticas para IF
E THEN S, de manera de - generar los cuartetos correspondientes
14Compiladores e intérpretes
Generación de código intermedio IIGeneración de
cuartetos
- Escriba las reglas semánticas para REPEAT S
UNTIL E, - de manera de generar los cuartetos
correspondientes