Semantilised tegevused on määratud järgmiste reeglitega; protseduur BACK kirjutab ridadesse, mis on näidatud esimeses argumendis, 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 := NEXT;
avaldis.F := NEXT+1;
GEN("IF" !! avaldis1.P !! relop !! avaldis2.P !! "GOTO" _ );
GEN("GOTO" _);
}
avaldis
Ident
{
avaldis.T := NEXT;
avaldis.F := NEXT+1;
GEN("IF" !! avaldis.P !! "GOTO" _);
GEN("GOTO" _)
}
Näide. Avaldise A OR (B AND C) transleerimisel (alguses NEXT=100) saadakse järgmine "aukudega" käskude rida (ise läbi teha, 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 toodud tipp, mille läbimisel see toimub):
100 IF A GOTO _ /* A */
101 GOTO 102 /* A, BACK: "OR"
*/
102 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. NEXT väärtus kogu avaldise transleerimise lõppedes); ridade 103, 105 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 (ise läbi teha!):
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
Ülesandeid:
1. Millised on avaldise
((P < Q) OR (R >S)) AND (T < U)
transleerimisel attribuutide .T, .F väärtused sellele avaldisele vastava abstraktse
süntaksi puu tipus?
2. Koostada attribuutide arvutamise reeglid while-lausele UNTIL tingimus DO laused ENDUNTIL
3. Koostada atribuutide arvutamise reeglid case-lausele:
lause
case_lause
case_lause
CASE juhud ENDCASE
juhud
juht | juht juhud
juht
WHEN tingimus lause
4. Kuidas tuleks eelmises ülesandes eeskirju muuta, kui mitteterminal
"juht" oleks defineeritud produktsiooniga
juht
WHEN tingimus laused ?