Los esquemas de generación son diversas estrategias o acciones que deberán realizarse y tomarse en cuenta en el momento de generar código intermedio.
Los esquemas de generación dependen de cada lenguaje. Para fines de mejor comprensión se mostrarán algunos esquemas de generación en lenguaje C.
2.3.1 Variables y constantes.
Las 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.
En esta función se recibe una cadena que representa una línea de código intermedio y
toma las medidas oportunas para que ese código se utilice. Estas medidas pueden ser
escribir la línea en un fichero adecuado, almacenar la instrucción en una lista que después
se pasará a otros módulos, o cualquier otra que necesitemos en nuestro compilador.
Expresiones aritméticas
Son aquellas donde los operadores que intervienen en ella son numéricos, el resultado es un número y los operadores son aritméticos. Los más comunmente utilizados son "+, -, *, /, y %".
Comenzamos el estudio por las expresiones aritméticas. Lo que tendremos que hacer
es crear por cada tipo de nodo un método que genere el código para calcular la expresión y
lo emita. Ese código dejará el resultado en un registro, cuyo nombre devolverá el método
como resultado.
Para reservar estos registros temporales, utilizaremos una funcion, reserva. En pcincipio basta con que esta función devuelva un registro distinto cada vez que se la llame.
Cada nodo generará el código de la siguiente manera:
- Por cada uno de los operandos, llamará al método correspondiente para que se evalúe la sub expresión. Si es necesario, reservará un registro para guardar su resultado.
- Emitirá las instrucciones necesarias para realizar el cálculo a partir de los operandos.
2.3.3 Instrucciones de asignación
La sintaxis general de asignación es:
nombre_de_la_variable = valor
El valor a la derecha del signo igual puede ser una constante, otra variable o una
expresión que combine constantes y variables, pero siempre la variable y su valor deben ser
del mismo tipo de dato.
Ejemplos:
edad% = 5
area! = 12.3
nombre$ = “Pedro”
Instrucciones de asignación compuesta.
Las instrucciones de asignación compuesta realizan primero una operación en una
expresión antes de asignarla a un elemento de programación. En el siguiente ejemplo se
muestra uno de estos operadores, +=, que incrementa el valor de la variable del lado
izquierdo del operador con el valor de la expresión de la derecha.
Una instrucción de asignación asigna el valor de una expresión a una variable. En
general, si la variable que se va a asignar es una propiedad, la propiedad debe ser de lectura
y escritura o de sólo escritura; en caso contrario, se produce un error de compilación. Si la
variable es una variable de sólo lectura, la asignación debe producirse en un constructor Shared o un constructor de instancia apropiado para el tipo de la variable; en caso contrario,
se producirá un error de compilación.
2.3.4 Instrucciones de control.
Esta forma de programación sólo permite resolver problemas sencillos. Para
resolver problemas más 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 instrucción o instrucciones un número determinado de veces. En
éstos casos utilizaremos instrucciones de control iterativas o repetitivas (ciclos). Sentencias
WHILE, DO-WHILE y FOR.
2.3.5 Funciones
Las funciones pueden reducir a en línea, lo que se hace que expandir el código
original de la función.
Las funciones se descomponen simplificando los parámetros de manera individual al
igual que el valor de retorno.
Las Estructuras de Control se emplean para controlar la ejecución y flujo del
código, las cuales se dividen en:
- Estructuras de Selección: son aquellas que se utilizan para realizar operaciones basadas en el valor de una expresión.
- Estructuras de Iteración: son aquellas que nos permiten ejecutar un bloque de código repetidamente mientras una condición específica sea verdadera.
Elaborado por: Andrés Martínez Damián
Obtenido de: Lenguaje y Autómatas II. Unidad VI Generación de Código Intermedio. M.C. Juan
Carlos Olivares Rojas. pág. 1-36. Año 2010.
Generación de código procesador de lenguaje. Lenguaje y autómata II. Universidad
técnica de México pág. 1-28.
http://dsc.itmorelia.edu.mx/~jcolivares/courses/ps207a/ps2_u6.pdf