Sunteți pe pagina 1din 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


La independencia del entorno de ejecucin se
refiere al hecho de que el cdigo intermedio
debe ser agnstico del modelo de organizacin
de memoria, el nmero, tipo y propsito de
registros, etc. Esto implica que todas las
referencias a datos en cdigo intermedio
siguen hacindose a travs de smbolos
registrados o generados durante el proceso de
compilacin

II. Independencia del juego de instrucciones


El cdigo intermedio de un programa es
una abstraccin establecida a travs de un
compromiso de consenso entre los equipos
dedicados al anlisis de lenguajes y los
dedicados a la sntesis. Esto significa que la
coleccin de operadores disponibles en un
cdigo intermedio se debe mantener
independiente y equidistante de cualquier
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

S
WHILE

DO

E > E

WHILE

DO

E > E

LD a t1
LD b t2
GRT t3 t1 t2
BRZ t3 L1

Cdigo final

<WHILE, PR>

Cdigo intermedio

eli hw

Analizador lxico

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

Analizador
semntico

Etapa de sntesis

Analizador sintctico

Etapa de anlisis

0000 0011
0000 0011
0100 0001
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
a := a + 1;

while ( a > b )
a++;

Equipo de Lenguaje

Pascal

Analizador lxico

Analizador lxico

Analizador sintctico

Analizador sintctico

Analizador semntico

Cdigo intermedio

arquitectura

Equipo de

Cdigo intermedio
LD a t1
LD b t2
GRT t3 t1 t2
BRZ t3 L1

Cdigo
intermedio

Analizador semntico

Intel

Optimizacin Cdigo
intermedio
Cdigo final

Solaris

Optimizacin Cdigo
intermedio
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

Lenguajes intermedios

Las representaciones jerrquicas de


cdigo intermedio reflejan los programas
de un lenguaje como una estructura
relacional de nodos y arcos entre nodos.
Estas representaciones son aconsejables
para tareas de anlisis y transformacin
pero no para sintetizar ejecutables en una
arquitectura fsica real

II. Representaciones lineales


Las representaciones lineales de cdigo
intermedio codifican un programa como
una secuencia de instrucciones de bajo
nivel abstractas prximas al lenguaje
ensamblador. Este tipo de lenguajes
resultan ms apropiados para la etapa de
sntesis puesto que se encuentran ms
cercanas a la estructura tpica los
lenguajes objetivos ms comunes

I.I Arboles sintcticos abstractos


Son una representacin similar a los rboles de
anlisis sintcticos donde los artefactos
semnticamente superfluos se omiten y los no
terminales se sustituyen por operadores

I.I Grafos dirigidos acclicos


Cuando los nodos de un rbol sintctico
abstracto son referenciados por ms de un
padre surgen los grafos dirigidos acclicos

II.I Lenguajes de tercetos o tripletas


En los lenguajes de tercetos cada operacin
tiene hasta dos operandos de entrada y uno de
salida que se sobrescribe sobre alguno de los
de entrada

I. Representaciones jerrquicas

Foco de
atencin

II.II Lenguajes de cuartetos o cudruplas


En los lenguajes de cuartetos cada operacin
tiene hasta 2 operandos de entrada y uno
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
cdigo fuente de un programa de acuerdo a una
estructura jerrquica de forma similar a como lo haces
los rboles de anlisis sintctico. En estas
representaciones no obstante se omiten todos tipo de
smbolos semnticamente superfluos y se eliden los no
terminales que dan informacin sobre el proceso de
derivacin gramatical
rbol de anlisis sintctico

>

while (a>b) do a++

Apto para procesos de transformacin


Inadecuado para la etapa de sntesis
Representacin excesivamente abstracta

Cdigo intermedio

SWhile
WHILE

Apto para anlisis semntico

transformacin

DO

WHILE

>
ID

++
ID

ID

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
representacin del cdigo fuente en forma de grafo. El
mtodo constructivo es similar al de los rboles
sintcticos con la diferencia de que aqu se reutilizan
los nodos que reflejen la misma estructura n aras a
resultar ms eficiente su representacin en memoria
rbol de anlisis sintctico

Apto para anlisis semntico


Apto para procesos de transformacin
Inadecuado para la etapa de sntesis
Representacin excesivamente abstracta

Cdigo intermedio

Asignacin
:=

ID

E
E

:=

transformacin

+
E

a := b * c + b * c

ID

E
E

*
E

ID

ID

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


cdigo intermedio utilizan operandos que
representan valores literales enteros con o sin
signo. La fase de traduccin a cdigo final se
encarga posteriormente de traducir esos
valores a la representacin numrica
correspondiente utilizada por la arquitectura

Muchos de los smbolos declarados por el


programador,
tales
como
constantes,
variables globales o locales y parmetros,
son referidos de forma general dentro del
cdigo intermedio como operandos de tipo
variable

Los

valores

literales

utilizados

operandos en las operaciones

como
de los

Las

variables

representan

las

de

cdigo

constantes,

intermedio
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


requiere del almacenamiento temporal de los
resultados parciales de las subexpresiones en
espacios
de
memoria
especficamente
reservados para ello. Los elementos de cdigo
intermedio que se utilizan para referencias esas
direcciones se llaman variables temporales

Muchas de las sentencias de un lenguaje de


alto nivel (control de flujo, invocacin de
subprogramas, etc.) requieren insertar
etiquetas en el cdigo final para luego realizar
saltos a ellas. La forma de referirse a estas
etiquetas en cdigo intermedio es mediante
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
tercetos estn formados por una secuencia de
instrucciones constituida por 3 elementos: un cdigo de
operacin, un operando de entrada y otro de entrada y
salida para almacenar el resultado

ADD
Cdigo de operacin
El cdigo de operacin es un
acrnimo que representa el tipo
de operacin que se aplican
entre los operandos del terceto

Apto para la etapa de sntesis


Representacin cercana al lenguaje objetivo
Complejidad en la traduccin de construcciones
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
ejecucin
Operandos
Los operandos identifican los elementos
sobre los que se efecta la operacin
referida por el cdigo de operacin.
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
tercetos estn formados por una secuencia de
instrucciones constituida por 3 elementos: un cdigo de
operacin, un operando de entrada y otro de entrada y
salida para almacenar el resultado

Apto para la etapa de sntesis


Representacin cercana al lenguaje objetivo
Complejidad en la traduccin de construcciones

rbol de anlisis sintctico


Asignacin
:=

ID
(a)
E
ID
(b)

a := b * c

Cdigo intermedio
E
*

transformacin

E
ID
(c)

LOAD t0 b
LOAD t1 c
MUL t1 t0
STORE t1 a

t0
t1
t1
t1

b
c
t1 * t0
a

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
cuartetos estn formados por una secuencia de
instrucciones constituida por 4 elementos: un cdigo de
operacin, dos operando de entrada y otro de salida
para almacenar el resultado

ADD
Cdigo de operacin
El cdigo de operacin es un
acrnimo que representa el tipo
de operacin que se aplican
entre los operandos del terceto

Apto para la etapa de sntesis


Representacin cercana al lenguaje objetivo
Mayor sencillez en la traduccin de construcciones
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
tras la ejecucin de la operacin
Operandos
Los operandos identifican los elementos
sobre los que se efecta la operacin
referida por el cdigo de operacin.
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
cuartetos estn formados por una secuencia de
instrucciones constituida por 4 elementos: un cdigo de
operacin, dos operando de entrada y otro de salida
para almacenar el resultado

Apto para la etapa de sntesis


Representacin cercana al lenguaje objetivo
Mayor sencillez en la traduccin de construcciones

rbol de anlisis sintctico


Asignacin
:=

ID
(a)
E
ID
(b)

a := b * c

Cdigo intermedio
E
*

transformacin

E
ID
(c)

LOAD t0 b
LOAD t1 c
MUL t2 t1 t0
STORE t2 a

t0
t1
t2
t2

b
c
t1 * t0
a

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
TemporalTable

< uses

IntermediateCodeBuilder

Scope

Create >

SymbolTable

TypeIF

SymbolIF

Quadruple

OperandIF

LabelFactory
TemporalFactory

Create >
Create >

Label

Variable

Temporal

Value

Reference to >

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

+ String getOperation ()
+ void setOperation ()
+ OperandIF getFirstOperand ()
+ void setFirstOperand (OperandIF o)
+ OperandIF getSecondOperand ()
+ void setSecondOperand (OperandIF o)
+ OperandIF getResult ()
+ void setResult (OperandIF o)

Quadruple

Los objetos de tipo Quadruple se utilizan para


representar operaciones atmicas del cdigo
intermedio. Una cuadrupla est formado por un cdigo
de operacin, un operando opcional resultado y a lo
sumo dos operandos de entrada tambin opcionales.
En efecto, en funcin del tipo de operacin el numero
de operandos
puede
variar. Puede haber
instrucciones con ningn operando ni resultado, como
HALT. Puede haber otras con un slo operando como
los saltos del tipo BR L. O puede haber instrucciones
con un resultado y dos operandos como en la suma
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
-String name

Value
-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

-ScopeIF scope
-List <TemporalIF> temporals
+ ScopeIF getScope ()
+ TemporalTable (ScopeIF scope)
+ List <TemporalIF> getTemporals ()
+ void addTemporal (TemporalIF temporal)
+ boolean containsTemporal (TemporalIF temporal)

TemporalTable

Cada tabla de temporales se crea de forma


automtica asociada a un mbito cuando este
es abierto a travs del gestor de mbitos. Por
tanto existe una tabla de temporales para cada
mbito. La responsabilidad de este artefacto es
gestionar
la
coleccin
de
temporales
generados durante el proceso de compilacin
del bloque sintctico asociado al mbito. Los
mtodos addTemporal y getTemporals sirven
para registrar y tener acceso a los temporales
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

La factora de temporales es un artefacto asociado a


un mbito pasado como argumento en el constructor
que se utiliza para crear temporales. El primer mtodo
create construye un temporal con nombre propio y lo
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

TemporalFactory

La factora de etiquetas es un que se utiliza para crear


etiquetas. El primer mtodo create construye una
etiqueta con nombre propio. La diferencia del segundo
create, es que ste mtodo construye la etiqueta con
un nombre autogenerado que garantiza la unicidad

+ TemporalFactory (ScopeIF scope)


+ TemporalIF create (String name)
+ TemporalIF create ()

LabelFactory
+ LabelFactory (ScopeIF scope)
+ LabelIF create (String name)
+ LabelIF create ()

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

+ void addQuadruple (String op, r)


+ void addQuadruple (String op, r, o1)
+ void addQuadruple (String op, r, o1, o2)
+ void addQuadruple (QuadrupleIF q)
+ void addQuadruples (List <QuiadrupleIF> code)
+ List <QuadrupleIF> create ()

IntermediateCodeBuilder

Las operaciones addQuadruple se encargan de


insertar un nuevo cuarteto dentro de la lista
interna de cdigo intermedio. Sin embargo su
semntica depende del tipo y formato de los
operandos
Si es de tipo OperandIF se inserta tal cual
Si es de tipo int se crea un Value y se inserta

Si es de tipo String
Primero se instancia el code builder pasndole
como argumento de constructo el mbito. Despus
se utilizan los mtodos addQuadruple para ir
acumulando cuartetos internamente. Al finalizar la
accin semntica el cdigo se obtiene invocando el
mtodo create ()

Si comienza por L_ se crea Label y se inserta


Si comienza por T_ se crea Temporal y se inserta
Sino se busca en TSs, se crea Variable y se inserta

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

NOP

Cuarteto

Nada

NOT

Descripcin
x := !y

ADD

x := y + z

BR

SUB

x := y z

BRT

Si x, salto a L

MUL

x := y * z

BRF

Si !x, salto a L

DIV

x := y / z

INL

MOD

x := y % z

MV

:= y

INC

x := y + 1

MVP

:= *y

DEC

x := y 1

MVA

:= &y

NEG

x := y

STP

*x := y

GR

x := (y > z)

STA

&x := y

EQ

x := (y == z) ? 1 : 0

PUSH

*SP := x ; SP++

LS

x := (y < z)

POP

x := *SP ; SP --

AND

x := y && z

CALL f

Llamada a funcin f

OR

x := y || z

RET x

Retorno de f con valor x

XOR

x := y ^ z

HALT

Stop

? 1 : 0
? 1 : 0

Salto a L

Insertar L:

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

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

{: ... :}

IntermediateCodeBuilder cb = new Builder (scope)

exp ::= NOT exp:e1 {: ...

exp ::= exp:e1 MAS exp:e2 {:

:}

Expresiones

exp:e2

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
exp ::= MENOS exp:e1 {:

Expresiones
exp ::= PI exp:e1 PD {:
RESULT = e1;

Exp e = new Exp();


<<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
exp ::= referencia:r {:

Referencias
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

referencia ::= ID:id {:


Referencia r = new Referencia ();
String name = id.getLexema ();

D3

Referencias a elementos de Arrays


i

D2

<<Comprobacin de tipos>>
ScopeIF scope = scopeManager.getCurrentScope();

TemporalFactory tF = new TemporalFactory (scope);


IntermediateCodeBuilder cb = new Builder (scope);
TemporalIF temp = tF.create ();

D1

TemporalIF tempI = tF.create ();


cb.addQuadruple (MVA, temp, name);
cb.addQuadruple (MV, tempI, 0);
referencia.setTemporal (temp);

V [i][j][k]
t1 := 0

&v + i x (D2 x D3 x size)

referencia.setTemporalIndex (tempI);

+ j x (D3 x size)

referencia.setCode (cb.create ());

+ k x size

RESULT = referencia;
:}

size

t2 := t1 x D1 + i
t3 := t2 x D2 + j
t4 := t3 x D3 + k
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

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

Referencia rn = new Referencia ();

<<comprobacin de tipos>>
TypeIF

D3

Referencias a elementos de Arrays

D2

rType = r.getType();

int rDim = rType.getMax () rType.getMin () + 1;

TemporalFactoryIF tF = new TemporalFactory (scope);


TemporalIF rTemp = r.getTemporal ();
TemporalIF rTempI = r.getTemporalIndex ();

D1

TemporalIF eTemp = e.getTemporal ();


TemporalIF rnTempI = tF.create ();
IntermadiateCodeBuilder cb = new Builder (scope);
cb.addQuadruples (e.getCode ());

size

V [i][j][k]
t1 := 0

&v + i x (D2 x D3 x size)

cb.addQuadruples (r.getCode ());

+ j x (D3 x size)

cb.addQuadruple (MUL, rnTempI, rTempI, rDim);

+ k x size

cb.addQuadruple (ADD, rnTempI, rnTempI, eTemp);


rn.setType (rType.getBaseType());

t2 := t1 x D1 + i
t3 := t2 x D2 + j
t4 := t3 x D3 + k
t5 := &v + t4 x size

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

exp ::= referencia:r {:


Exp e = new Exp ();
<<comprobacin de tipos>>

D3

Referencias a elementos de Arrays


i

D2

ScopeIF scope = scopeManager.getCurrentScope ();


TemporalFactoryIF tF = new TemporalFactory (scope);

TemporalIF rTemp = r.getTemporal ();


TemporalIF rTempI = r.getTemporalIndex ();
TemporalIF eTemp = tF.create ();
TypeIF

D1

rType = r.getType();

int rSize = rType.getSize ();


IntermadiateCodeBuilder cb = new Builder (scope);
cb.addQuadruples (r.getCode ());

size

V [i][j][k]

cb.addQuadruple (MUL, eTemp, rTempI, rSize);

+ j x (D3 x size)

cb.addQuadruple (ADD, eTemp, eTemp, rTemp);

+ k x size

cb.addQuadruple (MVP, eTemp, eTemp);


e.setTemporal (eTemp);

t1 := 0

&v + i x (D2 x D3 x size)

t2 := t1 x D1 + i
t3 := t2 x D2 + j
t4 := t3 x D3 + k
t5 := &v + t4 x size

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 ::= referencia:r PUNTO ID:id {:

Referencia a campos de registro


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

cb.addQuadruples (r.getCode ());

int rSize = rType.getSize ();

TypeRecord rType = r.getType ();

IntermadiateCodeBuilder cb = new Builder (scope);

int idOffset = rType.getOffset

(name);

rType = r.getType();

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
sentenciaAsignacion ::= referencia:r IGUAL exp:e {:

Sentencia If
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
sentenciaWhile ::= WHILE PI exp:e PD s:s1 {:

Sentencia For
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

S-ar putea să vă placă și