Veidi suurem näide

Järgnevas on ühendatud varemesitatud semantilised tegevused veidi suuremaks reeglite näiteks; kasutatakse eelnevas esitatud protseduure GEN, BACK ja MERGE. Järgnevas abstraktse süntaksi grammatikas esinevad terminalid (võtmesõnad, omistamismärk, tehtemärgid) on vaid esituse lihtsustamiseks, nendega ei ole seotud mingeid semantilisi tegevusi ja abstraktse süntaksi puus nad tegelikult enam ei esine (neid kasutati varem, süntaksipuu konstrueerimisel); mitteterminali m kasutatakse vaid jooksva märgendi (globaalne muutuja!) NEXT väärtuse säilitamiseks; globaalset muutujat N kasutatakse nagu varemgi uute identifikaatorite genereerimisel.

 programm lause | programm lause
{programm.N = NEXT}
 lause  omistamine | tingimuslause | while_lause
omistamine   Ident := avaldis
{GEN( Ident.P || ":=" || avaldis.P )}
tingimuslause  IF tingimus THEN m programm ENDIF
{BACK(tingimus.T, m.Q);
BACK(tingimus.F, programm.N) }
while_lause  WHILE tingimus DO m programm ENDDO
{GEN("GOTO" || tingimus.Q;);
BACK(tingimus.T, m.Q);
BACK(tingimus.F, (programm.N)+1) }

tingimus  m loogiline
{tingimus.Q = m.Q
tingimus.T = loogiline.T
tingimus.F = loogiline.F}

| loogiline OR m loogiline
{BACK(loogiline1.F, m.Q)
tingimus.T := MERGE(loogiline1.T, loogiline2.T)
tingimus.F := loogiline2.F}

| loogiline AND m loogiline
{BACK(loogiline1.T, m.Q)
tingimus.F := MERGE(loogiline1.F, loogiline2.F)
tingimus.T := loogiline2.T }

| NOT loogiline

{tingimus.T = loogiline.F

tingimus.F = loogiline.T}

loogiline   avaldis relop avaldis
{loogiline.T := NEXT;
loogiline.F := NEXT+1;
GEN("IF" !! avaldis1.P !! relop !! avaldis2.P !! "GOTO" _ );
GEN("GOTO" _);
}

 m 
{
m.Q := NEXT;
}

avaldis  avaldis op avaldis
{ avaldis.P = "T" !! N ; /* genereeritakse uus tähistus */
GEN( avaldis.P !! ":=" !! avaldis1.P !! op !! avaldis2.P) }

avaldis  op avaldis /* unaarne operatsioon, näit miinus */
{ avaldis.P = "T" !! N ; /* genereeritakse uus tähistus */
GEN( avaldis.P !! ":=" !! op !! avaldis1.P) }

avaldis  Ident
{ avaldis.P = Ident.P }

avaldis  Const
{ avaldis.P = Const.P }

Ülesanne. Mis genereeritakse käskude

X := 10
Y := 20
WHILE X + Y > 2 * X DO

IF X < 25 THEN X := X + Y / 5 ENDIF
Y := Y - 1
ENDDO
Z := X + Y

transleerimisel?


Küsimused, probleemid:
jaak@cc.ttu.ee

Tagasi loengute sisukorra juurde