Código Intermedio (TAC)
Código Intermedio (TAC)
El generador traduce el AST validado a TAC (Three-Address Code), una representación lineal de bajo nivel pero independiente de la arquitectura.
¿Por qué TAC?
Es el puente entre código de alto nivel y ensamblador: más simple que el AST, fácil de optimizar y portátil.
Entrada: AST validado → Salida: Secuencia de instrucciones TAC
Estructuras Principales
typedef struct TacInstr {
TacOp op;
char* dest;
char* arg1;
char* arg2;
struct TacInstr* next;
} TacInstr;
typedef struct TacCode {
TacInstr* head;
TacInstr* tail;
int tempCount;
int labelCount;
} TacCode;
Operaciones
typedef enum {
TAC_ADD, TAC_SUB, TAC_MUL, TAC_DIV, TAC_MOD, // Aritméticas
TAC_LT, TAC_GT, TAC_EQ, // Relacionales
TAC_AND, TAC_OR, TAC_NOT, TAC_NEG, // Lógicas
TAC_COPY, // Asignación
TAC_LABEL, TAC_GOTO, TAC_IF_FALSE, // Control de flujo
TAC_PARAM, TAC_CALL, TAC_RETURN, // Funciones
TAC_BEGIN_FUNC, TAC_END_FUNC // Delimitadores
} TacOp;
Ejemplo
Código: integer x = 3 + 5 * 2;
TAC:
t0 = 5 * 2
t1 = 3 + t0
x = t1
Características
- Lineal: Máximo 3 direcciones por instrucción (
dest = arg1 op arg2) - Temporales explícitos:
t0, t1, t2, ...(generados connewTemp()) - Etiquetas:
L0, L1, L2, ...(generadas connewLabel())
Funciones Clave
initTAC(): Inicializa estructura TACemitTAC(): Agrega instrucción a la listagenerateExpr(): Traduce expresiones recursivamentegenerateStmt(): Traduce sentencias (if, while, return, etc.)generateMethod(): Traduce métodos completosprintTAC()/writeTAC(): Imprime código generado
Siguientes Pasos
- Estructura: Tipos de instrucciones
- Generación: Algoritmos de traducción
- Ejemplos: Casos completos
División del Trabajo
- Juani: impementó la generación de código intermedio.
- Santi: se abocó en el desarrollo del analizador semántico, debido a retrasos en el desarrollo.
Problemas Conocidos
No se detectaron problemas en esta fase.
Referencias
Implementación: tac.c, tac.h