Vous êtes sur la page 1sur 5

LABORATORIO COMPILADORES 2 HOJA DE TRABAJO # 41 Cdigo Tres Direcciones

Seccin: A

Guatemala 10 de marzo de 2013

Marilyn Xiomara Abigail Lainez Gonzlez

200915576

1. EJEMPLO DEL FOR CON IF ANIDADO: For id = E1 to E2 do IF cond1 then sent1 elseif cond2 then sent2 else sent_else end for CODIGO EN TRES DIRECCIONES
//Inicio del cdigo de tres direcciones del ciclo For

Codigo_E1 Id=E1_val Lcond: if id>E2_val then goto L1


//Se tomo que el for tiene como sentencia el if anidado, por lo que el siguiente es el cdigo tres direcciones del if anidado.

Codigo_Cond1 Lv1: cdigo_sent1 goto Lfinal Lf1: codigo_cond2 Lv2: cdigo_cond3 goto Lfinal Lf2: cdigo_sent_else
//Termina el IF anidado, suma uno al valor del id y regresa al ciclo for, para verificar si no se ha pasado la condicin del id, si es mayor al valor de E2 sale del ciclo for.

Lfinal:

Id = id+1 goto Lcond

L1:

//id, representa una variable, en el codigo 3D, tomara E.val; el cual puede ser una variable temporal, una variable declarada o un valor como tal.

//Gramatica que genera cdigo tres direcciones para un ciclo for.

FOR for id = E1 Write( id, =, E1.val )


FOR.cond = genera_etiqueta() Write(FOR.cond, :)

to E2 FOR.fin = genera_etiqueta()

Write (if, id, > E2.val, then goto, FOR.fin);

do SENT end for

Write( id, =, id, +1 ); Write(goto , FOR.cond); Write (FOR.fin, :)

//estas son todas las posibles sentencias que pueden venir en un for, pero en este caso se esta tomando el if anidado que solicita el ejercicio.

SENT IF | CASE | DO | IFE;

//Gramatica que genera cdigo tres direcciones para un if anidado, que se determino que finalizara con un else.

IF if COND

Write(COND.true, :)

SENT

IF.fin = genera_etiqueta(); Write(goto ,IF.fin); Write(COND.false, :); ELSES.fin = IF.fin;

ELSES else SENT

{ Write(IF.fin, :); }

//lista de los N elseif que pueden venir en un IF.

ELSES { ELSES1.fin =ELSES.fin; } ELSES1 elseif COND {Write(COND.true, :)} SENT


Write(goto ,ELSES.fin); Write(COND.false, :); Write(goto ,ELSES.fin); Write(COND.false, :);

| elseif COND {Write(COND.true, :)}

SENT;

2. EJEMPLO DEL WHILE CON CASE WHILE cond CASE E Val1: SENT1 break; Val2: SENT2 break; Default: SENT_default End case End while CODIGO EN TRES DIRECCIONES Lwhile: cdigo_cond Lv: cdigo_E If Eval = val1 then goto L1 goto L2 L1: cdigo_SENT1 goto Lsalida L2: if EVAL= val2 then goto L3 goto L4 L3: codigo_SENT2 goto Lsalida L4: codigo_SENT_default Lsalida: goto Lwhile Lf: //Se toma la produccin SENT del ejemplo anterior, el cual pude generar distintas sentencias posibles. //Se genera el atributo WHILE.ini para tomar la etiqueta de inicio, y regresar hasta que la condicion no se se cumpla. WHILE while WHILE.ini = genera_etiqueta(); Write (WHILE.ini, :); COND { write(COND.true, :)}

SENT { write( goto, WHILE.ini,); end while write( COND.false, :); }

//El CASE siguiente tiene una salida de escape al final de cada opcin del case, se tomo de esta forma, ya que no se estableci una estructura para case. //Siendo de otra forma en la gramatica debe implementarse una pila para definir si las sentencias que vienen estn o no dentro del case, y el break es valido. CASE case E { LP.val = E.val } LP default : SENT end case Write(LP.fin, :)

LP {LP1 .val = LP.VAL } LP num : LP.true = generar_etiqueta();


LP.false = generar_etiqueta(); Write ( if, num, = LP.val, then goto, LP.true) Write (goto, LP.false);

Write (LP.true, :);

SENT break;

LP.fin = LP1.fin; Write(goto , LP1.fin); Write(LP.false, :);

| num:

LP.true = generar_etiqueta(); LP.false = generar_etiqueta(); Write ( if, num, = LP.val, then goto, LP.true) Write (goto, LP.false);

SENT break;

LP.fin = generar_etiqueta(); Write(goto , LP.fin); Write(LP.false, :);

Write (LP.true, :);

3. DO UNTIL CON UN IF-ELSE Do If cond then SENT_verdadera Else SENT_false while COND CODIGO EN TRES DIRECCIONES //El siguiente Do-While, se sale del ciclo cuando la condicin no se cumpla, pero tomando en cuenta que se ejecutan las sentencias como mnimo una vez. Lsent: Codigo_cond_if Lv: cdigo_sent_verdadera Goto Lsalida Lf: cdigo_sent_falsa

Lsalida: Cdigo_cond_dowhile Lv: goto Lsent Lf: DO do SENT while COND Write (COND.true, :);
Write (goto , DO.ini); Write (COND.false, :);

DO.ini= generar_etiqueta(); Write (Do.ini, :);

IFE if COND { write ( COND.true, :) } SENT_TRUE

IFE.fin = generar_etiqueta(); Write(goto , IFE.fin); Write( COND.false, :);

else SENT_FALSE

Write( IFE.FIN:);