Attribuutide kasutamine koodi genereerimisel: loogiline avaldis

Loogiliste avaldiste transleerimisel saab väljundkoodi ka veidi optimiseerida. Näiteks "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; ja "avaldis1 AND avaldis2" transleerimisel võib avaldis1 väära väärtuse korral kohe siirduda sinna, kuhu peaks siirduma kogu avaldise väära väärtuse korral. Sihtmärgendite (muutuja NEXT väärtuse) salvestamiseks kasutame taas"tumma" mitteterminali m.

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 ?


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

Tagasi loengute sisukorra juurde