Loogiliste avaldiste transleerimisel saab väljundkoodi ka veidi optimiseerida. Näiteks loogilise avaldise avaldis1 OR avaldis2 transleerimisel võib alamavaldise avalis1 tõese väärtuse korral kohe juhtimise suunata sinna, kuhu see peaks minema kogu avaldise tõese väärtuse korral, s.t. näiteks käsu IF avaldis1 OR avaldis2 THEN block transleerimine võib toimuda kõrvaloleva skeemi kohaselt. Samal viisil võib loogilise avaldise avaldis1 AND avaldis2 transleerimisel avaldis1 väära väärtuse korral kohe siirduda sinna, kuhu peaks siirduma kogu avaldise väära väärtuse korral. Sihtmärgendite (muutuja ln väärtuse) salvestamiseks kasutame taas "tumma" mitteterminali m.
Semantilised tegevused on määratud järgmiste reeglitega; protseduur BACK kirjutab esimese argumendiga näidatud ridadesse teises argumendis esitatud märgendi; protseduur MERGE ühendab kaks märgendite nimistut üheks:.
avaldis avaldis OR m avaldis
{
BACK(avaldis1.F, m.Q)
avaldis.T := MERGE(avaldis1.T, avaldis2.T)
avaldis.F := avaldis2.F
}
avaldis avaldis AND m avaldis
{
BACK(avaldis1.T, m.Q)
avaldis.T := avaldis2.T
avaldis.F := MERGE(avaldis1.F, avaldis2.F)
}
avaldis NOT avaldis
{
avaldis.T := avaldis1.F
avaldis.F := avaldis1.T
}
avaldis avaldis relop avaldis
{
avaldis.T := ln;
avaldis.F := ln+1;
out("IF" || avaldis1.P || relop || avaldis2.P || "GOTO" _ );
out("GOTO" _);
}
avaldis Ident
{
avaldis.T := ln;
avaldis.F := ln+1;
out("IF" || avaldis.P || "GOTO" _);
out("GOTO" _)
}
Näide. Avaldise A OR (B AND C) transleerimisel (alguses ln=100) saadakse järgmine "aukudega" käskude rida (jälgimise lihtsustamiseks on iga rea lõpus kommentaarina tipu tähis, mille töötlemisel vastav rida saadakse; "aukudesse" märgendi kirjutamisel protseduuriga BACK on samuti näidatud tipp, mille läbimisel see toimub):
100 IF A GOTO _ /* A */
101 GOTO 102 /* A, BACK: "OR"
*/
02 IF B GOTO 104 /* B, BACK: "AND" */
103 GOTO _
104 IF C GOTO _ /* C */
105 GOTO _ /* C
*/
Tipus "OR" (kogu avaldise puu juur) on attribuutide väärtused
OR.T = 100, 104
OR.F = 103, 105
s.t. ridade 100, 104 olevatesse GOTO-aukudesse tuleb kirjutada reanumbrid, kuhu peaks siirduma kogu avaldise tõese väärtuse korral (see sõltub kontekstist, kus avaldis esineb, näiteks tingimuslauses IF avaldis THEN ... tuleks selleks ilmselt THEN järel oleva teksti transleerimisel saadud esimese käsu märgend, s.t. ln väärtus kogu avaldise transleerimise lõppedes); ridades 103, 105 olevate GOTO-aukudesse peaks kirjutama väljundteksti märgendid, kuhu siirdutakse, kui avaldis on väär.
Kui seda avaldist kasutada eelmises loengus vaadeldud tingimuslause tingimusena, s.t. käsu
IF A OR (B AND C) THEN X := Y + Z
transleerimisel, kasutades eelnenud ja siin esitatud attribuutide arvutamise reegleid, oleks tulemus:
100 IF A GOTO 106
101 GOTO 102
102 IF B GOTO 104
103 GOTO 108
104 IF C GOTO 106
105 GOTO 108
106 T1 := Y+Z
107 X := T1
((P < Q) OR (R >S)) AND (T < U)
transleerimisel attribuutide .T, .F väärtused sellele avaldisele vastava abstraktse süntaksi puu tippudes?
lause case_lause
case_lause CASE juhud ENDCASE
juhud juht | juht juhud
juht WHEN tingimus lause
juht WHEN tingimus laused