Compiladores e intérpretes Generación de código intermedio II Profesor: Eridan Otto.

14
Compiladores e intérpretes Generación de código intermedio II Profesor: Eridan Otto

Transcript of Compiladores e intérpretes Generación de código intermedio II Profesor: Eridan Otto.

Page 1: Compiladores e intérpretes Generación de código intermedio II Profesor: Eridan Otto.

Compiladores e intérpretesGeneración de código intermedio II

Profesor: Eridan Otto

Page 2: Compiladores e intérpretes Generación de código intermedio II Profesor: Eridan Otto.

Generación de código intermedio II

• Uso de notación polaca • En parser desendente recursivo

Page 3: Compiladores e intérpretes Generación de código intermedio II Profesor: Eridan Otto.

Generación de código intermedio II:Uso de notación polaca

Compiladores e intérpretes

– 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,, ,)

Page 4: Compiladores e intérpretes Generación de código intermedio II Profesor: Eridan Otto.

Generación de código intermedio II:En parser desendente recursivo

Compiladores e intérpretes

– 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

Page 5: Compiladores e intérpretes Generación de código intermedio II Profesor: Eridan Otto.

Compiladores e intérpretes

– Ejemplo, código para producción E::= identificador:=E’– Regla semántica CreaHoja(‘identificador’,id.puntero):=E’.nodo

Funcion E(VAR arbol:arbol) c:=GetToken IF c=‘identificador’ THEN BEGIN

nodo:= CreaHoja(‘identificador’,token.puntero(c)) c:= GetToken if c= ‘:=‘ THEN BEGIN arbol:=CreaNodo(‘:=‘,arbol,NIL) E’(nodo.dcha(arbol))

ELSE error()

ELSE error() END

Generación de código intermedio II:En parser desendente recursivo

Page 6: Compiladores e intérpretes Generación de código intermedio II Profesor: Eridan Otto.

Compiladores e intérpretes

– Definición dirigida por sintaxis para construir un ASA de una gramática para expresiones matemáticas.

– Por ejemplo, al analizar a-4+2+c 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 T::=id y T::=num, hay un puntero a una hoja identificador o valor numérico

Generación de código intermedio II:En parser desendente recursivo

Page 7: Compiladores e intérpretes Generación de código intermedio II Profesor: Eridan Otto.

Compiladores e intérpretes

– Ejemplo: a-4+2+c Generación de código intermedio II:En parser desendente recursivo

E.nodo

E.nodo

E.nodo

T.nodo T.nodoT.nodo

T.nodo

id numnum

id-

+

+

id

Entrada id a

4

-

+

+

id

Entrada id c

2

Ejemplo: a-4+2+c, ASA

+

+

-

4

2c

a

Page 8: Compiladores e intérpretes Generación de código intermedio II Profesor: Eridan Otto.

Compiladores e intérpretes

– Ejercicio: derivar de a+a*(b-c)+(b-c)*d su ASA y optimizarGeneración de código intermedio II:En parser desendente recursivo

+

+

*

*

c

a

a -

b

dc

-

b

-optimizando, generandoUn grafo dirigico acíclico

+

+

*

*

ca

-

b

d

Page 9: Compiladores e intérpretes Generación de código intermedio II Profesor: Eridan Otto.

Compiladores e intérpretes

– Asignación y expresiones matemáticas con cuartetosGeneración de código intermedio II:Generación de cuartetos

Page 10: Compiladores e intérpretes Generación de código intermedio II Profesor: Eridan Otto.

Compiladores e intérpretesGeneración de código intermedio II:Generación de cuartetos

– Asignación y expresiones matemáticas con cuartetos, Ejercicio, derivar los cuartetos a partir de la sintaxis para a:= b*c+d

E

E

E E

E+

*

id id

idE.valor=bE.codigo=‘’ E.valor=c

E.codigo=‘’

E.valor=t1E.codigo=(*,b,c,t1)

S

id :=

E.valor=dE.codigo=‘’

E.valor=t2E.codigo=(*,b,c,t1) (+,t1,d,t2)

E.codigo=(*,b,c,t1) (+,t1,d,t2) (:=,t2,a,)

Page 11: Compiladores e intérpretes Generación de código intermedio II Profesor: Eridan Otto.

Compiladores e intérpretes

– 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:

Generación de código intermedio II:Generación de cuartetos

Page 12: Compiladores e intérpretes Generación de código intermedio II Profesor: Eridan Otto.

Compiladores e intérpretes

– Asignación y expresiones booleanas.Generación de código intermedio II:Generación de cuartetos

Eo:=E1 ‘and’ E2

Eo:=id1 relop id2 Eo.true:=newlabelEo.false:=newlabelEo.sale:=newlabelEo.valor:=newtempEo.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)

relop := < | > | <= |>= |= | <>

Page 13: Compiladores e intérpretes Generación de código intermedio II Profesor: Eridan Otto.

Compiladores e intérpretes

– Ejercicio, genere código intermedio para: a>b or c<d– Sentencias de control de flujo , las expresiones booleanas se definieron en el

contexto de su utilidad para las definiciones condicionales y de ciclo

Generación de código intermedio II:Generación de cuartetos

– Ejercicio:Escriba las reglas semánticas para IF E THEN S, de manera de generar los cuartetos correspondientes

Page 14: Compiladores e intérpretes Generación de código intermedio II Profesor: Eridan Otto.

Compiladores e intérpretes

– Sentencia de repeticiónGeneración de código intermedio II:Generación de cuartetos

– Escriba las reglas semánticas para REPEAT S UNTIL E, de manera de generar los cuartetos correspondientes