Ejemplos de TAC
Ejemplos de Traducción TAC
Ejemplo 1: Función Simple
Código:
program {
integer suma(integer a, integer b) {
return a + b;
}
void main() {
integer y;
y = suma(5, 10);
}
}
TAC:
┌─ func suma
t0 = a + b
return t0
└─ endfunc suma
┌─ func main
param 5
param 10
t1 = call suma
y = t1
└─ endfunc main
Ejemplo 2: If-Else
Código:
program {
void main() {
integer x = 5;
if (x < 10) {
x = x + 1;
} else {
x = x - 1;
}
}
}
TAC:
┌─ func main
x = 5
t0 = x < 10
if !t0 goto L0
t1 = x + 1
x = t1
goto L1
L0:
t2 = x - 1
x = t2
L1:
└─ endfunc main
if !t0 salta al else si la condición es falsa.
Ejemplo 3: While
Código:
program {
void main() {
integer i = 0;
while (i < 10) {
i = i + 1;
}
}
}
TAC:
┌─ func main
i = 0
L0:
t0 = i < 10
if !t0 goto L1
t1 = i + 1
i = t1
goto L0
L1:
└─ endfunc main
Ejemplo 4: Expresión Compleja
Código:
program {
void main() {
integer resultado = (3 + 5) * 2 - 8 / 4;
}
}
TAC:
┌─ func main
t0 = 3 + 5
t1 = t0 * 2
t2 = 8 / 4
t3 = t1 - t2
resultado = t3
└─ endfunc main
Ejemplo 5: Factorial Recursivo
Código:
program {
integer factorial(integer n) {
if (n <= 1) {
return 1;
} else {
return n * factorial(n - 1);
}
}
}
TAC:
┌─ func factorial
t0 = n <= 1
if !t0 goto L0
return 1
goto L1
L0:
t1 = n - 1
param t1
t2 = call factorial
t3 = n * t2
return t3
L1:
└─ endfunc factorial
Ejemplo 6: Expresiones Lógicas
Código:
program {
void main() {
boolean a;
boolean b;
boolean resultado;
resultado = (a && b) || !a;
}
}
TAC:
┌─ func main
t0 = a && b
t1 = !a
t2 = t0 || t1
resultado = t2
└─ endfunc main
Ejemplo 7: Llamadas Anidadas
Código:
program {
integer multiplica(integer x, integer y) {
return x * y;
}
integer suma(integer a, integer b) {
return a + b;
}
void main() {
integer resultado;
resultado = suma(multiplica(2, 3), 5);
}
}
TAC:
┌─ func multiplica
t0 = x * y
return t0
└─ endfunc multiplica
┌─ func suma
t1 = a + b
return t1
└─ endfunc suma
┌─ func main
param 2
param 3
t2 = call multiplica
param t2
param 5
t3 = call suma
resultado = t3
└─ endfunc main
Los argumentos se evalúan antes de la llamada.
Comparación: AST vs TAC
Código: x = 3 + 5 * 2
AST (jerárquico):
ASSIGNMENT
├── TERM 'x'
└── OPERATOR +
├── TERM 3
└── OPERATOR *
├── TERM 5
└── TERM 2
TAC (lineal):
t0 = 5 * 2
t1 = 3 + t0
x = t1
Ventajas
- Secuencia lineal
- Temporales explícitos
- Fácil de optimizar.
Referencias
Generación · Estructura · tac.c