You are on page 1of 35

UNIDAD II

GENERACIN DE CDIGO
INTERMEDIO

2.1 NOTACIONES

Notacin prefija

Notacin infija

Notacin posfija
2.1.1 Notacin prefija
Jan Lukasiewicz (Lvov 1878 - Dublin 1956), matemtico polaco, desarroll en 1920
una notacin que permita escribir las operaciones matemticas sin necesidad de
utilizar parntesis a base de situar los operadores antes (prefijo) o despus (sufijo) de
los operandos.
Por ejemplo, la expresin (4+5)/(9*(9-1))-12*((4-1)/2)

En una calculadora algebraica sera: "(", "4", "+", "5", ")", "/", "(", "9", "*", "(", "9",
"-", "1", ")", ")", "-", "1", "2", "*", "(", "(", "4", "-", "1", ")", "/", "2", ")", "=

En total, dicha operacin representa un total de 29 pulsaciones.

4 5+9 9 1-*/12 4 1-2/*-

En total 18 caracteres, unos pocos menos que en la notacin algebraica, pero que nos
habran ahorrado algo de trabajo, al final el resultado es el mismo.
Notacin Polaca
FORMA INTERNA DE PROGRAMA FUENTE
Notacin Polaca
Por ejemplo, la expresin.
(a+b)*(c-d)
se puede escribir en notacin prefija como.
* + a b - c d
y leerse como la multiplicacin de la adicin de a ms b por la diferencia de c
menos d.
Similarmente la expresin puede escribirse en notacin postfija como:
a b + c d - *
Notacin Polaca (Postfija)
Ejemplo:
Operador Prioridad Dentro de la Pila Prioridad Fuera De La Pila
^
*, /, %
+, -
)
3
2
1
0
4
2
1
5
Notacin Prefija Notacin Infija Notacin Postfija
+ A * B C A + B * C A B C * +
FORMA INTERNA DE PROGRAMA FUENTE
Notacin Polaca (Conversin Postfija)
La forma de entenderlo, es comprender el concepto de pila.
Una pila, es un lugar donde se van depositando los datos, de forma que el ltimo en
entrar, es el primero en salir.

Los operadores se mandan directamente a un pila
Cuando se lee un operador se retiene en la pila( pila de operadores). Los
operadores se van poniendo en esta pila sucesivamente hasta encontrar uno
con menor o igual prioridad que el de la cima, en cuyo caso se sacan los que
hubieran en la pila de mayor o igual prioridad y se coloca en ella este ultimo.
El parntesis derecho no se coloca nunca en la pila y cuando aparece hay que
desapilar todos los operadores hasta llegar al parntesis izquierdo y borrar
este. Aunque el parntesis izquierdo tiene la mayor prioridad solo se saca
cuando aparece un parntesis derecho.
FORMA INTERNA DE PROGRAMA FUENTE
Notacin Polaca (Conversin Postfija)
Modo algebraico: nombre que recibe la notacin matemtica utilizada en todas las
calculadoras que no son RPN, donde se introducen ecuaciones matemticas como
sta: 1+3*(3+(2-5)/3). En el modo algebraico, los parntesis y el orden de las
operaciones son muy importantes.

Memoria de pila: una pila (Stack), tambin denominada lista LIFO (ltimo en
entrar, primero en salir), es la base del sistema RPN, ya que es la memoria que
permite al usuario introducir nmeros.

Poner en cola: accin de aadir un nmero al final de una pila, haciendo que
todos los dems elementos suban un nivel.

Extraer: accin de quitar el ltimo nmero que se ha puesto en cola en la
memoria de pila.
FORMA INTERNA DE PROGRAMA FUENTE
CARACTERISTICAS DE RPN:
ahorra tiempo y pulsaciones de teclas.
No debe preocuparse por los parntesis al realizar clculos.
El proceso es parecido a cmo aprendi matemticas escribiendo sobre papel.
Puede ver los resultados intermedios a medida que realiza los clculos en lugar
de ver slo la respuesta al final. Esto resulta extremadamente til.
Un resultado intermedio permite al usuario comprobar los resultados y corregir
los errores con mayor facilidad.
Resulta ms sencillo seguir el proceso del clculo.
El usuario define la prioridad de los operadores.
La notacin RPN es lgica, puesto que el usuario primero proporciona un
nmero y luego indica qu debe hacerse con l.
Notacin Polaca
EJEMPLOS DE NOTACIN PREFIJA
4+3*2-8/2*(8-4+5)



Generacin de Cdigo Intermedio
El cdigo intermedio es una interpretacin de las operaciones
que se tienen en un lenguaje generados para una mquina
virtual, una mquina inexistente pero con las caractersticas que
toda computadora posee.
El cdigo de tres direcciones: que recibe este nombre
porque emplea tres entidades o direcciones para reconocer
los operandos y el resultado de una operacin. Se representa
generalmente como:
Resultado Operando1 Operador Operando2

Cdigo de tres direcciones
El cdigo de tres direcciones es como el lenguaje
ensamblador
Ya que consiste en una secuencia de instrucciones donde cada
una tiene como mximo 3 operndos.
Propiedades:
a) Cada instruccin tiene a lo sumo un operador, adems de la
asignacin. (el compilador decide la prioridad del operador)
b) El compilador debe generar un nombre temporal para guardar los
valores calculados.
c) Aparte de calcular expresiones tambin pueden manejar
construcciones de flujo de control y llamadas a procedimientos
Esto significa que expresiones como (a+3)*(4-5)/2 no
pueden ser operadas como una sola instruccin. la
expresin en expresiones ms sencillas y debemos
auxiliarnos de variables temporales para almacenar
los resultados mientras no los hayamos usado. Para
efectos de notacin, vamos a denotar las variables
temporales con una tn donde n representa un
subndice.
Cdigo de tres direcciones
Suponiendo que no existen las funciones ni las clases. Solo
estamos en un ambiente global con un lenguaje estructurado
y todas las variables son globales:
Cdigo de tres direcciones
Para la expresin x=(a+3)*(4-5)/2 vamos a transformarla a
cdigo de 3 direcciones:
t
1
=a+3;
t
2
=4-5;
t
3
= t
1
* t
2
;
t
4
= t
3
/2
x= t
4
;
t
1:
:= - c
t
2:
:= b * t
1

t
3
:= - c
t
4:
:= b * t
3

t
5:
:= t
2
+

t
4

a := t
5

asigna
a
+
* *
b
minosu
b
minosu
c
c
Ejemplo: a:=b*-c+b*-c

t
1:
:= - c
t
2:
:= b * t
1

t
3
:= t
2
+

t
2

a := t
3

asigna
a +
*
b
minosu
c
Ejemplo: a:=b*-c+b*-c



E->E +T{
E.val=gen_temp();
write(E.val,=,E1.val,+,T.val);
}
|E-T{
E.val=gen_temp();
write(E.val,=,E1.val,-,T.val);
}
|T {E.val=T.val}
T->T*F{
E.val=gen_temp();
write(T.val,=,T1.val,*,F.val);
}
|T/F{
E.val=gen_temp();
write(T.val,=,T1.val,/,F.val);
}
|F{T.val=F.val}
F->(E){F.val=E.val}
|num {F.val=num.val}
|id {F.val=id.val}
Generacin de cdigo de 3 direcciones a partir de un
lenguaje de alto nivel.
Cuadruplo
Un cuadruplo es una estructura tipo registro con cuatro campos, que se
llamarn op, arg1, arg2 y resultado.
Ejemplo
R = A + B * C A B C * +
op arg1 arg2 resultado
* B C T1
+ A T1 T2
= T2 R
Ejemplos de Generacin de C.I.
If (a<b) then x:=9
(<, a,b)
(if_true, t1,etq1)
(goto,etq2, )
(label,etq1, )
(Label, etq2, )
CDIGO P
El cdigo P comenz como un cdigo ensamblador
producido por varios compiladores Pascal en la dcada de
1970 y principios de la de 1980.
Fue diseado para cdigo real para una maquina de pila
hipottica, la idea era hacer que los compiladores de Pascal
se transportaran fcilmente, requiriendo solo que se volviera
a escribir el interprete de la maquina P para una plataforma.
El cdigo P es un cdigo intermedio y sean utilizado varias
extensiones y modificaciones del mismo en diverso
compiladores de cdigo nativo.
CDIGO P
Diseado para ser directamente ejecutable, la
maquina P esta compuesta por una memoria de
cdigo, una memoria de datos no especfica para
variables nombre datos y una pila para datos
temporales, junto como cualquiera registro que sea
necesario para mantener la pila y apoyar la
ejecucin.

El cdigo P es menos compacto que el cdigo de
tres direcciones en trminos de nmeros de
instrucciones
EJEMPLO:
x := y op z

Donde 'x', 'y' y 'z' son nombres, constates o
variables temporales generadas por el
compilador, op representa cualquier valor,
como un operador aritmtico de punto fijo
o flotante, o un operador lgico sobre
datos con valores booleanos.

(2*A)+ (B-3)
La versin de cdigo P para esta expresin es la que se muestra en
seguida:

ldc 2 ; carga la constante 2 (inserta el valor 2 en la pila temporal)
lod a ; carga el valor de la variable a ( variable a en la pila)
mpi ; multiplicacin entera (extrae estos dos valores de la pila, multiplica)
lod b ; carga el valor de la variable b
ldc 3 ; carga la constante 3
sbi ; sustraccin o resta entera (extrae los dos val. superiores de la pila y - )
adi ; adiciona de enteros (extrae los dos valores restantes de la pila)

TIPOS DE CDIGO INTERMEDIO
TIPOS DE CDIGO INTERMEDIO
Acciones
RUTINAS SEMANTICA
El compilador comprueba si el programa fuente sigue tanto las
convenciones sintcticas como las semnticas del lenguaje fuente. A
esta comparacin se le conoce como comprobacin esttica, que a
diferencia de la comprobacin dinmica que se realiza durante la
ejecucin del programa objeto.
Ejemplos de Comprobacin:
Comprobacin de tipos
1. Comprobadores de flujo de control
2. Comprobadores de unicidad
3. Comprobadores relacionadas con nombres
COMPROBADOR DE TIPOS
Un comprobador de tipos se asegura de que el tipo de una
construccin coincida con el previsto en su contexto.
Ubicacin del comprobador de tipos
Analizador
sintctico
Comprobador
De tipos
Generador
de cdigo
intermedio
Generador
de cdigo
intermedio
Cadena de
Componentes
lxicos
rbol

Sintctico
rbol

Sintctico
SISTEMA DE TIPOS
El diseo de un comprobador de tipos para un lenguaje se basa en
informacin acerca de las construcciones sintcticas del lenguaje, la
nocin de tipos y la regla para asignar tipos a las construcciones del
lenguaje.
Ejemplos:
Si ambos operandos de los operadores aritmticos de suma,
sustraccin y multiplicacin son de tipo entero, entonces el resultado
es de tipo entero.
De acuerdo con el ejemplo, se encuentra implcita la idea de que cada
expresin tiene asociado un tipo.
Expresiones de Tipos
Una expresin de tipo es, o bien un tipo bsico o bien se forma
aplicando un operador llamado constructor de tipos a otras
expresiones de tipos.

Los conjuntos de tipos y constructores bsicos dependen del
lenguaje que deba comprobarse.
Sistemas de Tipos
Un sistema de tipos es una serie de reglas para asignar expresiones
de tipos a las distintas partes de un programa.

Un comprobador de tipos implanta un sistema de tipos.

Comprobacin Esttica y Dinmica de Tipos
La comprobacin realizada por un compilador es esttica, mientras
que la comprobacin hecha al ejecutar el programa objeto se denomina
dinmica.

Un sistema de tipos seguro elimina la necesidad de comprobar
dinmicamente errores de tipos ya que permite determinar
estticamente que dichos errores no pueden ocurrir cuando se esta
ejecutando el programa objeto.
Recuperacin de Errores
El sistema de tipos deber hacer algo razonable al encontrar un error.

Como mnimo se informa de la naturaleza y posicin del error.

El comprobador se debe recuperar del error para que pueda
comprobar el resto del programa.

Como el manejo de errores afecta a las reglas de comprobacin de
tipos, tienen que disearse como parte del sistema de tipos desde el
principio.

You might also like