Você está na página 1de 34

Procesadores de Lenguajes

Ingeniera Tcnica superior de Ingeniera Informtica


Departamento de Lenguajes y Sistemas informticos

Generacin de cdigo
intermedio I
Sentencias y expresiones
Javier Vlez Reyes
jvelez@lsi.uned.es
Departamento de Lenguajes Y Sistemas Informticos
UNED
Generacin de cdigo intermedio. Sentencias y expresiones
Objetivos

Objetivos
Aprender en qu consiste la generacin de cdigo intermedio
Aprender qu es el cdigo intermedio
Conocer los distintos tipos de lenguajes intermedios
Valorar la importara de realizar una buena eleccin del lenguaje intermedio
Conocer cmo son los lenguajes intermedios lineales
Entender el significado de las variables temporales en el cdigo intermedio lineal
Entender el significado de las etiquetas en el cdigo intermedio lineal
Aprender a construir esquemas de traduccin para generar cdigo intermedio
Conocer los artefactos computacionales que son necesarios para darles soporte
Aprender a generar cdigo intermedio para expresiones
Aprender a generar cdigo intermedio para sentencias de control

Javier Vlez Reyes jvelez@lsi.uned.es


Generacin de cdigo intermedio. Sentencias y expresiones
ndice

ndice
Introduccin
Qu es el cdigo intermedio
La fase de generacin de cdigo intermedio
El cdigo intermedio como punto de desacoplamiento
Lenguajes intermedios
Representaciones jerrquicas de cdigo intermedio
Representaciones lineales de cdigo intermedio
Generacin de cdigo intermedio en la prctica
Artefactos para la generacin de cdigo intermedio
Generacin de cdigo intermedio para expresiones
Generacin de cdigo intermedio para sentencias
Desarrollo paso a paso
Bibliografa

Javier Vlez Reyes jvelez@lsi.uned.es


Generacin de cdigo intermedio. Sentencias y expresiones
Introduccin

Qu es el cdigo intermedio?
Una vez superadas todas las fases de anlisis del cdigo fuente, el compilador debe ser capaz de
generar una representacin simblica del programa lo ms aproximada a los potenciales lenguajes
objetivos al que se va a traducir el mismo pero lo suficientemente distante de stos como para
garantizar su aplicabilidad en distintas arquitecturas fsicas finales

El cdigo intermedio es una representacin abstracta del programa cercana a


los lenguajes objetivos potenciales pero independiente de cualquier
consideracin especfica de una arquitectura fsica concreta

I. Independencia del entorno de ejecucin II. Independencia del juego de instrucciones


La independencia del entorno de ejecucin se El cdigo intermedio de un programa es
refiere al hecho de que el cdigo intermedio una abstraccin establecida a travs de un
debe ser agnstico del modelo de organizacin compromiso de consenso entre los equipos
de memoria, el nmero, tipo y propsito de dedicados al anlisis de lenguajes y los
registros, etc. Esto implica que todas las dedicados a la sntesis. Esto significa que la
referencias a datos en cdigo intermedio coleccin de operadores disponibles en un
siguen hacindose a travs de smbolos cdigo intermedio se debe mantener
registrados o generados durante el proceso de independiente y equidistante de cualquier
compilacin lenguaje y juego de instrucciones propio de
una arquitectura fsica real para garantizar
la traduccin a distintos cdigos finales

Javier Vlez Reyes jvelez@lsi.uned.es


Generacin de cdigo intermedio. Sentencias y expresiones
Introduccin

La fase de generacin de cdigo intermedio


La fase de generacin de cdigo intermedio se encarga de traducir el programa a una representacin
de cdigo intermedio para que luego sta pueda ser transformada en las fases subsiguientes a un
cdigo ejecutable en una determinada arquitectura fsica

Etapa de anlisis Etapa de sntesis

While ( a > b ) do
a := a + 1; Analizador sintctico

Cdigo intermedio
Analizador lxico

Cdigo final
Analizador
semntico
eli hw <WHILE, PR> S
S
LD a t1 0000 0011
WHILE E DO S WHILE E DO S LD b t2 0000 0011
GRT t3 t1 t2 0100 0001
E > E E > E
BRZ t3 L1 0100 0000
0001 0010

Expertos en lenguajes Expertos en arquitecturas


Independencia de arquitectura Dependencia de arquitectura
Dependencia de lenguaje Independencia de lenguaje
Optimizacin de lenguajes Optimizacin de ejecucin

Javier Vlez Reyes jvelez@lsi.uned.es


Generacin de cdigo intermedio. Sentencias y expresiones
Introduccin

El cdigo intermedio como punto de desacoplamiento


El cdigo intermedio permite multiplexar los esfuerzos de desarrollo de los equipos de anlisis de
lenguajes y de sntesis de manera que se pueden crear M x N compiladores distintos a partir de M
especificaciones y N traducciones a arquitecturas fsicas reales
While ( a > b ) do while ( a > b )
a := a + 1; a++;
Pascal C

Analizador lxico Analizador lxico


Equipo de Lenguaje

Analizador sintctico Analizador sintctico

M
Analizador semntico Analizador semntico

Cdigo intermedio Cdigo intermedio

LD a t1
Cdigo LD b t2
GRT t3 t1 t2
intermedio BRZ t3 L1
Intel Solaris
Optimizacin Cdigo Optimizacin Cdigo
arquitectura
Equipo de

intermedio intermedio
N Cdigo final
Cdigo final

Javier Vlez Reyes jvelez@lsi.uned.es


Generacin de cdigo intermedio. Sentencias y expresiones
Lenguajes intermedios

Lenguajes intermedios
El primer paro para la generacin de cdigo intermedio consiste en el diseo de un lenguaje intermedio
que permita representar de forma fiel y suficientemente abstracta los programas de un compilador.
Existen distintas alternativas que describiremos a continuacin

I. Representaciones jerrquicas I.I Arboles sintcticos abstractos


Son una representacin similar a los rboles de
Las representaciones jerrquicas de anlisis sintcticos donde los artefactos
cdigo intermedio reflejan los programas semnticamente superfluos se omiten y los no
de un lenguaje como una estructura terminales se sustituyen por operadores
relacional de nodos y arcos entre nodos.
I.I Grafos dirigidos acclicos
Lenguajes intermedios

Estas representaciones son aconsejables


para tareas de anlisis y transformacin Cuando los nodos de un rbol sintctico
pero no para sintetizar ejecutables en una abstracto son referenciados por ms de un
arquitectura fsica real padre surgen los grafos dirigidos acclicos

II. Representaciones lineales II.I Lenguajes de tercetos o tripletas


Foco de
atencin
Las representaciones lineales de cdigo En los lenguajes de tercetos cada operacin
intermedio codifican un programa como tiene hasta dos operandos de entrada y uno de
una secuencia de instrucciones de bajo salida que se sobrescribe sobre alguno de los
nivel abstractas prximas al lenguaje de entrada
ensamblador. Este tipo de lenguajes II.II Lenguajes de cuartetos o cudruplas
resultan ms apropiados para la etapa de
sntesis puesto que se encuentran ms En los lenguajes de cuartetos cada operacin
cercanas a la estructura tpica los tiene hasta 2 operandos de entrada y uno
lenguajes objetivos ms comunes independiente de salida para el resultado

Javier Vlez Reyes jvelez@lsi.uned.es


Generacin de cdigo intermedio. Sentencias y expresiones
Lenguajes intermedios

Representaciones jerrquicas
Las representaciones jerrquicas describen el cdigo fuente de un programa como una coleccin de
nodos relacionados entre s a travs de arcos con el mismo nivel de abstraccin que lo hacen los
rboles de anlisis sintctico

rboles sintcticos abstractos


Los arboles sintcticos abstractos representan el Apto para anlisis semntico
cdigo fuente de un programa de acuerdo a una
estructura jerrquica de forma similar a como lo haces Apto para procesos de transformacin
los rboles de anlisis sintctico. En estas Inadecuado para la etapa de sntesis
representaciones no obstante se omiten todos tipo de
Representacin excesivamente abstracta
smbolos semnticamente superfluos y se eliden los no
terminales que dan informacin sobre el proceso de
derivacin gramatical

rbol de anlisis sintctico Cdigo intermedio

SWhile transformacin WHILE

WHILE ( E ) DO S > ++

E > E ID ID ID

while (a>b) do a++ while (a>b) do a++

Javier Vlez Reyes jvelez@lsi.uned.es


Generacin de cdigo intermedio. Sentencias y expresiones
Lenguajes intermedios

Representaciones jerrquicas
Las representaciones jerrquicas describen el cdigo fuente de un programa como una coleccin de
nodos relacionados entre s a travs de arcos con el mismo nivel de abstraccin que lo hacen los
rboles de anlisis sintctico

Grafos dirigidos acclicos


Los arboles dirigidos acclicos realizan una Apto para anlisis semntico
representacin del cdigo fuente en forma de grafo. El
mtodo constructivo es similar al de los rboles Apto para procesos de transformacin
sintcticos con la diferencia de que aqu se reutilizan Inadecuado para la etapa de sntesis
los nodos que reflejen la misma estructura n aras a
Representacin excesivamente abstracta
resultar ms eficiente su representacin en memoria

rbol de anlisis sintctico Cdigo intermedio


Asignacin :=

ID := E
transformacin ID +

E + E
*

E * E E * E
ID ID

a := b * c + b * c a := b * c + b * c

Javier Vlez Reyes jvelez@lsi.uned.es


Generacin de cdigo intermedio. Sentencias y expresiones
Lenguajes intermedios

Representaciones lineales
Las representaciones lineales suponen un secuenciamiento de la informacin codificada en los rboles
de anlisis sintcticos en forma de una coleccin de instrucciones abstractas de bajo nivel pero
manteniendo las referencias simblicas introducidas por el programador. Para articular el proceso de
secuenciamiento se utilizan varios elementos como operandos de dichas instrucciones que sern
utilizados en lo venidero a lo largo del tema

I. Valores literales II. Variables


En numerosas ocasiones las operaciones de Muchos de los smbolos declarados por el
cdigo intermedio utilizan operandos que programador, tales como constantes,
representan valores literales enteros con o sin variables globales o locales y parmetros,
signo. La fase de traduccin a cdigo final se son referidos de forma general dentro del
encarga posteriormente de traducir esos cdigo intermedio como operandos de tipo
valores a la representacin numrica variable
correspondiente utilizada por la arquitectura

Los valores literales utilizados como Las variables de cdigo intermedio


operandos en las operaciones de los representan las constantes, variables
lenguajes de cdigo intermedio lineales globales o locales y parmetros declarados
representan valores enteros con signo por el programador a lo largo del cdigo
fuente

Javier Vlez Reyes jvelez@lsi.uned.es


Generacin de cdigo intermedio. Sentencias y expresiones
Lenguajes intermedios

Representaciones lineales
Las representaciones lineales suponen un secuenciamiento de la informacin codificada en los rboles
de anlisis sintcticos en forma de una coleccin de instrucciones abstractas de bajo nivel pero
manteniendo las referencias simblicas introducidas por el programador. Para articular el proceso de
secuenciamiento se utilizan varios elementos como operandos de dichas instrucciones que sern
utilizados en lo venidero a lo largo del tema

III. Variables temporales IV. Etiquetas de cdigo


El secuenciamiento de expresiones complejas Muchas de las sentencias de un lenguaje de
requiere del almacenamiento temporal de los alto nivel (control de flujo, invocacin de
resultados parciales de las subexpresiones en subprogramas, etc.) requieren insertar
espacios de memoria especficamente etiquetas en el cdigo final para luego realizar
reservados para ello. Los elementos de cdigo saltos a ellas. La forma de referirse a estas
intermedio que se utilizan para referencias esas etiquetas en cdigo intermedio es mediante
direcciones se llaman variables temporales las etiquetas de cdigo

Una variable temporal es la representacin Una etiqueta de cdigo es una referencia de


simblica en cdigo intermedio de un cdigo intermedio a una zona de memoria
espacio de memoria destinado a almacenar donde comienza cierta porcin de cdigo
un resultado parcial de alguna expresin final

Javier Vlez Reyes jvelez@lsi.uned.es


Generacin de cdigo intermedio. Sentencias y expresiones
Lenguajes intermedios

Representaciones lineales
Las representaciones lineales suponen un secuenciamiento de la informacin codificada en los rboles
de anlisis sintcticos en forma de una coleccin de instrucciones abstractas de bajo nivel pero
manteniendo las referencias simblicas introducidas por el programador. A continuacin describimos los
2 tipos de representaciones lineales

Lenguajes de tercetos
Las representaciones de cdigo intermedio basadas en Apto para la etapa de sntesis
tercetos estn formados por una secuencia de
instrucciones constituida por 3 elementos: un cdigo de Representacin cercana al lenguaje objetivo
operacin, un operando de entrada y otro de entrada y Complejidad en la traduccin de construcciones
salida para almacenar el resultado
Resultado
En los lenguajes de tercetos uno de los
operandos hace de almacn para el resultado
de la operacin lo que supone que el
operando de entrada se pierde tras su
ADD x y ejecucin

Cdigo de operacin Operandos


El cdigo de operacin es un
Los operandos identifican los elementos
acrnimo que representa el tipo
sobre los que se efecta la operacin
de operacin que se aplican
referida por el cdigo de operacin.
entre los operandos del terceto
Pueden ser valores literales, variables,
variables temporales o etiquetas

Javier Vlez Reyes jvelez@lsi.uned.es


Generacin de cdigo intermedio. Sentencias y expresiones
Lenguajes intermedios

Representaciones lineales
Las representaciones lineales suponen un secuenciamiento de la informacin codificada en los rboles
de anlisis sintcticos en forma de una coleccin de instrucciones abstractas de bajo nivel pero
manteniendo las referencias simblicas introducidas por el programador. A continuacin describimos los
2 tipos de representaciones lineales

Lenguajes de tercetos
Las representaciones de cdigo intermedio basadas en Apto para la etapa de sntesis
tercetos estn formados por una secuencia de
instrucciones constituida por 3 elementos: un cdigo de Representacin cercana al lenguaje objetivo
operacin, un operando de entrada y otro de entrada y Complejidad en la traduccin de construcciones
salida para almacenar el resultado

rbol de anlisis sintctico


Asignacin Cdigo intermedio

ID := E LOAD t0 b t0 b
transformacin LOAD t1 c t1 c
(a)
E * E MUL t1 t0 t1 t1 * t0
STORE t1 a t1 a

ID ID
(b) (c)
a := b * c
a := b * c

Javier Vlez Reyes jvelez@lsi.uned.es


Generacin de cdigo intermedio. Sentencias y expresiones
Lenguajes intermedios

Representaciones lineales
Las representaciones lineales suponen un secuenciamiento de la informacin codificada en los rboles
de anlisis sintcticos en forma de una coleccin de instrucciones abstractas de bajo nivel pero
manteniendo las referencias simblicas introducidas por el programador. A continuacin describimos los
2 tipos de representaciones lineales

Lenguajes de cuartetos
Las representaciones de cdigo intermedio basadas en Apto para la etapa de sntesis
cuartetos estn formados por una secuencia de
instrucciones constituida por 4 elementos: un cdigo de Representacin cercana al lenguaje objetivo
operacin, dos operando de entrada y otro de salida Mayor sencillez en la traduccin de construcciones
para almacenar el resultado
Resultado
En los lenguajes de cuartetos el almacn
para el resultado de la operacin es un
operando de salida independiente lo que
supone que no hay perdida de informacin
ADD x y z tras la ejecucin de la operacin

Cdigo de operacin Operandos


El cdigo de operacin es un
Los operandos identifican los elementos
acrnimo que representa el tipo
sobre los que se efecta la operacin
de operacin que se aplican
referida por el cdigo de operacin.
entre los operandos del terceto
Pueden ser valores literales, variables,
variables temporales o etiquetas

Javier Vlez Reyes jvelez@lsi.uned.es


Generacin de cdigo intermedio. Sentencias y expresiones
Lenguajes intermedios

Representaciones lineales
Las representaciones lineales suponen un secuenciamiento de la informacin codificada en los rboles
de anlisis sintcticos en forma de una coleccin de instrucciones abstractas de bajo nivel pero
manteniendo las referencias simblicas introducidas por el programador. A continuacin describimos los
2 tipos de representaciones lineales

Lenguajes de cuartetos
Las representaciones de cdigo intermedio basadas en Apto para la etapa de sntesis
cuartetos estn formados por una secuencia de
instrucciones constituida por 4 elementos: un cdigo de Representacin cercana al lenguaje objetivo
operacin, dos operando de entrada y otro de salida Mayor sencillez en la traduccin de construcciones
para almacenar el resultado

rbol de anlisis sintctico


Asignacin Cdigo intermedio

ID := E LOAD t0 b t0 b
transformacin LOAD t1 c t1 c
(a)
E * E MUL t2 t1 t0 t2 t1 * t0
STORE t2 a t2 a

ID ID
(b) (c)
a := b * c
a := b * c

Javier Vlez Reyes jvelez@lsi.uned.es


Generacin de cdigo intermedio. Sentencias y expresiones
Generacin de cdigo intermedio en la prctica

Artefactos para la generacin de cdigo intermedio


La generacin de cdigo intermedio se realiza a travs de la definicin de accesos semnticas en los
esquemas de traduccin gramaticales. Para llevar esto a cabo, el framework de desarrollo proporciona
una coleccin de artefactos que conviene conocer

ScopeManager

TypeTable TypeIF

TemporalTable Scope SymbolTable SymbolIF

< uses Create >


IntermediateCodeBuilder Quadruple

OperandIF

Create > Reference to >


LabelFactory Label Variable

Create >
TemporalFactory Temporal Value

Javier Vlez Reyes jvelez@lsi.uned.es


Generacin de cdigo intermedio. Sentencias y expresiones
Generacin de cdigo intermedio en la prctica

Artefactos para la generacin de cdigo intermedio


La generacin de cdigo intermedio se realiza a travs de la definicin de accesos semnticas en los
esquemas de traduccin gramaticales. Para llevar esto a cabo, el framework de desarrollo proporciona
una coleccin de artefactos que conviene conocer

Cudruplas
Las cudruplas son el elemento central de la arquitectura. Representan cada una de las operaciones
atmicas que pueden ser referenciadas dentro del cdigo intermedio para que surtan cierto efecto o
realicen cierto clculo a partir de los operandos
Los objetos de tipo Quadruple se utilizan para
Quadruple
representar operaciones atmicas del cdigo
+ String getOperation () intermedio. Una cuadrupla est formado por un cdigo
+ void setOperation () de operacin, un operando opcional resultado y a lo
sumo dos operandos de entrada tambin opcionales.
+ OperandIF getFirstOperand ()
En efecto, en funcin del tipo de operacin el numero
+ void setFirstOperand (OperandIF o) de operandos puede variar. Puede haber
+ OperandIF getSecondOperand () instrucciones con ningn operando ni resultado, como
+ void setSecondOperand (OperandIF o) HALT. Puede haber otras con un slo operando como
los saltos del tipo BR L. O puede haber instrucciones
+ OperandIF getResult ()
con un resultado y dos operandos como en la suma
+ void setResult (OperandIF o) ADD t3 t1 t2.

Javier Vlez Reyes jvelez@lsi.uned.es


Generacin de cdigo intermedio. Sentencias y expresiones
Generacin de cdigo intermedio en la prctica

Artefactos para la generacin de cdigo intermedio


La generacin de cdigo intermedio se realiza a travs de la definicin de accesos semnticas en los
esquemas de traduccin gramaticales. Para llevar esto a cabo, el framework de desarrollo proporciona
una coleccin de artefactos que conviene conocer

Variables, temporales, valores y etiquetas


Los operandos sobre los que operan las cudruplas son de uno de cuatro tipos: variables, variables
temporales, valores literales enteros y etiquetas. Dentro de la arquitectura existe una clase abierta
para representar cada uno de estos tipos que el alumno debe carcter con atributos

Variable Label

-String name -String name


-ScopeIF scope -ScopeIF scope
-Boolean isGlobal

Temporal Value

-String name -Integer value


-ScopeIF scope
-Integer address

Javier Vlez Reyes jvelez@lsi.uned.es


Generacin de cdigo intermedio. Sentencias y expresiones
Generacin de cdigo intermedio en la prctica

Artefactos para la generacin de cdigo intermedio


La generacin de cdigo intermedio se realiza a travs de la definicin de accesos semnticas en los
esquemas de traduccin gramaticales. Para llevar esto a cabo, el framework de desarrollo proporciona
una coleccin de artefactos que conviene conocer

Tabla de temporales
Los temporales que se van generando a medida que el compilador procesa las expresiones del
lenguaje deben almacenarse en una tabla de temporales asociada a cada mbito. Este es un aspecto
importante para las fases posteriores. El artefacto TemporalTable gestiona los temporales de un
mbito

TemporalTable
Cada tabla de temporales se crea de forma
automtica asociada a un mbito cuando este
-ScopeIF scope es abierto a travs del gestor de mbitos. Por
-List <TemporalIF> temporals tanto existe una tabla de temporales para cada
mbito. La responsabilidad de este artefacto es
+ ScopeIF getScope () gestionar la coleccin de temporales
generados durante el proceso de compilacin
+ TemporalTable (ScopeIF scope)
del bloque sintctico asociado al mbito. Los
+ List <TemporalIF> getTemporals () mtodos addTemporal y getTemporals sirven
+ void addTemporal (TemporalIF temporal) para registrar y tener acceso a los temporales
+ boolean containsTemporal (TemporalIF temporal) respectivamente y son de utilidad en sta y en
las fases posteriores de generacin de cdigo
final

Javier Vlez Reyes jvelez@lsi.uned.es


Generacin de cdigo intermedio. Sentencias y expresiones
Generacin de cdigo intermedio en la prctica

Artefactos para la generacin de cdigo intermedio


La generacin de cdigo intermedio se realiza a travs de la definicin de accesos semnticas en los
esquemas de traduccin gramaticales. Para llevar esto a cabo, el framework de desarrollo proporciona
una coleccin de artefactos que conviene conocer

Factoras de etiquetas y temporales


Aunque la construccin de temporales y etiquetas puede realizarse haciendo uso directo de los
constructores en sendas clases, el framework proporciona dos tipos de factoras cuyo uso para
construir objetos de estas clases resulta recomendable por las ventajas que ello supone

TemporalFactory
La factora de temporales es un artefacto asociado a
un mbito pasado como argumento en el constructor
+ TemporalFactory (ScopeIF scope) que se utiliza para crear temporales. El primer mtodo
+ TemporalIF create (String name) create construye un temporal con nombre propio y lo
+ TemporalIF create () registra automticamente en la tabla de temporales. La
diferencia del segundo create, es que ste mtodo
construye el temporal con un nombre autogenerado
que garantiza la unicidad dentro del mbito

LabelFactory
La factora de etiquetas es un que se utiliza para crear
etiquetas. El primer mtodo create construye una
+ LabelFactory (ScopeIF scope) etiqueta con nombre propio. La diferencia del segundo
+ LabelIF create (String name) create, es que ste mtodo construye la etiqueta con
+ LabelIF create () un nombre autogenerado que garantiza la unicidad

Javier Vlez Reyes jvelez@lsi.uned.es


Generacin de cdigo intermedio. Sentencias y expresiones
Generacin de cdigo intermedio en la prctica

Artefactos para la generacin de cdigo intermedio


La generacin de cdigo intermedio se realiza a travs de la definicin de accesos semnticas en los
esquemas de traduccin gramaticales. Para llevar esto a cabo, el framework de desarrollo proporciona
una coleccin de artefactos que conviene conocer

IntermediateCodeBuilder
La construccin de las cudruplas que componen el cdigo intermedio puede realizarse por
invocacin de sus constructores de clase. No obstante, resulta ms sencillo y econmico utilizar
instancias de IntermediateCodeBuilder para realizar esta labor

IntermediateCodeBuilder
Las operaciones addQuadruple se encargan de
insertar un nuevo cuarteto dentro de la lista
+ void addQuadruple (String op, r) interna de cdigo intermedio. Sin embargo su
+ void addQuadruple (String op, r, o1) semntica depende del tipo y formato de los
+ void addQuadruple (String op, r, o1, o2) operandos
+ void addQuadruple (QuadrupleIF q)
Si es de tipo OperandIF se inserta tal cual
+ void addQuadruples (List <QuiadrupleIF> code)
Si es de tipo int se crea un Value y se inserta
+ List <QuadrupleIF> create ()
Si es de tipo String

Si comienza por L_ se crea Label y se inserta


Primero se instancia el code builder pasndole
Si comienza por T_ se crea Temporal y se inserta
como argumento de constructo el mbito. Despus
se utilizan los mtodos addQuadruple para ir Sino se busca en TSs, se crea Variable y se inserta
acumulando cuartetos internamente. Al finalizar la
accin semntica el cdigo se obtiene invocando el
mtodo create ()

Javier Vlez Reyes jvelez@lsi.uned.es


Generacin de cdigo intermedio. Sentencias y expresiones
Generacin de cdigo intermedio en la prctica

Diseo del lenguaje intermedio


Antes de proceder con la generacin de cdigo intermedio es necesario determinar el juego de
instrucciones (cuartetos) que ser empleado. Estudie para ello el/los lenguajes objetivos finales

Cuarteto Descripcin Cuarteto Descripcin

NOP Nada NOT x y x := !y


ADD x y z x := y + z BR L Salto a L
SUB x y z x := y z BRT x L Si x, salto a L
MUL x y z x := y * z BRF x L Si !x, salto a L
DIV x y z x := y / z INL L Insertar L:
MOD x y z x := y % z MV x y x := y
INC x y x := y + 1 MVP x y x := *y
DEC x y x := y 1 MVA x y x := &y
NEG x y x := y STP x y *x := y
GR x y z x := (y > z) ? 1 : 0 STA x y &x := y
EQ x y z x := (y == z) ? 1 : 0 PUSH x *SP := x ; SP++
LS x y z x := (y < z) ? 1 : 0 POP x x := *SP ; SP --
AND x y z x := y && z CALL f Llamada a funcin f
OR x y z x := y || z RET x Retorno de f con valor x
XOR x y z x := y ^ z HALT Stop

Javier Vlez Reyes jvelez@lsi.uned.es


Generacin de cdigo intermedio. Sentencias y expresiones
Generacin de cdigo intermedio en la prctica

Generacin de cdigo intermedio en Cup


Una vez que conocemos los artefactos proporcionados por el framework para la fase de generacin de
cdigo y diseado un lenguaje de cdigo intermedio apropiado, estamos en disposicin de articular
dicha generacin dentro del esquema de traduccin dirigida por la sintaxis de cup
Expresiones Expresiones
exp ::= exp:e1 MAS exp:e2 {: exp ::= exp:e1 MENOS exp:e2 {: ... :}
Exp e = new Exp(); exp ::= exp:e1 POR exp:e2 {: ... :}
<<comprobacin de tipos de e1 y e2>> ...
ScopeIF scope = scopeManager.getCurrentScope(); exp ::= exp:e1 AND exp:e2 {: ... :}
TemporalFactory tF = new TemporalFactory (scope); exp ::= exp:e1 OR exp:e2 {: ... :}
IntermediateCodeBuilder cb = new Builder (scope) exp ::= NOT exp:e1 {: ...
TemporalIF temp1 = e1.getTemporal (); ScopeIF scope = scopeManager.getCurrentScope();
TemporalIF temp2 = e2.getTemporal (); TemporalFactory tF = new TemporalFactory (scope);
TemporalIF temp = tF.create (); IntermediateCodeBuilder cb = new Builder (scope)
cb.addQuadruples (e1.getCode ()); TemporalIF temp1 = e1.getTemporal ();
cb.addQuadruples (e2.getCode ()); TemporalIF temp = tF.create ();
cb.addQuadruple (ADD, temp, temp1, temp2); cb.addQuadruples (e1.getCode ());
e.setTemporal (temp); cb.addQuadruple (NOT, temp, temp1);
e.setCode (cb.create()); e.setTemporal (temp);
RESULT = e e.setCode (cb.create());
:} RESULT = e :}

Javier Vlez Reyes jvelez@lsi.uned.es


Generacin de cdigo intermedio. Sentencias y expresiones
Generacin de cdigo intermedio en la prctica

Generacin de cdigo intermedio en Cup


Una vez que conocemos los artefactos proporcionados por el framework para la fase de generacin de
cdigo y diseado un lenguaje de cdigo intermedio apropiado, estamos en disposicin de articular
dicha generacin dentro del esquema de traduccin dirigida por la sintaxis de cup
Expresiones Expresiones
exp ::= MENOS exp:e1 {: exp ::= PI exp:e1 PD {:
Exp e = new Exp(); RESULT = e1;
<<comprobacin de tipos de e1 y e2>> :}
ScopeIF scope = scopeManager.getCurrentScope(); exp ::= rNumero:rn {:
TemporalFactory tF = new TemporalFactory (scope); Exp e = new Exp ();
IntermediateCodeBuilder cb = new Builder (scope) Integer value = rn.getValue ();
TemporalIF temp1 = e1.getTemporal (); <<Comprobacin de tipos>>
TemporalIF temp = tF.create (); ScopeIF scope = scopeManager.getCurrentScope();
cb.addQuadruples (e1.getCode ()); TemporalFactory tF = new TemporalFactory (scope);
cb.addQuadruple (NEG, temp, temp1); IntermediateCodeBuilder cb = new Builder (scope);
e.setTemporal (temp); TemporalIF temp = tF.create ();
e.setCode (cb.create()); cb.addQuadruple (MV, temp, value);
RESULT = e; e.setTemp (temp);
:} e.setCode (cb.create ()):
RESULT = e;
:}

Javier Vlez Reyes jvelez@lsi.uned.es


Generacin de cdigo intermedio. Sentencias y expresiones
Generacin de cdigo intermedio en la prctica

Generacin de cdigo intermedio en Cup


Una vez que conocemos los artefactos proporcionados por el framework para la fase de generacin de
cdigo y diseado un lenguaje de cdigo intermedio apropiado, estamos en disposicin de articular
dicha generacin dentro del esquema de traduccin dirigida por la sintaxis de cup
Expresiones Referencias
exp ::= referencia:r {: referencia ::= ID:id {:
Exp e = new Exp (); Referencia r = new Referencia ();
e.setType (r.getType ()); String name = id.getLexema ();
ScopeIF scope = scopeManager.getCurrentScope(); <<Comprobacin de tipos>>
TemporalFactory tF = new TemporalFactory (scope); ScopeIF scope = scopeManager.getCurrentScope();
IntermediateCodeBuilder cb = new Builder (scope); TemporalFactory tF = new TemporalFactory (scope);
TemporalIF rTemp = r.getTemporal (); IntermediateCodeBuilder cb = new Builder (scope);
TemporalIF temp = tF.create (); TemporalIF temp = tF.create ();
cb.addQuadruples (r.getCode ()); SymbolVariable sV = scopeManager.searchSymbol (name);
cb.addQuadruple (MVP, temp, rTemp); Variable var = new Variable (name, sV.getScope ());
e.setTemp (temp); cb.addQuadruple (MVA, temp, var);
e.setCode (cb.create ()): referencia.setTemporal (temp);
RESULT = e; referencia.setCode (cb.create ());
:} RESULT = referencia;
:}

Javier Vlez Reyes jvelez@lsi.uned.es


Generacin de cdigo intermedio. Sentencias y expresiones
Generacin de cdigo intermedio en la prctica

Generacin de cdigo intermedio en Cup


Una vez que conocemos los artefactos proporcionados por el framework para la fase de generacin de
cdigo y diseado un lenguaje de cdigo intermedio apropiado, estamos en disposicin de articular
dicha generacin dentro del esquema de traduccin dirigida por la sintaxis de cup
D3
Referencias a elementos de Arrays V

referencia ::= ID:id {:


i
Referencia r = new Referencia ();
String name = id.getLexema (); j D2
<<Comprobacin de tipos>>
ScopeIF scope = scopeManager.getCurrentScope();
TemporalFactory tF = new TemporalFactory (scope); k
IntermediateCodeBuilder cb = new Builder (scope);
TemporalIF temp = tF.create ();
D1
TemporalIF tempI = tF.create ();
size
cb.addQuadruple (MVA, temp, name); V [i][j][k]
cb.addQuadruple (MV, tempI, 0); t1 := 0
&v + i x (D2 x D3 x size)
referencia.setTemporal (temp);
t2 := t1 x D1 + i
referencia.setTemporalIndex (tempI);
+ j x (D3 x size) = t3 := t2 x D2 + j
referencia.setCode (cb.create ()); + k x size
t4 := t3 x D3 + k
RESULT = referencia;
t5 := &v + t4 x size
:}

Javier Vlez Reyes jvelez@lsi.uned.es


Generacin de cdigo intermedio. Sentencias y expresiones
Generacin de cdigo intermedio en la prctica

Generacin de cdigo intermedio en Cup


Una vez que conocemos los artefactos proporcionados por el framework para la fase de generacin de
cdigo y diseado un lenguaje de cdigo intermedio apropiado, estamos en disposicin de articular
dicha generacin dentro del esquema de traduccin dirigida por la sintaxis de cup
D3
Referencias a elementos de Arrays V

referencia ::= referencia:r CI exp:e CD {:


i
Referencia rn = new Referencia ();
<<comprobacin de tipos>> j D2
TypeIF rType = r.getType();
int rDim = rType.getMax () rType.getMin () + 1;
TemporalFactoryIF tF = new TemporalFactory (scope); k
TemporalIF rTemp = r.getTemporal ();
TemporalIF rTempI = r.getTemporalIndex ();
D1
TemporalIF eTemp = e.getTemporal ();
size
TemporalIF rnTempI = tF.create (); V [i][j][k]
IntermadiateCodeBuilder cb = new Builder (scope); t1 := 0
&v + i x (D2 x D3 x size)
cb.addQuadruples (e.getCode ());
t2 := t1 x D1 + i
cb.addQuadruples (r.getCode ());
+ j x (D3 x size) = t3 := t2 x D2 + j
cb.addQuadruple (MUL, rnTempI, rTempI, rDim); + k x size
t4 := t3 x D3 + k
cb.addQuadruple (ADD, rnTempI, rnTempI, eTemp);
t5 := &v + t4 x size
rn.setType (rType.getBaseType());
rn.setTemporal (rTemp); rn.setTemporalIndex (rnTempI);
r.setCode (cb.create()); RESULT = rn; :}

Javier Vlez Reyes jvelez@lsi.uned.es


Generacin de cdigo intermedio. Sentencias y expresiones
Generacin de cdigo intermedio en la prctica

Generacin de cdigo intermedio en Cup


Una vez que conocemos los artefactos proporcionados por el framework para la fase de generacin de
cdigo y diseado un lenguaje de cdigo intermedio apropiado, estamos en disposicin de articular
dicha generacin dentro del esquema de traduccin dirigida por la sintaxis de cup
D3
Referencias a elementos de Arrays V

exp ::= referencia:r {:


i
Exp e = new Exp ();
<<comprobacin de tipos>> j D2
ScopeIF scope = scopeManager.getCurrentScope ();
TemporalFactoryIF tF = new TemporalFactory (scope);
TemporalIF rTemp = r.getTemporal (); k
TemporalIF rTempI = r.getTemporalIndex ();
TemporalIF eTemp = tF.create ();
D1
TypeIF rType = r.getType();
size
int rSize = rType.getSize (); V [i][j][k]
IntermadiateCodeBuilder cb = new Builder (scope); t1 := 0
&v + i x (D2 x D3 x size)
cb.addQuadruples (r.getCode ());
t2 := t1 x D1 + i
cb.addQuadruple (MUL, eTemp, rTempI, rSize);
+ j x (D3 x size) = t3 := t2 x D2 + j
cb.addQuadruple (ADD, eTemp, eTemp, rTemp); + k x size
t4 := t3 x D3 + k
cb.addQuadruple (MVP, eTemp, eTemp);
t5 := &v + t4 x size
e.setTemporal (eTemp);
e.setCode (cb.create());
RESULT = e; :}

Javier Vlez Reyes jvelez@lsi.uned.es


Generacin de cdigo intermedio. Sentencias y expresiones
Generacin de cdigo intermedio en la prctica

Generacin de cdigo intermedio en Cup


Una vez que conocemos los artefactos proporcionados por el framework para la fase de generacin de
cdigo y diseado un lenguaje de cdigo intermedio apropiado, estamos en disposicin de articular
dicha generacin dentro del esquema de traduccin dirigida por la sintaxis de cup
Referencia a campos de registro Referencia a campos de registro
referencia ::= referencia:r PUNTO ID:id {: expr ::= referencia:r {:
Referencia rn = new Referencia (); Exp e = new Exp ();
String name = id.getLexema (); <<comprobacin de tipos>>
<<comprobacin de tipos>> ScopeIF scope = scopeManager.getCurrentScope ();
ScopeIF scope = scopeManager.getCurrentScope(); TemporalFactoryIF tF = new TemporalFactory (scope);
TemporalFactory tF = new TemporalFactory (scope); TemporalIF rTemp = r.getTemporal ();
TemporalIF rTemp = r.getTemporal (); TemporalIF rTempI = r.getTemporalIndex ();
TemporalIF rTempI = r.getTemporalIndex (); TemporalIF rTempO = r.getTemporalOffset ();
TemporalIF rTempO = tF.create (); TemporalIF eTemp = tF.create ();
IntermediateCodeBuilder cb = new Builder (scope); TypeIF rType = r.getType();
cb.addQuadruples (r.getCode ()); int rSize = rType.getSize ();
TypeRecord rType = r.getType (); IntermadiateCodeBuilder cb = new Builder (scope);
int idOffset = rType.getOffset (name); cb.addQuadruples (r.getCode ());
cb.addQuadruple (MV, rTempO, idOffset); cb.addQuadruple (MUL, eTemp, rTempI, rSize);
rn.setTemporal (rTemp); cb.addQuadruple (ADD, eTemp, eTemp, rTemp);
rn.setTemporalIndex (rTempI); cb.addQuadruple (ADD, eTemp, eTemp, rTempO);
rn.setTemporalOffset (rTempO) ; cb.addQuadruple (MVP, eTemp, eTemp);
rn.serCode (cb.create()); RESULT = rn; :} e.setTemporal (eTemp); e.setCode (cb.create()); RESULT = e; :}

Javier Vlez Reyes jvelez@lsi.uned.es


Generacin de cdigo intermedio. Sentencias y expresiones
Generacin de cdigo intermedio en la prctica

Generacin de cdigo intermedio en Cup


Una vez que conocemos los artefactos proporcionados por el framework para la fase de generacin de
cdigo y diseado un lenguaje de cdigo intermedio apropiado, estamos en disposicin de articular
dicha generacin dentro del esquema de traduccin dirigida por la sintaxis de cup
Sentencia asignacin Sentencia If
sentenciaAsignacion ::= referencia:r IGUAL exp:e {: sentenciaIF ::= IF PI exp:e PD s:s1 ELSE s:s2 {:
SentenciaAsignacion sa = new SAsignacion (); SentenciaIf sIf = new SIf ();
<<comprobacin de tipos>> <<comprobacin de tipos>>
ScopeIF scope = scopeManager.getCurrentScope(); ScopeIF scope = scopeManager.getCurrentScope ();
TemporalFactoryIF tF = new TemporalFactory (scope); LabelFactoryIF lF = new LabelFactory (scope);
TemporalIF eTemp = e.getTemporal (); LabelIF l1 = lF.create ();
TemporalIF rTemp = r.getTemporal (); LabelIF l2 = lF.create ();
TemporalIF rTempI = r.getTemporalIndex (); TemporalIF eTemp = e.getTemporal ();
TemporalIF rTempO = r.getTemporalOffset (); IntermadiateCodeBuilder cb = new Builder (scope);
TemporalIF temp = tF.create (); cb.addQuadruples (e.getCode ());
IntermediateCodeBuilder cb = new Builder (scope); cb.addQuadruple (BRF, eTemp, l1);
cb.addQuadruples (e.getCode ()); cb.addQuadruples (s1.getCode ());
cb.addQuadruples (r.getCode ()); cb.addQuadruple (BR, l2);
cb.addQuadruple (MUL, temp, rTempI, rSize); cb.addQuadruple (INL, l1);
cb.addQuadruple (ADD, temp, temp, rTemp); cb.addQuadruples (s2.getCode ());
cb.addQuadruple (ADD, temp, temp, rTempO); cb.addQuadruple (INL, l2);
cb.addQuadruple (STP, temp, eTemp); sIF.setCode (cb.create ());
sa.setCode (cb.create()); RESULT = sa; :} RESULT = sIF; :}

Javier Vlez Reyes jvelez@lsi.uned.es


Generacin de cdigo intermedio. Sentencias y expresiones
Generacin de cdigo intermedio en la prctica

Generacin de cdigo intermedio en Cup


Una vez que conocemos los artefactos proporcionados por el framework para la fase de generacin de
cdigo y diseado un lenguaje de cdigo intermedio apropiado, estamos en disposicin de articular
dicha generacin dentro del esquema de traduccin dirigida por la sintaxis de cup
Sentencia While Sentencia For
sentenciaWhile ::= WHILE PI exp:e PD s:s1 {: sentenciaFor ::= FOR sAsignacion:sa TO exp:e DO s:s1 {:
SentenciaWhile sWhile = new SWhile (); SentenciaFor sFor = new SFor ();
<<comprobacin de tipos>> <<comprobacin de tipos>>
ScopeIF scope = scopeManager.getCurrentScope (); ScopeIF scope = scopeManager.getCurrentScope ();
LabelFactoryIF lF = new LabelFactory (scope); LabelFactoryIF lF = new LabelFactory (scope);
LabelIF l1 = lF.create (); LabelIF l1 = lF.create ();
LabelIF l2 = lF.create (); LabelIF l2 = lF.create ();
TemporalIF eTemp = e.getTemporal (); TemporalIF eTemp = e.getTemporal ();
IntermadiateCodeBuilder cb = new Builder (scope); IntermadiateCodeBuilder cb = new Builder (scope);
cb.addQuadruple (INL, l1); cb.addQuadruples (sa.getCode ());
cb.addQuadruples (e.getCode ()); cb.addQuadruple (INL, l1);
cb.addQuadruple (BRF, eTemp, l2); cb.addQuadruples (e.getCode ());
cb.addQuadruples (s1.getCode ()); cb.addQuadruple (BRF, eTemp, l2);
cb.addQuadruple (BR, l1); cb.addQuadruples (s1.getCode ());
cb.addQuadruple (INL, l2); cb.addQuadruple (BR, l1);
sWhile.setCode (cb.create ()); cb.addQuadruple (INL, l2);
RESULT = sWhile; :} sFor.setCode (cb.create ());
RESULT = sFor; :}

Javier Vlez Reyes jvelez@lsi.uned.es


Generacin de cdigo intermedio. Sentencias y expresiones
Generacin de cdigo intermedio en la prctica

Desarrollo paso a paso


La fase de generacin de cdigo intermedio requiere de la implementacin de acciones semnticas en
el esquema de traduccin dirigidas a producir un cdigo lineal cercano al cdigo objeto pero
independiente de una arquitectura fsica real. A continuacin se resumen los pasos recomendados para
esta fase
1. Disear un lenguaje intermedio
- Identificar todas las operaciones necesarias y asignarles un acrnimo y semntica
- Tomar como referencia el lenguaje objeto de la arquitectura real
- Comenzar por un juego sencillo e ir refinndolo bajo demanda
2. Implementar las clases necesarias del framework
- Caracterizar mediante atributos los operandos: Variable, Temporal, Label, Value
- Incluir atributos necesarios a cada no terminal (Expresin, Sentencias, Referencias, )
- Considerar revisar la definicin de otros artefactos: TypeIF,
3. Implementar las acciones semnticas que generan cdigo intermedio
- Cdigo intermedio para expresiones, referencias, sentencias
- Incorporar este cdigo al del comprobador de tipos implementado en la fase anterior
4. Probar el cdigo intermedio
- Ejecutar el finalTestCase
- semanticErrorManager.debug en reglas para que imprima el cdigo intermedio generado

Javier Vlez Reyes jvelez@lsi.uned.es


Generacin de cdigo intermedio. Sentencias y expresiones
Bibliografa

Material de estudio
Bibliografa bsica

Construccin de compiladores: principios y prctica


Kenneth C. Louden International Thomson Editores,
2004 ISBN 970-686-299-4

Javier Vlez Reyes jvelez@lsi.uned.es


Generacin de cdigo intermedio. Sentencias y expresiones
Bibliografa

Material de estudio
Bibliografa complementaria

Compiladores: Principios, tcnicas y herramientas.


Segunda Edicin Aho, Lam, Sethi, Ullman
Addison Wesley, Pearson Educacin, Mxico 2008

Diseo de compiladores. A. Garrido, J. Iesta, F. Moreno


y J. Prez. 2002. Edita Universidad de Alicante

Javier Vlez Reyes jvelez@lsi.uned.es

Você também pode gostar