Codigo de Tres Direcciones

miércoles, 9 de septiembre de 2009
Un saludo a todos, bueno esta entrada esta destinada para los compañeros y amigos que necesiten una pequeña ayuda para su segundo parcial de Compiladores 2 :s Espero les pueda ayudar en algo.

Nota: EXP sera para la parte de las expresiones numericas que todos conocemos.
contEtiq sera el contador para el control de las etiquetas
contTemp sera el contador para el control de los temporales

  • Definicion para Expresiones Condicionales Corto Circuito
Se manejaran 2 atributos uno para las etiquetas Verdaderas y Otro pra etiquetas falsas.

COND := COND 'AND' {: write(COND1.verdadero, ':'); :} COND {:
COND.verdadero = COND2.verdadero;
COND.falso = concat(COND1.falso, ':', COND2.falso); :}
| COND 'OR' {: write(COND1.falso, ':'); :} COND {:
COND.verdadero = concat(COND1.verdadero, ':', COND2.verdadero);
COND.falso = COND2.falso; :}
| 'NOT' COND {: COND.verdadero = COND1.falso;
COND.falso = COND1.verdadero; :}
| '(' COND ')' {: COND.verdadero = COND1.verdadero;
COND.falso = COND1.falso; :}
| EXP '<' EXP {: write('if', EXP1.cad, '<', EXP2.cad, 'then goto L', contEtiq); COND.verdadero = concat('L', contEtiq); contEtiq++; write('goto L', contEtiq); COND.falso = concat ('L', contEtiq); contEti++; :}
| EXP '>' EXP
{: write('if', EXP1.cad, '>', EXP2.cad, 'then goto L', contEtiq);
COND.verdadero = concat('L', contEtiq);
contEtiq++;
write('goto L', contEtiq);
COND.falso = concat ('L', contEtiq);
contEti++; :}
| EXP '==' EXP {: write('if', EXP1.cad, '==', EXP2.cad, 'then goto L', contEtiq);
COND.verdadero = concat('L', contEtiq);
contEtiq++;
write('goto L', contEtiq);
COND.falso = concat ('L', contEtiq);
contEti++; :}
| EXP '!=' EXP {: write('if', EXP1.cad, '!=', EXP2.cad, 'then goto L', contEtiq);
COND.verdadero = concat('L', contEtiq);
contEtiq++;
write('goto L', contEtiq);
COND.falso = concat ('L', contEtiq);
contEti++; :}

Para los siguientes ejemplos el codigo que genera:

a '<' b AND c '>' e
if a'<'b then goto L1 L1: goto L2 if c'>'e then goto L3
goto L4

al terminar la etiqueta verdadera seria L3 y las falsas L2 y L4.

a '<' b OR c '>' e
if a'<'b then goto L1 L2: goto L2 if c'>'e then goto L3
goto L4

al terminar las etiqueta verdadera seria L1 y L3 y la falsa L4.
  • Definicion para Expresiones Condicionales Valores Numericos (No Corto Circuito)
Aqui solo se manjea un atributo que contendra el valor falso o verdadero de la condicion

COND := COND 'AND' COND
{: write('T', contTemp, '=', COND1.temp, 'AND', COND2.temp);
COND.temp = concat('T', contTemp);
contTemp++; :}
| COND 'OR' COND
{: write('T', contTemp, '=', COND1.temp, 'OR', COND2.temp);
COND.temp = concat('T', contTemp);
contTemp++; :}
| 'NOT' COND
{: write(COND1.temp, '= NOT', COND1.temp);
COND.temp = COND1.temp;
:}
| '(' COND ')'
{: COND.temp = COND1.temp; :}
| EXP '<' EXP
{: write('if', EXP1.cad, '<', EXP2.cad, 'then goto L', contEtiq); write('T', contTemp, '= false'); contEtiq++; write('goto L' + contEtiq); write('L', contEtiq-1, ':'); write('T', contTemp, '= true'); write('L', contEtiq, ':'); COND.temp = concat('T', contTemp); contTemp++; :}
| EXP '>' EXP
{: write('if', EXP1.cad, '>', EXP2.cad, 'then goto L', contEtiq);
write('T', contTemp, '= false');
contEtiq++;
write('goto L' + contEtiq);
write('L', contEtiq-1, ':');
write('T', contTemp, '= true');
write('L', contEtiq, ':');
COND.temp = concat('T', contTemp);
contTemp++;
:}
| EXP '==' EXP
{: write('if', EXP1.cad, '==', EXP2.cad, 'then goto L', contEtiq);
write('T', contTemp, '= false');
contEtiq++;
write('goto L' + contEtiq);
write('L', contEtiq-1, ':');
write('T', contTemp, '= true');
write('L', contEtiq, ':');
COND.temp = concat('T', contTemp);
contTemp++;
:}
| EXP '!=' EXP
{: write('if', EXP1.cad, '!=', EXP2.cad, 'then goto L', contEtiq);
write('T', contTemp, '= false');
contEtiq++;
write('goto L' + contEtiq);
write('L', contEtiq-1, ':');
write('T', contTemp, '= true');
write('L', contEtiq, ':');
COND.temp = concat('T', contTemp);
contTemp++;
:}

Para los siguientes ejemplos el codigo que genera:

a '<' b AND c '>' e
if a'<'b then goto L1 T1 = false goto L2 L1: T1 = true L2: if c'>'e then goto L3
T2 = false
goto L4
L3:
T2 = false
L4:
T3 = T1 AND T2

Al terminar el tempororal T3 tendra el resultado de la condicion


a '<' b OR c '>' e
if a'<'b then goto L1 T1 = false goto L2 L1: T1 = true L2: if c'>'e then goto L3
T2 = false
goto L4
L3:
T2 = false
L4:
T3 = T1 OR T2

Al terminar el tempororal T3 tendra el resultado de la condicion


Bueno Espero que les sirva de algo, mas tarde les subo una para generar codigo de tres direcciones de arreglos, saludos...

2 comentarios:

Unknown dijo...

ammmm no entiendo...

Gustavo Fuentes dijo...

Buena onda mano, gracias por compartir tus conocimientos, y haber cuando hay reto, jajaja oraleeeeeee