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

Post on 14-Apr-2015

25 views 1 download

Transcript of 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

Generación de código intermedio II

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

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

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

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

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

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

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

Compiladores e intérpretes

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

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

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

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

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

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