You are on page 1of 5

LABORATORIO COMPILADORES 2 HOJA DE TRABAJO # 41 Código Tres Direcciones

Sección: A

Guatemala 10 de marzo de 2013

Marilyn Xiomara Abigail Lainez González

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 código 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 código tres direcciones del if anidado.

Codigo_Cond1 Lv1: código_sent1 goto Lfinal Lf1: codigo_cond2 Lv2: código_cond3 goto Lfinal Lf2: código_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 condición del id, si es mayor al valor de E2 sale del ciclo for.

Lfinal:

Id = id+1 goto Lcond

L1:

“=”. tomara E.ELSES. Write(COND.fin = genera_etiqueta().cond. | elseif COND {Write(COND. IF  if COND Write(COND.fin.val.fin.false.fin =ELSES. id.IF. “:”) to E2 FOR. “+1” ).fin).cond = genera_etiqueta() Write(FOR. “:”) .val. Write(“goto ”. una variable declarada o un valor como tal. . ELSES else SENT { Write(IF. Write(“goto ”.true. } //lista de los N elseif que pueden venir en un IF. representa una variable. en el codigo 3D.true. } ELSES1 elseif COND {Write(COND. “:”)} SENT. ELSES  { ELSES1. SENT IF | CASE | DO | IFE.false.fin. E1. “:”). Write(COND. “>” E2. ELSES.fin). “then goto”.fin). que se determino que finalizaría con un else.cond). “:”). Write(COND. //Gramatica que genera código tres direcciones para un ciclo for.false. //Gramatica que genera código tres direcciones para un if anidado. FOR.fin = genera_etiqueta() Write (“if”. “:”). el cual puede ser una variable temporal. FOR.true.ELSES. pero en este caso se esta tomando el if anidado que solicita el ejercicio. Write(“goto ”.fin. “:”) SENT IF. do SENT end for Write( id.fin = IF. FOR  for id = E1 Write( id.fin). “:”)} SENT Write(“goto ”. //estas son todas las posibles sentencias que pueden venir en un for. id.val ) FOR. “=”. “:”).//id. Write (FOR.

COND { write(COND. } . end while write( COND. Val2: SENT2 break. “:”).ini.ini para tomar la etiqueta de inicio.ini. WHILE. “:”)} SENT { write( “goto”. y regresar hasta que la condicion no se se cumpla. Default: SENT_default End case End while CODIGO EN TRES DIRECCIONES Lwhile: código_cond Lv: código_E If Eval = val1 then goto L1 goto L2 L1: código_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 producción SENT del ejemplo anterior.). WHILE  while WHILE.false.true. el cual pude generar distintas sentencias posibles. EJEMPLO DEL WHILE CON CASE WHILE cond CASE E Val1: SENT1 break.2. Write (WHILE. “:”).ini = genera_etiqueta(). //Se genera el atributo WHILE.

“:”).fin).//El CASE siguiente tiene una salida de escape al final de cada opción del case. num.val. SENT break. “:”). Write ( “if”.val = LP. Write ( “if”. . LP.false).false).val = E. Write (LP. “:”) LP  {LP1 . num. y el break es valido. SENT break.val } LP default : SENT end case Write(LP.VAL } LP num : LP. LP. “:”). | num: LP. LP.true) Write (“goto”. LP.fin.true = generar_etiqueta().true) Write (“goto”. CASE  case E { LP. “then goto”. Write(“goto ”. LP. ya que no se estableció una estructura para case. LP1.false = generar_etiqueta().fin. LP.false. = LP. Write(LP. LP.val. “:”).false = generar_etiqueta().true = generar_etiqueta().true.fin). Write(“goto ”. LP.false.fin = generar_etiqueta(). LP.fin = LP1. “then goto”. Write(LP. = LP. Write (LP. se tomo de esta forma. //Siendo de otra forma en la gramatica debe implementarse una pila para definir si las sentencias que vienen están o no dentro del case.true.

false.false. IFE. “:”) } SENT_TRUE IFE. “:”). . Lsent: Codigo_cond_if Lv: código_sent_verdadera Goto Lsalida Lf: código_sent_falsa Lsalida: Código_cond_dowhile Lv: goto Lsent Lf: DO  do SENT while COND Write (COND.ini= generar_etiqueta(). Write (“goto ”.fin).true. Write (COND. Write( COND.ini).FIN“:”). “:”).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. DO.true. pero tomando en cuenta que se ejecutan las sentencias como mínimo una vez. IFE  if COND { write ( COND. se sale del ciclo cuando la condición no se cumpla.ini. Write(“goto ”. Write (Do. “:”). DO.fin = generar_etiqueta(). else SENT_FALSE Write( IFE. “:”).