Professional Documents
Culture Documents
Seccin: A
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_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:
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.
to E2 FOR.fin = genera_etiqueta()
//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.
//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
{ Write(IF.fin, :); }
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, :)}
//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, :)
SENT break;
| num:
LP.true = generar_etiqueta(); LP.false = generar_etiqueta(); Write ( if, num, = LP.val, then goto, LP.true) Write (goto, LP.false);
SENT break;
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, :);
else SENT_FALSE
Write( IFE.FIN:);