Sunteți pe pagina 1din 16

23 DE SEPTIEMBRE DE 2016

UNIDAD 2. GENERACIN DE CDIGO


INTERMEDIO
LENGUAJES Y AUTMATAS II

INSTITUTO TECNOLGICO DE TAPACHULA


RUIZ CRUZ JESS
MAYORGA MACARIO JUAN LUIS
LABRAS CASTILLO PHIL
HERNNDEZ CABALLERO JOSAFAT ALEXIS
DE LA PARRA AGUIRRE RICARDO ENRIQUE

2.1 NOTACIONES
Notacin prefija, infija y posfija 1 Consideremos la suma de A y B. Sabemos que
tenemos que aplicar el operador aritmtico + a los operandos A y B. Esta
expresin aritmtica se puede escribir de tres formas:
A+B, notacin infija. Esta es la forma ms comn para representar la
operacin, en donde el operador aritmtico est entre los operandos.
+AB, notacin prefija. El operador aritmtico precede a los operandos.
AB+, notacin posfija. El operador aritmtico sucede a los operandos.
En el caso de la notacin infija, si slo hay un operador involucrado no existe
mayor problema, pero si en la expresin aritmtica hay ms de uno, se necesita
saber cul de los operadores tiene precedencia sobre los dems. Por ejemplo, en
la expresin A+B*C, el operador * tiene precedencia sobre el operador +. Si no
se define la precedencia de los operadores, las expresiones seran ambiguas. La
ventaja de las notaciones prefija y posfija es que no dan pie a ambigedades.
Retomemos el ejemplo anterior. Si consideramos la expresin A+B*C, su notacin
prefija es +*BCA, pero si consideramos (A+B)*C, en prefijo sera *+ABC. En el
caso de la notacin posfija, las expresiones anteriores se escriben como ABC*+ y
AB+C*.
Formada por operandos y operadores: A*B/(A+C).
Los operandos son variables que toman valores enteros o reales.
Operadoes:
Parntesis
Potencia
Multiplicacin / Divisin
Suma / Resta
En caso de igualdad de prioridad:

()
^
*/
+-

Nivel mayor de prioridad

Nivel menor de prioridad

Son evaluados de izquierda a derecha (se evala primero el que primero


4
54
aparece). 5 2 = 2 = 10.
Cuando aparecen varios operadores de potenciacin juntos la expresin se
2
2
evala de derecha a izquierda. 23 = 23 = 29 = 512.
Forma especial en la que se pueden expresar una expresin matemtica en tres
formas:
Prefija: el operador binario es analizado antes que sus operandos.
Infija: el operador binario es analizado entre sus operandos.
Sufija: el operador binario es analizado despus que sus operandos.
2.1.1 Prefija

En 1920 un matemtico de origen polaco, Jan Lukasiewicz, desarroll un sistema


para especificar expresiones matemticas sin parntesis. Esta notacin se conoce
como prefija o polaca (en honor a la nacionalidad de Lukasiewicz). Es una forma
de notacin para la lgica, la aritmtica y lgebra. Nos indica que el operador va
antes de los operandos. Sus caractersticas principales son:
Los operandos conservan el mismo orden que la notacin infija equivalente.
No requiere de parntesis para indicar el orden de precedencia de
operadores ya que l es una operacin.
Se evala de izquierda a derecha hasta que encontremos el primer
operador seguido inmediatamente de un par de operandos.
Se evala la expresin binaria y el resultado se cambia como un nuevo
operando. Ejemplo: a+b-5
+ab-5
Ejemplo. La expresin infija /( + ) se representara en notacin prefija
como: / + .
2.1.2 Infija
Es la forma ms comn que utilizamos para escribir expresiones matemticas,
esta notacin se refiere a que el operador esta entre los operandos.
La notacin infija puede estar completamente parentizada o puede basarse en un
esquema de precedencia de operadores, as como el uso de parntesis para
invalidar los arreglos al expresar el orden de evaluacin de una expresin.
Ejemplo:
3*4=12
3*4+2=14
3*(4+2)=18
2.1.3 Postfija
Llamada tambin polaca inversa es una variacin de la notacin prefija, se usa
para representar expresiones sin necesidad de parntesis, pone el operador al
final de los dos operandos. Ejemplos:
a*b

ab*

a*(b+c/d)

abcd/+*

a*b+c*d

ab*cd*+

Ejemplo:
Si deseamos representar las expresiones (2+(3*4)) = x y ((2+3)*4)= x en las tres
notaciones mencionadas, el resultado sera:
Notacin prefija

[ + ( )] =
= +2 3 4

[( + ) ] =
= +2 3 4

Notacin infija
Notacin postfija

2+34=
2 3 4 + =

(2 + 3) 4 =
23+4 =

2.2- REPRESENTACIN DE CDIGO INTERMEDIO


Existen maneras formales para representar cdigo intermedio; tales como:

Polaca
Cdigo P
Triplos
Cudruplas

Estas notaciones simplifican la traduccin de nuestro cdigo fuente a nuestro cdigo


objeto ya que se ahorran y acotan smbolos de la tabla de smbolos.
2.2.1- POLACA
Se utiliza principalmente para la representacin de expresiones aritmticas.

Simple
No utiliza registros

Expresin a notacin polaca inversa

Algoritmo
Representar la expresin en forma de rbol sintctico.
Recorrer el rbol en postorden.

Ejemplo: a+b*c-d

Figura 1. Ejemplo a b c * + d

Consiste en una forma de escribir expresiones (aritmticas, lgicas o algebraicas)


en la que se colocan los operadores antes que los operando. As, por ejemplo, lo
que en la notacin tradicional (infija) escribiramos como 3+4, Jan Lukasiewicz
decidi escribirlo como +34.
Lejos de ser una decisin caprichosa, la principal ventaja de la notacin polaca es
que no requiere parntesis para escribir cualquier expresin sin ambigedad. Esta
ventaja es lo suficiente grande como para que la empresa HP decidir utilizar una
variante, la notacin polaca inversa, en sus clsicas calculadoras.

Figura 2. Notacin infija y notacin polaca


ENTRADA
El programa leer, de la entrada estndar, un nmero indicando la cantidad de
casos de prueba que tendr que procesar. Cada uno, en una lnea, contendr una
expresin en notacin polaca. Por simplicidad, los nmeros tendrn nicamente un
dgito. Los operadores validos sern suma (+), resta (-), multiplicacin (*) y divisin
(/). El primer operando se proporciona antes que el segundo, y la divisin ser
entera.

Figura 3. Ejemplo de entrada polaca

SALIDA
Para cada caso de prueba el programa deber escribir, en una lnea independiente,
el valor de la expresin. Se garantiza que tanto los resultados parciales como los
nal sern menores que 231 valor absoluto, y nunca habra divisiones por 0.

Figura 4. Ejemplo de salida polaca


2.2.2 CDIGO P
Consideraremos el caso de la generacin del cdigo P en primer lugar, ya que la
gramtica con atributos es ms simple debido a que no es necesario generar
nombres para elementos temporales. Sin embargo, la existencia de asignaciones
incrustadas es un factor que implica complicaciones. En esta situacin deseamos
mantener el valor almacenado como el valor resultante de una expresin de
asignacin, ya que la instruccin de cdigo P estndar esto es destructiva, pues el
valor asignado se pierde. (Con esto el cdigo P muestra sus orgenes de Pascal, en
el cual no existen las asignaciones incrustadas.) Resolvemos es- te problema
introduciendo una instruccin de almacenamiento no destructiva estn en nuestro
cdigo P, la que como la instruccin ato, supone que se encuentra un valor en la
parte superior o tope de la pila y una direccin debajo de la misma; est almacena
el valor en la direccin, pero deja el valor en el tope de la pila, mientras que descarta
la direccin. Con esta nueva instruccin, una gramtica con atributos para un
atributo de cadena de cdigo P se proporciona en la tabla 1. En esa figura utilizamos
el nombre de atributo pcode la cadena de cdigo P. Tambin empleamos dos
notaciones, diferentes para la concatenacin de cadena: + + cuando las
instrucciones van a ser concatenadas con retornos de lnea insertados entre ellas y
// cuando se est construyendo una instruccin simple y se va a insertar un espacio.
Dejamos al lector describir el clculo del atributo pcode en ejemplos individua
mostrar que, por ejemplo, la expresin (x=x+3) +4 tiene ese atributo:
lda x
lod x
ldc 3
adi
stn
ldc 4
adi

Tabla1. Gramtica con atributos de cdigo P tomo


sintetizado

un

atributo de cadena

2.2.3 Triplos
Un triple solo tiene tres campos, a los cuales llamamos op, arg1 y arg2. Al usar
tripletas nos referimos al resultado de una posicin x op y por su posicin, en vez de
usar un nombre temporal implcito. Por ende, en vez del valor temporal t1, una
representacin en tripletas se refera a la posicin (0). Los nmeros entre parntesis
representan apuntadores a la misma estructura de las tripletas
Ejemplo: el rbol sintctico y las tripletas corresponden al cdigo de las tres
dimensiones y los cudruplos. En la representacin en tripletas la instruccin de
copia a= t5 est codificada en la representacin en tripletas, mediante la colocacin
de a en el campo arg1 y (4) en el campo arg2.
Una operacin termina como x[i] = y requiere dos entradas en la estructura de las
tripletas; por ejemplo, podemos colocar a x e i en una tripleta y a y en la siguiente.
De esta manera similar, podemos implementar x = y[i] tratndola como si fuera las
dos instrucciones t = y[i] y x = t,
op

arg1 arg2

menos

menos

(0)

(2)

(1)

(3)

(4)

En donde t es un valor temporal generado por el compilador. Observe que el valor


temporal t en realidad no aparece en un triple, ya que se hace referencia a los
valores temporales mediante su posicin en la estructura de la misma.
En un compilador optimizador podemos ver un beneficio de los cudruples, en
comparacin con las tripletas, en donde las instrucciones se mueven con frecuencia.
Con los cudruples, si movemos una instruccin que calcule un valor temporal t,
entonces las instrucciones que usen a t no requerirn ninguna modificacin. Con las
tripletas, se hace referencia al resultado de una operacin mediante su posicin, por
lo que al mover una instruccin tal vez tengamos rectas.
Las tripletas indirectas consisten en un listado de apuntadores a tripletas, en vez de
ser un listado de las mismas tripletas.
Con las tripletas indirectas, un compilador de optimizacin puede mover una
instruccin reordenando la lista en instruccin sin afectar a las mismas tripletas.
Si se implementa en Java, un arreglo de objetos de instruccin es anlogo a una
representacin en tripletas indirectas, ya que Java trata a los elementos del arreglo
como referencias a objetos.
2.2.4 cudruplos
La descripcin de las instrucciones de tres direcciones especifica los componentes
de cada tipo de instruccin, pero no especifica la representacin de estas
instrucciones en una estructura de datos. En un compilador, estas instrucciones
pueden implementarse como objetos o como registros, con campos para el
operador y los operandos. Tres de estas representaciones se conocen como
cudruplos, tripletas, y tripletas indirectas.
Un cudruplo tiene cuatro campos, a los cuales llamamos op1, arg2, arg3 y resultado.
El campo op contiene un cdigo interno para el operador. Por ejemplo, la instruccin
de tres direcciones x = y + z se representa colocando a + en op, y en arg1, z en arg2

y x en resultado. A continuacin se muestra dos excepciones a esta regla:


1. Las instrucciones con operadores unarios como x = menos y o x = y no utiliza
arg2. Observe que para que esta instruccin de copia como x = y, op es =,
mientras que para la mayora de las otras operaciones, el operador de
asignacin es implcito.
2. Los operadores como param no utilizan arg2 ni resultado.
3. Los saltos condicionales e incondicionales colocan la etiqueta de destino en
resultado.
Ejemplo: el cdigo de tres dimensiones para la asignacin a = b * - c + b * - c. El
operador especial menos se utiliza para distinguir al operador de resta unitario,
como en c, del operador de resta binario, como en b c.

op
0
1
2
3
4
5

menos
*
menos
*
+
=

arg1 arg2 Resultado


c
b
c
b
t2
t5

t1
t3
t4

t1
t2
t3
t4
t5
A

2.3 Esquema de generacin


Los esquemas de generacin son las estrategias o acciones que se debern
realizarse y tomarse en cuenta en el momento de generar cdigo intermedio. Los
esquemas de generacin dependen de cada lenguaje. La figura siguiente muestra
un ejemplo de un esquema de generacin.

La generacin por procedimientos es el mtodo de creacin de datos con algoritmos


en lugar de forma manual. En grficos por computadoras se utiliza comnmente
para la creacin de texturas, mientras que en el contexto de los videojuegos tambin
se utiliza para la creacin de varios tipos de contenido, como artculos, misiones o
geometra de nivel. Las razones ms comunes para el uso de la generacin de
procedimiento incluyen - pero no se limitan a - archivos de menor tamao, mayor
cantidad de contenido que se pueden crear manualmente o la inclusin de
aleatoriedad para experiencias de juego menos predecibles. Tambin se ha
utilizado para otros diversos fines y en otros medios de comunicacin.
Algunos tipos de esquemas son:
Estatus de asignacin: las operaciones de asignacin deben quedar
expresadas por una expresin sencilla, si esta es compleja se deben reducir
hasta quedar un operador sencillo.
Por ejemplo: x=a+b/5; deben quedar de la forma y=b/5; z= a + y; x=z;
Estatutos de ciclos: los ciclos se descomponen en un ciclo genrico, por lo
que ciclos while, for y do-while tienen la misma representacin interna. Todo
queda en forma de while.

Arreglos: los arreglos se descomponen en estructuras bsicas de manejo de


maneras simples.

2.3.1 Variables y Constantes


Las declaraciones de variables y constantes deben separarse de tal manera que
queden las expresiones una por una de manera simple. Por ejemplo int a,b,c; se
descompone a int a; int b; int c; respectivamente.
2.3.2 Expresiones
Para generar expresiones estas deben representarse de manera ms simple y
ms literal para que su conversin sea ms rpida. Por ejemplo, la traduccin de
operaciones aritmticas debe especificarse una por una de tal forma que una
expresin sea lo ms mnimo posible.

2.3.3 Instrucciones de Asignacin


Una instruccin de asignacin (o simplemente asignacin) consiste en asignar el
resultado de la evaluacin de una expresin a una variable.
Las operaciones de asignacin deben quedar expresadas por una expresin
sencilla, si est es compleja se debe reducir hasta quedar un operador sencillo.
Por ejemplo: x = a+b/5;
Debe quedar de la forma

y = b/5;
z = a+y;
x=z.
2.3.4 Instrucciones de control.
Instrucciones de control Esta forma de programacin slo permite resolver
problemas sencillos. Para resolver problemas ms complejos, nos puede interesar
que dependiendo de los valores de los datos, se ejecuten unas instrucciones u otras.
Las instrucciones condicionales nos van a permitir representar ste tipo de
comportamiento. Sentencias IF y SWITCH. En otros casos, nos encontraremos con
la necesidad de repetir una instruccin o instrucciones un nmero determinado de
veces. En stos casos utilizaremos instrucciones de control iterativas o repetitivas
(ciclos). Sentencias WHILE, DO-WHILE y FOR.
2.3.4.1 Sentencia IF-THEN-ELSE
El caso de la sentencia IF es el ms simple. Aqu basta con indicar que la etiqueta
de verdad de la condicin est asociada al cdigo a continuacin del THEN, y la
etiqueta de falso se asocia al cdigo que puede haber tras el ELSE. En cualquier
caso, una vez acabadas las sentencias del THEN se debe producir un salto al final
del IF, porque no queremos que se ejecuten tambin las sentencias del ELSE. Por
tanto, tras la sentencias del THEN, creamos una nueva etiqueta a la cual
produciremos un salto, y colocamos el destino de tal etiqueta al final del cdigo del
IF. Esto puede apreciarse mejor con un ejemplo:

2.3.4.2 Sentencia WHILE


El caso de WHILE y REPEAT es muy similar. En ambos es necesario colocar una
etiqueta al comienzo del bucle, a la que se saltar para repetir cada iteracin. En el
caso de WHILE, a continuacin se genera el cdigo de la condicin, ya que sta
debe evaluarse antes de entrar a ejecutar el cuerpo del bucle. La etiqueta de verdad
se ubica justo antes de las sentencias que componen el cuerpo, que es lo que se
debe ejecutar si la condicin es cierta. Al final de las sentencias se pondr un salto
al inicio del bucle, donde de nuevo se comprobar la condicin. La etiqueta de falso
de la condicin, se ubicar al final de todo lo relacionado con el WHILE, o lo que es
lo mismo, al principio del cdigo generado para las sentencias que siguen al WHILE.
De esta manera, cuando la condicin deje de cumplirse continuar la ejecucin de
la
secuencia de instrucciones que siguen a la sentencia WHILE.
2.3.4.3 Sentencia REPEAT
Recordemos la regla de produccin asociada a la sentencia REPEAT: sent :
REPEAT sent UNTIL cond en la que puede observarse cmo la condicin se evala
tras haber ejecutado, al menos, un ciclo. El cuerpo se ejecutar mientras la
condicin sea falsa, o lo que es lo mismo, hasta que la condicin se cumpla.
Para que el cdigo intermedio generado se comporte de la misma manera, lo ideal
es que la etiqueta de falso de la condicin se coloque al comienzo del cuerpo, y que
la etiqueta de cierto permita continuar el flujo secuencial del programa.
2.3.4.4 Sentencia CASE
La sentencia CASE es la ms compleja de traducir, ya que sta permite un nmero
indeterminado y potencialmente infinito de clusulas CASO en su interior, lo cual
obliga a arrastrar una serie de atributos a medida que se van efectuando
reducciones. El objetivo semntico de esta sentencia es el mismo que el de la
sentencia switch del lenguaje C, slo que no es necesaria una clusula break para
romper el flujo al final de la sentencia asociada a cada caso particular. Por otro lado,
y desde el punto de vista gramatical, no podemos utilizar una nica regla de
produccin para indicar su sintaxis por lo que hay que recurrir a reglasrecursivas a
izquierda y declarar unos cuantos no terminales nuevos.
2.3.5 Funciones
Los requerimientos para las representaciones de cdigo intermedio de Llamadas de
funciones pueden describirse en trminos generales como sigue. En primer lugar,
existen en realidad dos mecanismos que necesitan descripcin: la definicin de
funcin/procedimiento (tambin conocida como declaracin) y la llamada de
funcin/procedimiento. Una definicin crea un nombre de funcin, parmetros y

cdigo, pero la funcin no se ejecuta en ese punto. Una llamada crea valores reales
para los parmetros (o argumentos para la Llamada) y realiza un salto hacia el
cdigo de la funcin, el cual se ejecuta entonces y regresa.
El ambiente de ejecucin en el que sta tiene lugar no se conoce cuando se crea el
cdigo para la funcin, excepto en su estructura general. Este ambiente de
ejecucin es construido en parte por el elemento que llama, y en parte por el cdigo
de la funcin llamada; esta divisin de la responsabilidad forma parte de la
secuencia de llamada estudiada en el captulo anterior.
El cdigo intermedio para una definicin debe incluir una instruccin que marque el
inicio, o punto de entrada, del cdigo para La funcin, y una instruccin que marque
el final, o punto de retorno, de la funcin. De manera esquemtica podemos escribir
esto de la manera siguiente:
Instruccin de entrada
<cdigo para el cuerpo de la funcin>
Instruccin de retorno
De la misma manera, una llamada de funcin debe tener una instruccin que indique
el principio del clculo de los argumentos (en preparacin para la llamada) y luego
una instruccin de llamada red que indique el punto en que los argumentos han sido
construidos y el salto real hacia el cdigo de la funcin puede tener lugar:
Instruccin de comienzo de clculo de argumento
<cdigo para calcular los argumentos>
Instruccin de llamada
Diferentes versiones del cdigo intermedio tienen versiones muy diferentes de estas
cuatro instrucciones agrupadas, en particular respecto a la cantidad de informacin
acerca del ambiente, los parmetros y la funcin misma que es parte de cada
instruccin. Ejemplos tpicos de tal informacin incluyen el nmero, tamao y
ubicacin de los parmetros; el tamao del marco de pila; el tamao de las variables
locales y el espacio temporal, as como diversas indicaciones del uso del registro
por la funcin llamada. Como es habitual, presentaremos cdigo intermedio que
contiene una mnima cantidad de informacin en las instrucciones mismas, con la
idea de que cualquier informacin necesaria puede mantenerse separadamente en
una entrada de la tabla de smbolos para el procedimiento.
2.3.6 Estructuras
Una estructura de datos que representa el programa fuente durante la traduccin
se denomina representacin intermedia, o IR (por las siglas del trmino en ingls)
para abreviar. En este texto hasta ahora hemos usado un rbol sintctico abstracto
como el IR principal. Adems del IR, la principal estructura de datos utilizada durante
la traduccin es la tabla de smbolo.

Aunque un rbol sintctico abstracto es una representacin adecuada del cdigo


fuente, incluso para la generacin de cdigo, no se parece ni remotamente al cdigo
objetivo, en particular en su representacin de construcciones de flujo de control,
donde el cdigo objetivo, como el cdigo de mquina o cdigo ensamblador,
emplean saltos ms que construcciones de alto nivel, como las sentencias if y while.
Por lo tanto, un escritor de compiladores puede desear generar una nueva forma de
representacin intermedia del rbol sintctico que se parezca ms al cdigo objetivo
o reemplace del todo al rbol sintctico mediante una representacin intermedia de
esa clase, y entonces genere cdigo objetivo de esta nueva representacin. Una
representacin intermedia de esta naturaleza que se parece al c6digo objetivo se
denomina cdigo intermedio.
El cdigo intermedio puede tomar muchas formas: existen casi tantos estilos de
cdigo intermedio como compiladores. Sin embargo, todos representan alguna
forma de linealizacin del rbol sintctico, es decir, una representacin del rbol
sintctico en forma secuencial. El &digo intermedio puede ser de muy alto nivel,
representar todas las operaciones de manera casi tan abstracta como un rbol
sintctico, o parecerse mucho ti1 cdigo objetivo. Puede o no utilizar informacin
detallada acerca de la mquina objetivo y el ambiente de ejecucin, corno los
tamaos de los tipos de datos, las ubicaciones de Lis variables y con
responsabilidad de los registros.

BIBLIOGRAFIA

Aho, A.V., Sethi, R., Ullman, J.D. (1990), Compiladores: principios, tcnicas y
herramientas.
Louden, K.C. (1997), Compiler Construction: Principles and Practice.
Barajas, A. and Salgado, J. (2013). Lenguajes y Automatas II. [online] prezi.com.
Available at: https://prezi.com/auqbjglcicxo/lenguajes-y-automatas-ii/
[Accessed 19 Sep. 2016].
Pilas y expresiones aritmticas. (n.d.). Estructura de datos y de la informacin.
[online] Available at: http://quegrande.org/apuntes/EI/1/EDI/teoria/06-07/tad__pila_-_expresiones_aritmeticas.pdf [Accessed 19 Sep. 2016].

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