Está en la página 1de 12

2/2

INSTITUTO TECNOLÓGICO SUPERIOR DE

INSTITUTO TECNOLOGICO SUPERIOR DE


MACUSPANA
NOMBRE:

Luis Alberto García Tadeo

ASIGNATURA:

Lenguaje y autómatas II

NUMERO DE CONTROL:

18E40017
Docente:
M.I.D.S. Daniel Álvarez García

SEMESTRE: 7

GRUPO: B

ACTIVIDAD: Reporte de practica u2

TEMA: Generación de código intermedio

Macuspana, Tabasco a 13 de octubre de 2022

Av. Tecnológico S/N, Lerdo de Tejada 1ª Secc. Macuspana, Tabasco. C.P. 86719 Tels. 9363623330 y 9363623323 Ext.
101 e-mail: macuspana@tecnm.mx | direccion@itsmacuspana.edu.mx tecnm.mx | https://macuspana.tecnm.mx
2/2

INSTITUTO TECNOLÓGICO SUPERIOR DE

Representar expresiones mediante código intermedio


2.1 notaciones
Las notaciones sirven de base para expresar sentencias bien definidas. El uso más extendido de
las notaciones sirve para expresar operaciones aritméticas. Las expresiones aritméticas se pueden
expresar de tres formas distintas: infija, prefija y postfija. La diversidad de notaciones
corresponde en que para algunos casos es más sencillo un tipo de notación.
La expresión A + B * C + D se puede reescribir como ((A + (B * C)) + D) para mostrar que la
multiplicación ocurre primero, seguida por la adición que está más a la izquierda. A + B + C + D
se puede escribir como ((A + B) + C) + D) ya que las operaciones de adición se asocian de
izquierda a derecha.
Hay otros dos formatos de expresión muy importantes que, al principio, pueden no parecer obvios.
Considere la expresión infija A + B. ¿Qué pasaría si moviéramos el operador antes de los dos
operandos? La expresión resultante sería + A B. Del mismo modo, podríamos mover el operador
al final. Obtendríamos A B +. Estas expresiones se ven un poco extrañas.

2.1.1 Notación prefija


La notación prefija, también conocida como notación de prefijo o notación prefija, es una forma
de notación para la lógica, la aritmética, y el álgebra. Su característica distintiva es que coloca los
operadores a la izquierda de sus operandos. Si la paridad (es el número de argumentos necesarios
para que dicho operador o función se pueda calcular.) de los operadores es fija, el resultado es una
sintaxis que carece de paréntesis u otros signos de agrupación, y todavía puede ser analizada sin
ambigüedad. La notación de infijo es la notación común de fórmulas aritméticas y lógicas, en la
cual se escriben los operadores entre los operandos en que están actuando (ej. 2 + 2) usando un
estilo de infijo. No es tan simple de analizar (parser, es una de las partes de un
compilador que transforma su entrada en un árbol de derivación.) por las computadoras,
como la notación de prefijo (ej. + 2 2) o la notación de postfijo (ej. 2 2 +), aunque muchos
lenguajes de programación la utilizan debido a su familiaridad. En la notación de infijo, a
diferencia de las notaciones de prefijo o posfijo, es necesario rodear entre paréntesis a los grupos
de operandos y operadores, para indicar el orden en el cual deben ser realizadas las operaciones.
En la ausencia de paréntesis, ciertas reglas de prioridad determinan el orden de las
Av. Tecnológico S/N, Lerdo de Tejada 1ª Secc. Macuspana, Tabasco. C.P. 86719 Tels. 9363623330 y 9363623323 Ext.
101 e-mail: macuspana@tecnm.mx | direccion@itsmacuspana.edu.mx tecnm.mx | https://macuspana.tecnm.mx
2/2

INSTITUTO TECNOLÓGICO SUPERIOR DE


operaciones. La Expresión o Notación PreFija nos indica que el operador va antes de los
operandos sus características principales son: -Los operandos conservan el mismo orden que la
notación infija equivalente. -No requiere de paréntesis para indicar el orden de precedencia de
operadores ya que él es una operación.
-Se evalúa de izquierda a derecha hasta que encontrémosle primer operador seguido
inmediatamente de un par de operandos. -Se evalúa la expresión binaria y el resultado se cambia
como un nuevo operando. Se repite este hasta que nos quede un solo resultado. Notación prefija:
El orden es operador, primer operando, segundo operando

2.1.2 Notación infija


La notación habitual. El orden es primer operando, operador, segundo operando La notación infija
tiene el problema de que en expresiones con más de un operador existe ambigüedad sobre cuál es
el orden de evaluación. Por ejemplo, la expresión 8/4/2 se puede interpretar como (8/4) /2 o bien
como 8/ (4/2). Las otras notaciones no sufren este problema. Para resolver estas ambigüedades, se
añaden unas reglas denominadas orden de precedencia de operadores. Cuando dos operadores
compiten por el mismo operando gana el operador con mayor precedencia, o a igualdad de
precedencia, el operador situado más a la izquierda. Las reglas de precedencia habituales son que
los operadores división y producto tienen igual precedencia y ganan al resto de operadores, y que
los operadores suma y resta tienen igual precedencia y ganan al operador igualdad. Así, la
expresión 8/4/2 se evalúa como (8/4)/2, y 2+3*4 se evalúa como 2+(3*4). Si deseamos
cambiar el orden de evaluación, se pueden agrupar partes de una expresión utilizando paréntesis.
En el resto de las notaciones no es necesario utilizar paréntesis ya que siempre podemos indicar el
orden exacto de evaluación sin que exista ambigüedad.

Av. Tecnológico S/N, Lerdo de Tejada 1ª Secc. Macuspana, Tabasco. C.P. 86719 Tels. 9363623330 y 9363623323 Ext.
101 e-mail: macuspana@tecnm.mx | direccion@itsmacuspana.edu.mx tecnm.mx | https://macuspana.tecnm.mx
2/2

INSTITUTO TECNOLÓGICO SUPERIOR DE


from pythoned.basicas.pila import Pila

def evaluacionNotacionSufija(expresionSufija):
pilaOperandos = Pila()
listaSimbolos = expresionSufija.split()

for simbolo in listaSimbolos:


if simbolo in "0123456789":
pilaOperandos.incluir(int(simbolo))
else:
operando2 = pilaOperandos.extraer()
operando1 = pilaOperandos.extraer()
resultado = hacerAritmetica(simbolo,operando1,operando2)
pilaOperandos.incluir(resultado)
return pilaOperandos.extraer()

def hacerAritmetica(operador, operandoIzquierda, operandoDerecha):


if operador == "*":
return operandoIzquierda * operandoDerecha
elif operador == "/":
return operandoIzquierda / operandoDerecha
elif operador == "+":
return operandoIzquierda + operandoDerecha
else:
return operandoIzquierda - operandoDerecha

print(evaluacionNotacionSufija('7 8 + 3 2 + /'))

Av. Tecnológico S/N, Lerdo de Tejada 1ª Secc. Macuspana, Tabasco. C.P. 86719 Tels. 9363623330 y 9363623323 Ext.
101 e-mail: macuspana@tecnm.mx | direccion@itsmacuspana.edu.mx tecnm.mx | https://macuspana.tecnm.mx
2/2

INSTITUTO TECNOLÓGICO SUPERIOR DE


2.1.3 Notación postfija
La notación postfija pone el operador al final de los dos operandos, por lo que la
expresión queda:

ab+5-La notación postfija utiliza una estructura del tipo LIFO (ab+5-Last First Out) pila, la cual es
la más utilizada para la implementación. Llamada también polaca inversa, se usa para representar
expresiones sin necesidad de paréntesis.
Como su nombre lo indica se refiere a que el operador ocupa la posición después de los
operandos sus características principales son:
 -El orden de los operandos se conserva igual que la expresión infija equivalente no utiliza
paréntesis ya que no es una operación ambigua.
 -La operación posfija no es exactamente lo inverso a la operación prefija equivalente:
(A+B)*C AB+C*
 Notación postfija: El orden es primer operando, segundo operando, operado
2.2 Representación de código intermedio
Existen maneras formales para representar código intermedio. • Estas notaciones simplifican la
traducción de nuestro código fuente a nuestro código objeto ya que ahorran y acotan símbolos de
la tabla de símbolos

2.2.1 Notación polaca


Aritmética La expresión para sumar los números uno y dos, en la notación de prefijo, se escribe "+
1 2" en vez de "1 + 2". En expresiones más complejas, los operadores todavía preceden sus
operandos, pero los operandos pueden ser ellos mismos expresiones no triviales incluyendo sus
propios operadores. Por ejemplo, la expresión que sería escrita en la notación de infijo
convencional como (5 - 6) * 7 puede ser escrito en prefijo como * (- 5 6) 7 o simplemente * - 5 6
7 Puesto que los simples operadores aritméticos son todos binarios (por lo menos, en
contextos aritméticos), cualquier representación prefija de ellos es inequívoca, y poner signos de
agrupamiento a la expresión de prefijo es innecesario. En el ejemplo anterior, los paréntesis en la
versión de infijo eran requeridos. Si los movemo

Av. Tecnológico S/N, Lerdo de Tejada 1ª Secc. Macuspana, Tabasco. C.P. 86719 Tels. 9363623330 y 9363623323 Ext.
101 e-mail: macuspana@tecnm.mx | direccion@itsmacuspana.edu.mx tecnm.mx | https://macuspana.tecnm.mx
2/2

INSTITUTO TECNOLÓGICO SUPERIOR DE


5 - (6 * 7) o simplemente los quitamos: 5 - 6 * 7 cambiaría el significado y el resultado de
toda la expresión. Sin embargo, la versión correspondiente de prefijo de este segundo cálculo
sería escrita como:
- 5 * 6 7 El proceso de la substracción es diferido hasta que ambos operandos de la substracción se
hayan leído (es decir, 5 y el producto de 6 y 7). Como con cualquier notación, las expresiones más
interiores son evaluadas primero, pero en la notación de prefijo este "interioridad" se puede
transportar por el orden en vez del agrupamiento. Orden de las operaciones El orden de
operaciones es definido dentro de la estructura de la notación de prefijo y puede ser fácilmente
determinada. Una cosa a tener presente es que, al ejecutar una operación, la operación es aplicada
AL primer operando POR el segundo operando. Esto no es un problema con las operaciones que
conmutan, pero para las operaciones no conmutativas como la división o la substracción, este
hecho es crucial para análisis de una sentencia. Por ejemplo, la sentencia siguiente: / 10 5 = 2
(prefijo) Se lee como "Divide 10 POR 5". Así la solución es 2, no ½ como sería el resultado de un
análisis incorrecto de dividir 5 entre 10. La notación de prefijo es especialmente popular entre las
operaciones basadas en pila debido a su capacidad natural de distinguir fácilmente el orden de las
operaciones sin la necesidad de paréntesis. Para evaluar el orden de las operaciones bajo la
notación de prefijo, incluso no se necesita memorizar una jerarquía operacional, como con la
notación de infijo. En lugar de eso, se mira directamente a la notación para descubrir qué operador
evaluar primero. Leyendo una expresión de izquierda a derecha, primero se busca un operador y se
procede a buscar dos operandos. Si se encuentra otro operador antes de que se encuentren los dos
operandos, entonces el operador viejo es colocado a un lado hasta que este nuevo operador sea
resuelto. Este proceso se itera hasta que un operador sea resuelto, lo cual debería suceder siempre,
puesto que en una sentencia completa debe haber un operando más que la cantidad de operadores.
Una vez que esté resuelto, el operador y los dos operandos son reemplazados por un nuevo
operando. Puesto que un operador y dos operandos son eliminados y un operando es añadido, hay
una pérdida neta de un operador y un operando, lo cual todavía deja una expresión con N
operadores y N+1 operandos, permitiendo así que el proceso iterativo continúe. Ésta es la teoría
general tras el uso de stacks en lenguajes de programación para evaluar una sentencia en la
notación de prefijo, aunque hay varios algoritmos que manipulan el proceso. Una vez que es
analizada una sentencia en la notación de prefijo, llega a ser menos intimidante mientras
que permite una cierta separación desde la convención con una añadida conveniencia.
Av. Tecnológico S/N, Lerdo de Tejada 1ª Secc. Macuspana, Tabasco. C.P. 86719 Tels. 9363623330 y 9363623323 Ext.
101 e-mail: macuspana@tecnm.mx | direccion@itsmacuspana.edu.mx tecnm.mx | https://macuspana.tecnm.mx
2/2

INSTITUTO TECNOLÓGICO SUPERIOR DE


from pythoned.basicas.pila import Pila

def infija_a_sufija(expresionInfija):
precedencia = {}
precedencia["*"] = 3
precedencia["/"] = 3
precedencia["+"] = 2
precedencia["-"] = 2
precedencia["("] = 1
pilaOperadores = Pila()
listaSufija = []
listaSimbolos = expresionInfija.split()

for simbolo in listaSimbolos:


if simbolo in "ABCDEFGHIJKLMNOPQRSTUVWXYZ" or simbolo in "0123456789":
listaSufija.append(simbolo)
elif simbolo == '(':
pilaOperadores.incluir(simbolo)
elif simbolo == ')':
simboloTope = pilaOperadores.extraer()
while simboloTope != '(':
listaSufija.append(simboloTope)
simboloTope = pilaOperadores.extraer()
else:
while (not pilaOperadores.estaVacia()) and \
(precedencia[pilaOperadores.inspeccionar()] >= \
precedencia[simbolo]):
listaSufija.append(pilaOperadores.extraer())
pilaOperadores.incluir(simbolo)

while not pilaOperadores.estaVacia():


Av. Tecnológico S/N, Lerdo de Tejada 1ª Secc. Macuspana, Tabasco. C.P. 86719 Tels. 9363623330 y 9363623323 Ext.
101 e-mail: macuspana@tecnm.mx | direccion@itsmacuspana.edu.mx tecnm.mx | https://macuspana.tecnm.mx
2/2

INSTITUTO TECNOLÓGICO SUPERIOR DE


listaSufija.append(pilaOperadores.extraer())
return " ".join(listaSufija)

print(infija_a_sufija("A * B + C * D"))
print(infija_a_sufija("( A + B ) * C - ( D - E ) * ( F + G )"))

Av. Tecnológico S/N, Lerdo de Tejada 1ª Secc. Macuspana, Tabasco. C.P. 86719 Tels. 9363623330 y 9363623323 Ext.
101 e-mail: macuspana@tecnm.mx | direccion@itsmacuspana.edu.mx tecnm.mx | https://macuspana.tecnm.mx
2/2

INSTITUTO TECNOLÓGICO SUPERIOR DE


2.2.2 Código P
El código P comenzó como un código ensamblador objetivo estándar producido por varios
compiladores Pascal en la década de 1970 y principios de la de 1980. Fue diseñado para código
real para una máquina de pila hipotética la idea era hacer que los compiladores de Pascal se
transportaran fácilmente requiriendo solo que se volviera a escribir el intérprete de la maquina
P para una plataforma, el código P también a probado ser útil como código intermedio y
sean utilizado varias extensiones y modificaciones del mismo en diversos compiladores de
código nativo, la mayor parte para lenguaje tipo Pascal. Como el código P fue diseñado para
ser directamente ejecutable, contiene una descripción implícita de un ambiente de ejecución
particular que incluye tamaños de datos, además de mucha información específica para la
maquina P, que debe conocer si se desea que un programa de código P se comprensible. La
máquina P está compuesta por una memoria de código, una memoria de datos no específica para
variables nombre das y una pila para datos temporales, junto como cualquiera registro que
sea necesario para mantener la pila y apoyar la ejecución

2.2.3 Triplos
En la historia de los compiladores han sido utilizadas una amplia variedad de
representaciones intermedias como lo es la siguiente clase de representación de código intermedio
de un árbol de 3 direcciones,2 para los operandos y una para la ubicación del resultado. esta clase
incluye un amplio número de representaciones diferentes entre las cuales encontramos cuádruplos
y triples. la principal diferencia entre estas notaciones y la notación postfija es que ellos incluyen
referencias explicitas para los resultados de los cálculos intermedios, mientras que la notación
posfija los resultados son implícitos al representarlos en una pila. La diferencia entre triples y
cuádruplos es que con los triples es referenciado el valor intermedio hacia el número del triple que
lo creo, pero en los cuádruplos requiere que ellos tengan nombres implícitos. Los triples tienen
una ventaja obvia de ser más consistente, pero ellos dependen de su posición, y hacen que la
optimización presente cambios de código mucho más compleja. Para evitar tener que introducir
nombres temporales en la tabla de símbolos, se hace referencia a un valor temporal según la
posición de la proposición que lo calcula. Las propias instrucciones representan el valor del
nombre temporal. La implementación se hace mediante registros de solo tres campos (op, arg1,
arg2). En la notación de tripletes se necesita menor espacio y el compilador no necesita generar los
Av. Tecnológico S/N, Lerdo de Tejada 1ª Secc. Macuspana, Tabasco. C.P. 86719 Tels. 9363623330 y 9363623323 Ext.
101 e-mail: macuspana@tecnm.mx | direccion@itsmacuspana.edu.mx tecnm.mx | https://macuspana.tecnm.mx
2/2

INSTITUTO TECNOLÓGICO SUPERIOR DE


nombres temporales. Sin embargo, en esta notación, trasladar una proposición que defina un valor
temporal exige que se modifiquen todas las referencias a esa proposición. Lo cual supone un
inconveniente a la hora de optimizar el código, pues a menudo es necesario cambiar proposiciones
de lugar. Una forma de solucionar esto consiste en listar las posiciones a las tripletas en lugar de
listar las tripletas mismas. De esta manera, un optimizador podría mover una instrucción
reordenando la lista, sin tener que mover las tripletas en sí. • <Operador>, <operando1>,
<operando2> • El resultado se asocia al número de tripleta Ejemplo:
W * X + (Y + Z) 1. *, W, X 2. +, Y, Z 3. +, (1), (2)
Control de flujo: IF X>Y THEN Z=X ELSE Z=Y+1 1. >, X, Y
Saltar si falso, (1), 5 3. =, Z, X 4. Saltar, 7 5. +, Y, 1 6. =, Z, (5) Problema La optimización supone
mover tripletas y hay que recalcular las referencias

2.2.4 Cuádruplos

Av. Tecnológico S/N, Lerdo de Tejada 1ª Secc. Macuspana, Tabasco. C.P. 86719 Tels. 9363623330 y 9363623323 Ext.
101 e-mail: macuspana@tecnm.mx | direccion@itsmacuspana.edu.mx tecnm.mx | https://macuspana.tecnm.mx
2/2

INSTITUTO TECNOLÓGICO SUPERIOR DE

Punto num 5

Av. Tecnológico S/N, Lerdo de Tejada 1ª Secc. Macuspana, Tabasco. C.P. 86719 Tels. 9363623330 y 9363623323 Ext.
101 e-mail: macuspana@tecnm.mx | direccion@itsmacuspana.edu.mx tecnm.mx | https://macuspana.tecnm.mx
2/2

INSTITUTO TECNOLÓGICO SUPERIOR DE

Punto 6

Av. Tecnológico S/N, Lerdo de Tejada 1ª Secc. Macuspana, Tabasco. C.P. 86719 Tels. 9363623330 y 9363623323 Ext.
101 e-mail: macuspana@tecnm.mx | direccion@itsmacuspana.edu.mx tecnm.mx | https://macuspana.tecnm.mx

También podría gustarte