El código de tres direcciones es una secuencia de sentencias de la forma general A := B op C , donde A, B, C son nombres definidos por el programador, constantes o nombres temporales generados por el compilador; op representa una operación que se aplica en A, B. En palabras simples, un código que tiene como máximo tres direcciones en una línea se denomina tres códigos de dirección.
Ejemplo:
(a+b)*(a+b+c)
El código de tres direcciones para la expresión anterior es:
t1=a+b t2=t1+c t3=t1*t2
En el diseño de compiladores, la representación de código intermedio más popular es el código de tres direcciones. Es aceptado mundialmente y es el más utilizado. Hay muchas declaraciones de tres direcciones. Todas las declaraciones complejas de tres direcciones son generalmente una combinación de declaraciones de tres direcciones más simples.
Estas declaraciones se incluyen en las siguientes siete categorías y se pueden llamar como bloque de construcción para declaraciones de tres direcciones:
Declaración | Sentido |
---|---|
X = Y en Z | Operación binaria |
X= en Z | Operación unaria |
X = Y | Asignación |
si X(rel op)Y ir a L | Ir a Condicional |
ir a L | Ir a incondicional |
A[i] = X Y= A[i] |
Indexación de array |
P = dirección X Y = *P *P = Z |
Operaciones de puntero |
Ahora, al usar las declaraciones anteriores, convertiremos algunas construcciones populares de alto nivel en código de tres direcciones.
1. Declaración Mientras –
while E do S
Código de tres direcciones:
L:if(E==0) goto L1 S goto L L1:end
2. Para Declaración –
for(E1;E2;E3) do S
Código de tres direcciones:
E1 L:if(E2) goto L1 goto L2 L1:S E3 goto L L2:end
3. Declaración de cambio –
switch(E){ case 1: S1 break; case 2: S2 break; default: S3 }
Código de tres direcciones:
t=E goto test L1:S1 goto Last L2:S2 goto Last L3:S3 goto Last test: if(E==1) goto L1 if(E==2) goto L2 goto L3 Last:end
Por lo tanto, podemos ver que al usar las siete declaraciones podemos replicar declaraciones de un lenguaje de nivel superior en códigos de dirección.