Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Asignatura: (3) Lenguajes y Autómatas II Docente: (4) M. en T.I Brian Antonio Mejía Díaz
Nombre y número de control: (5) Martínez del Razo Areli 213107177
Fecha de entrega: (6) 18/04/2024
Competencia No.: (7) 2 Descripción: (8) Diseña las reglas para traducir el código fuente a un
código intermedio
Indicador de alcance: (9) A. Se adapta a situaciones y contextos complejos.
B. Hace aportaciones a las actividades académicas desarrolladas.
Evidencia de aprendizaje: (10) reporte de investigación
Generación
de código
Intermedio
INTRODUCCIÓN
1.1 PREFIJAS:
La notación prefija, también conocida como notación de prefijo o notación de
prefija, es una notación en lógica, aritmética y álgebra. Su rasgo característico
es que el operador se coloca en el lado izquierdo del operando. Si la paridad del
operador (el número de argumentos necesarios para que dicho operador o
función evalúe) es fija, el resultado es una sintaxis que carece de paréntesis u
otros símbolos de agrupación y aún se puede analizar sin ambigüedades.
La notación infija es una representación común de fórmulas aritméticas y
lógicas en las que los operadores se escriben entre los operandos en los que
operan (p. ej. 2 +2) Utilice el estilo infijo.
1.2 INFIJA:
Una designación común. El orden es primer operando, operador, segundo
operando.
El problema con la notación infija es que el orden de evaluación es ambiguo en
una expresión con múltiples operadores. Por ejemplo, la expresión 8/4/2 se
puede interpretar como (8/4) /2 u 8/ (4/2). Otros símbolos no sufren este
problema.
Para resolver estas ambigüedades, se agregó una nueva regla llamada
precedencia de operadores. Cuando dos operadores compiten por el mismo
operando, gana el operador con mayor precedencia y gana el operador con la
misma precedencia.
1.3 POSFIJA:
En notación Posfija, el operador sigue al operando. Por ejemplo, "2 3"
significa "2 3". Esta notación es particularmente útil para la generación
de código intermedio porque elimina la necesidad de paréntesis y
reglas de precedencia, simplificando así el análisis y la traducción de
expresiones.
La notación postfija pone el operador al final de los dos operandos, por
lo que la expresión queda:
El sufijo ab 5 utiliza una estructura apilada LIFO (ab 5-último-primero
en salir), que es la estructura más utilizada en la implementación.
También conocido como pulido inverso, se utiliza para expresar
expresiones que no requieren paréntesis.
Como sugiere el nombre, se refiere a la posición que ocupa el operador
después del operando.
- La operación de sufijo no es la inversa directa de la operación de
prefijo correspondiente: (A B) *C AB C*
Representaci
ones de
Código
Intermedio
1.1 Notaciones:
1.1 POLACA:
Aritmética Una expresión que suma los números uno y dos se escribe en
notación de prefijo como "1 2" en lugar de "1 2". En expresiones más complejas,
el operador aún precede a su operando, pero el operando en sí puede ser una
expresión no trivial que contenga su propio operador. Por ejemplo, la expresión
está escrita en notación infija tradicional.
(5 - 6) * 7
puede ser escrito en prefijo como
* (- 5 6) 7
o simplemente
*-567
Dado que todos los operadores aritméticos simples son binarios (al menos en
un contexto aritmético), cualquier representación de sus prefijos es inequívoca
y no requiere que se inserten símbolos de agrupación en las expresiones de
prefijo. En el ejemplo anterior, se requieren los corchetes de la versión infija. Si
los movemos:
5 - (6 * 7)
o simplemente los quitamos:
5-6*7
El proceso de resta se retrasa hasta que se hayan leído ambos operandos de
resta (es decir, el producto de 5, 6 y 7). Como ocurre con cualquier notación, la
expresión más interna se evalúa primero, pero en una notación de prefijo este
"interior" se puede expresar mediante secuenciación en lugar de agrupación.
1.2 Notaciones:
1.2 TRIPLOS:
Se han utilizado varias representaciones intermedias a lo largo de la historia de
los compiladores, como la siguiente representación de código intermedio de 3
árboles de direcciones, 2 para los operandos y uno para la ubicación del
resultado.
Esta clase incluye una gran cantidad de representaciones diferentes, entre las
que podemos encontrar cuádruples y triples.
La principal diferencia entre estas notaciones y la notación postfija es que
contienen referencias precisas a los resultados de cálculos intermedios,
mientras que en la notación postfija los resultados están implícitos cuando se
expresan en la pila.
La diferencia entre triples y cuádruples es que para triples el valor intermedio se
refiere al número de tripletas que lo crearon, mientras que para cuádruples
requiere que tengan nombres implícitos. Los triples tienen la ventaja obvia de
ser más consistentes, pero dependen de su ubicación y hacen que los cambios
en el código de optimización sean más complicados.
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
1.1 Notaciones:
1.2 CUADRUPLOS:
Es una estructura tipo registro con cuatros campos que se llaman: Operador
Operando1 Operando2 Resultado Donde operando1, operando2 y resultado
pueden ser constantes, identificadores y variables temporales definidos por el
compilador mientras que operador representa una operación arbitraria.
Los Cuadruplos ayudan en muchas aplicaciones optimizadas, pero necesita un
algoritmo para reutilizar variables temporales (reutilizar registros del
procesador).
Ejemplo:
(A+B)
*(C+D)-E
+, A, B, T1 +
, C, D, T2
*, T1, T2, T3 -,
T3, E, T4
Un cuádruplo es una extensión de la representación triplete que agrega un
campo adicional al resultado de una operación. La forma general de un quad es
(arriba, arg1, arg2, resultado). Esta notación es común en la generación de
código intermedio y es útil para la asignación del bloc de notas y la gestión de
memoria.
CONCLUCION:
Generating intermediate code, symbols and associated
representations is a critical aspect of the program compilation
process. Intermediate code generation involves the creation of
code that is easier to resolve than the original source code, but still
retains the semantics of the program. Symbols (including prefixes,
infixes and suffixes) provide different ways of representing
mathematical or logical expressions, and each has its own
application for generating intermediate code. On the other hand,
intermediate code representations, such as Polish notation, triples
and quadruples, provide structures for representing and
manipulating intermediate code from the original code. In
summary, understanding these concepts is critical to developing
efficient and effective compilers.