Introducing
Your new presentation assistant.
Refine, enhance, and tailor your content, source relevant images, and edit visuals quicker than ever before.
Trending searches
William Roberto Cruz Villatoro
Emerson Fransuani Cuyuch Aguilar
Ashley Sarahi López Alvarado
Hernán Adriel Martínez Mazariegos
Bryan Alexander Calderon Villatoro
Hugo Walter Godinez Martin
4490-17-679
4490-17-4001
4490-17-16584
4490-17-7386
4490-17-1609
4490-17-15435
Utilizando código de tercetos se genera el código correspondiente a las expresiones y las sentencias de control.
En el caso de las expresiones eran basadas en variables temporales para generar código. Ahora el problema son los cambios de flujo.
IF - THEN - ELSE
CASE
WHILE
REPEAT
Entrada
IF A > 0 THEN
S1 := 1;
ELSE
S2 :=2;
FIN SI;
Salida
if A > 0 goto etq1
goto etq2
label etq1
S1 = 1
goto etq3
label etq2
S2 = 2
label etq3
sent
cond
S2 := 2;
A > 0
S1 := 1;
sent : IF cond THEN sent ELSE sent {Generar código de tercetos}
| ID ASIG expr {Generar código de tercetos}
código generado sent 1 => S1 = 1
código generado sent 2 => S2 = 2
S1 = 1
goto etq3
label etq2
S2 = 2
cond : expr '>' expr {Genero código de tercetos}
printf("if%s > %s goto etq_verdad", $1, $3);
printf("goto etq_falso");
Aquí es donde se generan las líneas que no están asociadas ni a la condición ni a las expresiones.
sent : IF cond THEN sent ELSE sent {Generar código de tercetos}
1 2 3 4 5 6
if A > 0 goto etq1
goto etq2
label etq1
S1 = 1
goto etq3
label etq2
S2 = 2
label etq3
3 {printf("label etq_verdad");}
Se refiere a aquella que no debe combinarse con otras condiciones para determinar un resultado.
if A > 0 goto etq 1
goto etq2
cond : expr '>' expr {strcpy($$.etq_verdad, nueva-etq());
strcpy($$.etq_falso, nueva-etq());
printf("if%s > %s goto %s, $1,$3,$$.etq_verdad");
printf("goto %s", $$.etq_falso);}
sent : IF cond THEN sent ELSE sent FIN IF
tmp 1 = A + 3
if tmp1 > 0 goto etq-1
goto etq-2
Se refiere a aquella que está compuesta de dos o más condiciones simples unidas mediante un operador lógico.
Sea:
IF (A > 0) AND (B > C) THEN
S1 := 1;
FIN SI;
Se traduce a:
if A > 0 goto etq4
goto etq5
label etq4
if B > C goto etq6
goto etq7
label etq5
goto etq7
label etq6
S = 1
goto etq8
label etq7
label etq8
cond : cond AND cond {}
etq_V = etq_V2
etq_F = etq_F2
$1 $2 $3
cond : cond AND {printf("label %s", $1.etq_V);}
$4
cond {print("label %s", $1.etq_F);
print("goto %s", $4.etq_F);
strcpy($$.etq_V, $4.etq_V);
strcpy($$.etq_F, $4.etq_F);}
cond : cond OR cond
etq_V = etq_V2
etq_F = etq_F2
$1 $2 $3
cond : cond AND {printf("label %s", $1.etq_V);}
$4
cond {print("label %s", $1.etq_F);
print("goto %s", $4.etq_F);
strcpy($$.etq_V, $4.etq_V);
strcpy($$.etq_F, $4.etq_F);}
cond : cond OR cond
cond : NOT cond
cond : NOT cond {strcpy($$.etqV, $2.etqF);
srtcpy($$.etqF, $2.etqV);}
0 0 => V
0 1 => V
1 0 => V
1 1 => F
Son condiciones y etiquetas asociadas que permiten la generación de código implicando condiciones como:
Es el caso más simple, basta con idicar que etiqueta de verdad condición está asociada al código a continuación del THEN, y la etiqueta de falso se asocia al código que puede haber tras el ELSE.
{printf(label $2.etqV);}
sent : IF cond THEN sent ELSE sent FIN IF {printf(label etqFINIF);}
{print(goto etqFINIF);
printf(laberl $2.etqF);}
sent : IF cond THEN sent ELSE sent FIN IF {printf("label %s",etqFINIF);}
{char etqFINIF[20];
strcpy(etqFINIF, nueva_etq());
printf("goto %s", etqFINIF);}
%{
char etqFINIF[20];
%}
...
%%
Si sent es un IF entonces utiliza la etqFINIF mal
sent : IF cond THEN sent ELSE sent FIN IF {utilizo etqFINIF}
{utilizo etqFINIF}
sent : IF cond THEN sent ELSE sent FIN IF {printf("labek %s", $1.etq);}
{strcpy($1.etq, nueva_etq());
printf("goto %s", $1.etq);}