Codigo de Tres Direcciones SWITCH

miércoles, 9 de septiembre de 2009
Hola de nuevo, siguiendo con mi contribucion a temas para segundo parcial del curso compiladores 2, aqui les coloco una nueva traduccion dirigida, esta ves para la sentencia SWITCH - CASE.

Nota: '<'cuerpo'>' cualquier sentencia valida

SW := SWITCH '(' EXP ')' {: LC.cad = EXP.cad; write('goto Comparacion'); :} LC {: write('Comparacion:');
write(LC.text);
write('goto Salida');
write('Salida:') :}
LC := {: LC.cad = LC.cad; :} LC CASE EXP ':' {:write('L', contEtiq, ':'); LC.eti = concat('T', contEtiq); contEtiq++; :} '<'cuerpo'>' {: LC.text = concat(LC.text, 'if', LC.cad, '==', EXP.cad, 'then goto ', LC.eti); :}
| {: LC.cad = LC.cad; :} LC CASE EXP ':' {:write('L', contEtiq, ':'); LC.eti = concat('T', contEtiq); contEtiq++; :} '<'cuerpo'>' 'break' {: write('goto Salida');
LC.text = concat(LC.text, 'if', LC.cad, '==', EXP.cad, 'then goto ', LC.eti); :}
| CASE EXP ':' {:write('L', contEtiq, ':'); LC.eti = concat('T', contEtiq); contEtiq++; :} '<'cuerpo'>' {: LC.text = concat('if', LC.cad, '==', EXP.cad, 'then goto ', LC.eti); :}
| CASE EXP ':' {:write('L', contEtiq, ':'); LC.eti = concat('T', contEtiq); contEtiq++; :} '<'cuerpo'>' 'break' {: write('goto SALIDA');
LC.text = concat('if', LC.cad, '==', EXP.cad, 'then goto ', LC.eti); :}

3 comentarios:

Alice dijo...

Alex!! para aux de compi :P

Anónimo dijo...

Esta bien vos! gracias me sirvio bastante! pero por tu culpa me faltaron 5 puntos...

Unknown dijo...

sigo sin entender y lo del parcial de mañana q!! jajaja