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?