Attribuutide kasutamine tingimuslause koodi genereerimisel

Kui lähtetekst ei ole lineaarne, s.t. järjestikku täidetavate käskude jada, vaid esineb ka suunamisi (näiteks tingimuslause), tuleb käskude sooritamise järjekorda muuta ka transleerimise tulemusena saadavas objektekstis. Parema ülevaate saamiseks esitame tingimuslause produktsiooni

tingimuslause IF tingimus THEN lause {ELSE lause}

nn. raudtee-diagrammiga (railway diagram); mitteterminal lause võib siin tähistada blokki, s.t. lausete/käskude jada ja loomulikult tähistavad mitteterminali lause esimene ja teine esinemine erinevaid blokke (sellepärast sellisest skeemist või produktsiooni paremast poolest rääkides sama mitteterminali esinemised indekseeritakse: lause1, lause2 jne). If-lause läbimisel (s.t. sellele vastava koodi genereerimisel) mitteterminalile tingimus vastava lähteteksti osa läbimisel tulemuseks loogiline väärtus (TRUE või FALSE); genereeritud koodis peavad olema suunamislaused: kui tingimuse läbimisel saadi tulemuseks TRUE, tuleb siirduda lause1 poolt genereeritud koodi algusesse, kui tulemuseks saadi FALSE, siis (sõltuvalt sellest, kas ELSE-osa on või mitte) kas mitteterminalile lause2 vastava koodiosa algusesse või kogu if-lausele vastava koodiosa genereerimisel saadud objekteteksti järgmisele reale. Kuid mitteterminalile tingimus vastavat koodi genereerides pole veel teada, millisest reast algavad mitteterminalile lause1, lause2 vastavad objektkoodi read, s.t. mitteterminalile tingimus vastavasse koodi on võimalik kirjutada vaid nn. "aukudega" suunamised - suunamiskohta tähistav märgend jääb tühjaks (see täidetakse hiljem; võib ka jätta kogu vastava koodilause tühjaks).

Kogu if-lausele vastava koodi genereerimise range kirjelduse saamiseks (nii, et selle alusel saaks kirjutada translaatori) tuleb objektekstis ridadele lisada märgendid ja väljundtekstis kasutada tingimuslikke suunamisi IF ... GOTO ... ja tingimusteta suunamisi - GO TO ... .

 Lisame kõigile genereeritud käskudele täisarvulise märgendi, mille väärtus säilitatakse globaalmuutujas ln (s.t. ln väärtus on järgmise genereeeritud käsu märgend); selle algväärtustamist ja muutmist siin ei vaadelda, s.t. eeldatakse, et ln muutub automaatselt (suureneb ühe võrra)  iga väljundkäsu genereerimise järel.

Esituse lihtsustamiseks on järgnevas ära jäetud ka väljundteksti tassimine puus tipult-tipule; kuna see toimub abstraktse süntaksi puus puu tippude lõppjärjestuses läbimise käigus ja uued koodiread lisatakse alati olemasolevate järele, võib väljundi genereerida eraldi massiivina või faili. Järgnevates näidetes genereerib väljundkäsud protseduur out; selle argumendiks on genereeritav käsk stringina (märgendita); out lisab käsule (stringile) märgendi (muutuja ln väärtuse) ja kirjutab selle siis väljundtekstui (faili) lõppu; || on stringide konkatenatsioonioperaator.

 Genereeritud GOTO-käskudele saab sihtamärgendi lisada alles hiljem (selle genereerimise ajal ei ole näiteks teada, kui pikk tuleb programmilõik, millest tingimuse mittetäitumise korral peab üle hüppama), sellepärast genereeritakse GOTO-käsud ilma märgendita, kuid nende endi märgendid salvestatakse attribuutides, et neile hiljem saaks sihtmärgendid lisada. Attribuudis .T säilitatakse nende GOTO-käskude märgendid, kuhu tuleb lisada sihtmärgend tingimuse tõese väärtuse korral ja attribuudis .F säilitatakse nende GOTO-käskude märgendid, kuhu tuleb lisada sihtmärgend, kui tingimus on väär.

Siin tekib vajadus süntaksipuus informatsiooni edastamiseks "kõrvale", s.t. alampuust eelnevasse alampuusse. Näiteks if-lause IF tingimus THEN käsud tingimusosas genereeritud reale GOTO vääramärgend saab augu vääramärgend (s.t. kuhu hüpata siis, kui tingimus on väär) täita alles pärast kogu mitteterminalile käsud vastava koodilõigu genereerimist (vääramärgend on mitteterminalile käsud vastavale koodilõigule järgneva rea märgend; järgnevas näites see salvestatakse mitteterminali käsud2 attribuudis .N). Märgendit, kuhu tuleb hüpata tingimuse tõese väärtuse korral (if-lauses mitteterminalile käsud vastava väljundkoodi esimese rea märgend, s.t. ln väärtus pärast kogu mitteterminalile tingimus vastava alampuu töötlust) säilitatakse nn tummas (dummy) mitteterminalis m, mis alati teiseneb tühjaks sõnaks ja mida kasutatakse vaid informatsiooni salvestamiseks attribuudi abil, selle attribuut m.Q "peab meeles" esimese mitteterminalile käsud vastava koodiosa märgendi (s.t. märgendi, kuhu peab hüppama tingimuse tõese väärtuse korral).

"Aukudega" tingimuslausetesse kirjutab sihtmärgendi kahe argumendiga protseduur BACK; selle esimene argument on nimistu GOTO-käskude märgenditest, kuhu tuleb kirjutada teiseks argumendiks olev märgend.

 Tingimuslause abstraktse süntaksi ja sellele vastavad semantilised tegevused võib kirjeldada järgmiselt:

 tingimuslause  IF tingimus THEN m lause
{
BACK(tingimus.T, m.Q);
BACK(tingimus.F, lause.N) }
tingimus  Ident relop Ident
{
tingimus.T := ln;
tingimus.F := ln+1;
out("IF" !! Ident1.P !! relop !! Ident2.P !! "GOTO" _ );
out("GOTO" _);
}  

{ m.Q := ln; }
 lause  omistuskäsk
{ lause.N := ln; }

Omistamiskäsk töödeldakse varem esitatud semantiliste tegevuste abil, kuid väljundkood kirjutatakse attribuudi .C asemel otse väljundfaili. Sellise semantiliste tegevuste määramisega genereeritakse näiteks sisendist

IF A>B THEN X := Y + Z

järgmine väljund (ise läbi teha!)

100 IF A>B GOTO 102
101 GOTO 104
102 T1 := Y + Z
103 X := T1
104



Ülesandeid:
1. Kuidas peaks täiendama ülaltoodud skeemi, kui produktsiooni

tingimus  Ident relop Ident

asendada produktsioniga

tingimus  avaldis relop avaldis

(attribuutskeem mitteterminali avaldis väärtuse arvutamiseks on esitatud eelmises peatükis).
2. Kuidas peaks täiendama ülaltoodud skeemi, kui soovitakse lisada produktsioonid

laused  lause; | lause; laused
lause   tingimuslause | omistuslause

(algussümboliks on mitteterminal laused)
3. Kuidas peaks täiendama ülaltoodud skeemi, kui produktsiooni

tingimus  Ident relop Ident

asemel täiendada ka loogiliste operaatoritega:

tingimus  Ident relop Ident | tingimus logop2 tingimus
| logop1 tingimus
logop2   AND | OR
logop1  NOT

4. Kuidas peaks täiendama transleerimis skeemi, kui sellele lisaks muudetakse tingimuslause struktuuri selgitav produktsioon selliseks:

tingimuslause  IF tingimus THEN m laused


Küsimused, probleemid: ©2004 Jaak Henno