You are on page 1of 22

Automaadid, keeled ja translaatorid (MTAT.05.

085) Rein Raudjärv

GENERATIIVSED GRAMMATIKAD TTS BAASIL


Sisukord
Sisukord.................................................................................................................................1
TTSist.....................................................................................................................................2
Tähistus..................................................................................................................................2
1. Kontekstivaba grammatika.................................................................................................3
Grammatika metakeel.....................................................................................................3
TTS grammatika metakeel..............................................................................................4
2. Derivatsioon, keel...............................................................................................................5
3. Analüüsi puu, kanooniline derivatsioon..............................................................................6
4. Süntaksi analüüsi ülesanne...............................................................................................8
5. Eelnevusrelatsioonid, eelnevusgrammatika (EG).
KVG teisendamine eelnevusgrammatikaks...........................................................................9
Eelnevusrelatsioonide arvutamiseeskiri..........................................................................9
Eelnevuskonfliktid.........................................................................................................10
Eelnevusteisendused....................................................................................................10
6. Pööratava eelnevusgrammatika analüsaator...................................................................11
Lausevormi baas...........................................................................................................11
Pööratavate eelnevusgrammatikate analüsaator..........................................................11
7. Konteksti kasutamine redutseerimiseks ja vastav analüsaator.......................................13
Sõltumatu kontekst........................................................................................................13
BRC(1,1) analüsaator...................................................................................................14
8. Derivatsioonist sõltuv kontekst.........................................................................................15
9. Konteksti juurdetoomine..................................................................................................17
10. Analüüsi puu moodustamise juhtimine. Analüsaatori lõplik algoritm.............................18
Analüüsi puu liiasus......................................................................................................18
TTSi semantilised muutujad..........................................................................................19
Analüsaatori lõplik algoritm...........................................................................................20
11. TTS Konstruktori üldine skeem......................................................................................21
Lisa 1. Trigoli keele grammatika..........................................................................................22
Automaadid, keeled ja translaatorid (MTAT.05.085) Rein Raudjärv

TTSist
Translaatorite tegemise süsteem (TTS) – eeskätt loengukursuse "Automaadid, keeled ja
translaatorid" (MTAT.05.085) omandamise hõlbustamiseks loodud programm, mis
võimaldab töötada kontekstivabade grammatikatega (KVG): teha Konstruktori tabeleid
ja analüüsida antud grammatikale vastava keele sõnu. TTS on realiseeritud
Windows95/NT/2000 keskkonnas, programmeerimiskeeled on C ja C++.

TTSi üldine skeem yyy.xxx

xxx.grm
Analüsaator
[xxx.sem] (Parser)

Konstruktor yyy.prm
yyy.pt
(Constructor) yyy.t
[yyy.it]
[yyy.kt]
xxx.prm
xxx.v
xxx.ht
xxx.pm
xxx.t Interpretaator Kompilaator
xxx.tt (Interpreter) (Compiler)
xxx.sm
[xxx.lc]
[xxx.rc]
[xxx.dc] Lahendamistul yyy.asm
emused yyy.exe

Trigol – TTS jaoks loodud primitiivne programmeerimiskeel.


TTS kodulehekülg: http://www.cs.ut.ee/~isotamm/tts/HELP.HTM

Tähistus
G grammatika
KVG kontekstivaba grammatika
EG eelnevusgrammatika
V tähestik ( a, A, b,1,0,... )
VN mitteterminaalne e. mõistete tähestik ( A, B,... )
VT terminaalne e. lekseemide tähestik (leksika) ( a,b,1,0, # ,... )
P produktsioon ( A → x )
S aksioom
→ produtseerib (produces)
⇒ on vahetult tuletatav
⇒ on tuletatav
⇒ ?
k

⇒ ?
k
<⋅ eelneb
= ajastub
⋅> järgneb

2
Automaadid, keeled ja translaatorid (MTAT.05.085) Rein Raudjärv

1. Kontekstivaba grammatika
Def. Generatiivseks grammatikaks nimetatakse järjestatud nelikut G = (VN , VT , P, S ) ,
kus
VN on mitteterminaalne tähestik (non-terminal vocabulary),

VT on terminaalne tähestik (terminal vocabulary),


(
P on produktsioonide hulk kujul x → y x ∈ V + y ∈ V * , )
S on aksioom – fikseeritud täht tähestikust VN , mida ei saa kasutada teiste mõistete
defineerimisel (produktsiooni paremas pooles).
Mitteterminaalse tähestiku sümboleid nimetatakse mõisteteks (nt. A, B, C ,... ).
Terminaalse tähestiku (leksika) sümboleid nimetatakse lekseemideks (nt. # ,0,1, a, b, ,... ).
Hulka V = VN ∪ VT nimetatakse antud grammatika tähestikuks.

Def. Tähestiku V sümbolite järjendit x0 x1 ...xn xi ∈ V nimetatakse antud tähestiku


sõnaks.
V * on tähestiku V baasil moodustavate kõigi sõnade hulk.
V + on tähestiku V baasil moodustavate kõigi positiivse pikkusega sõnade hulk.
Def. Kontekstivabaks grammatikaks (KVG) nimetatakse generatiivset grammatikat
( )
KVG = (VN , VT , P, S ) , kus P on produktsioonide hulk kujul A → x A ∈ VN x ∈ V * .

Süntaks – reeglite kogu, mis määrab, kuidas antud keeles kirjutada semantiliselt õigeid
lauseid?. Semantilised õiged laused määrab produktsioonide hulk.
Interpretaator on programm, mis jooksutab (executes) teisi programme.
Kompilaator on programm, mis tõlgib teksti ühest arvutikeelest teise.
TTSis koostatakse kõige pealt algkeelsest tekstist nn. analüüsipuu (Analüsaatori
ülesanne). TTS Interpretaator läbib analüüsipuu ja „täidab selle käske”. TTS Kompilaator
tõlgib analüüsipuu Assembleri keelde.
Transleerimise? käigus muutub grammatika süntaks ja leksika, aga säilib semantika.
Süntaks-orienteeritud transleerimine?.

Grammatika metakeel
Kõige lihtsam on programmides kasutada produktsioonide keelt?.
Algol 60 grammatika pandi kirja BNF meetodil. BNF (Backus Normal Form või Backus-
Naur Form) – nagu produktsioonide keel, aga esitus teine: <Mõiste> := <Definitsioon>.
Tundmatu keele kirjeldamiseks on hõlpsasti loetav Pascali grammatika. Näide:

3
Automaadid, keeled ja translaatorid (MTAT.05.085) Rein Raudjärv

TTS grammatika metakeel


Näiteks g1.grm. Siin x ∈ V * = Ba, x ∈ VT* = aab .
Tabel 1. G1.GRM
`S'->#`A'#
`A'->`B'`C'
`B'->a
`B'->`B'a
`C'->b

Aksioom S on nt. programm.


Terminaalse tähestiku elemendid e. lekseemid on programmides need komponendid,
millest saab (võib) koosneda süntaktiliselt õige programm:
• reserveeritud sõnad – näiteks IF, THEN, GOTO jne;
• eraldajad – näiteks (tühik) ; + ( := ;
• lekseemiklassid:
o identifikaatorid (TTSis #i#) – objektide, muutujate, protseduuride nimed,
harilikult algab tähega, ülejäänud kohtadel on tähed, numbrid või alakriips,
pikkuse kitsendused, tõstutundlikkus;
o konstandid (TTSis #c#);
o sõned (TTSis realiseerimata);
o kommentaarid (TTSis realiseerimata).
Grammatikast antakse TTS Konstruktorile ette ainult produktsioonide hulk P , tavalise
ASCII-failina. Õppegrammatika nimi peab algama g-tähega. Kõikide grammatikate nime
laiend on grm. Produktsioonide esitamise metakeel on järgmine:
• Mõisted (mitteterminalid) on markerite ` ja ' vahel;
• Lekseemid kirjutatakse ilma markeriteta. Kahe järjestikuse lekseemi vahele tuleb
panna tühik;
• Produktsiooni vasaku ja parema poole vahel on miinusest ja paremast nurksulust
moodustatud "nool": ->;
• Kui ühte mõistet defineeritakse järjestikustel ridadel korduvalt, siis pole vasemat
poolt vaja kirjutada. Soovitav on kasutada tabulatsiooni.
Vt Lisa 1. TTS Konstruktor teeb produktsioonide hulga baasil hulgad VN ja VT .

4
Automaadid, keeled ja translaatorid (MTAT.05.085) Rein Raudjärv

2. Derivatsioon, keel
Def. Olgu antud sõnad x, y ∈ V * . Me ütleme, et sõnast x on vahetult tuletatav sõna y
(tähistame x ⇒ y ), kui x = uAv , y = uzv ja A → z ∈ P A ∈ VN u, z , v ∈ V .
*

Def. Olgu antud sõnad x, y ∈ V * . Me ütleme, et sõnast x on tuletatav sõna y


(tähistame x ⇒ ( )
 y ), kui leidub selline sõnade jada z0 , z1 ,..., z k zi ∈ V * , et x = z 0 , zi −1 ⇒ z i
ja z k = y (1 ≤ i ≤ k ) .
Naturaalarvu k nimetame derivatsiooni pikkuseks ja jada z 0 , z1 ,..., z k derivatsiooniks.

Def. Grammatika G = (VN , VT , P, S ) poolt defineeritud keeleks nimetatakse kõigi antud


{
grammatika poolt moodustavate sõnade hulka L( G ) = x : x ∈ VT* ∧ S ⇒  x . }

5
Automaadid, keeled ja translaatorid (MTAT.05.085) Rein Raudjärv

3. Analüüsi puu, kanooniline derivatsioon


Def. Olgu antud grammatika G = (VN , VT , P, S ) ja derivatsioon S = z0 , z1 ,..., z k −1 , z k = x . Siis
jada z k , z k −1 ,..., z1 , z 0 nimetatakse sõna x analüüsiks.

Def. Derivatsioonijada S = z 0 ⇒ z1 ⇒ ... ⇒ z k , kus z k ∈ VT , igat liiget nimetatakse lause


*

vormiks.

Def. Derivatsiooni käigus viimasena toimunud resultaati (mingi produktsiooni paremat


poolt) nimetatakse lausevormi baasiks.

Def. Olgu antud grammatika G = (VN , VT , P, S ) . Antud grammatika derivatsioonipuuks


nimetatakse märgendatud tippudega puud:
• Üksainus tipp märgendiga S on derivatsiooni puu;
• Kui D on derivatsiooni puu ja N tema tipp märgendiga A∈VN ja A → X 1 ... X p ∈ P ,
saame moodustada uue derivatsiooni puu D′ , märgendades tipu N märgendiga
A → X 1 ... X p ja lisades tipule N p alluvat, mille märgendeiks paneme vasakult
paremale X 1 ... X p .

Def. Derivatsioonipuu, mille märgendid kuuluvad hulka VT ∪ P on analüüsipuu.

Def. Kanooniliseks derivatsiooniks nimetatakse sellist derivatsiooni, kus igal


derivatsioonisammul asendatakse kõige parempoolsem mitteterminal.

Def. Kontekstivaba grammatikat G nimetatakse üheseks (mitmeseks), kui L( G ) iga


sõna jaoks leidub (vastavalt ei leidu) täpselt üks kanooniline derivatsioon ja analüüsi
puu.

Pole olemas algoritmi, mis teeks kindlaks, kas grammatika on ühene või mitte.
Kõik grammatikad, mille produktsioonide hulk sisaldab tsüklit kujul A⇒
 A või
produktsiooni kujul A → A või mille keeles leidub tühisõna, on mitmesed.
Def. Keelt nimetatakse üheseks (mitmeseks), kui talle vastav grammatika on ühene
(vastavalt mitmene).

Def. Keelt nimetatakse oluliselt mitmeseks, kui tal ei leidu ühest varianti.

6
Automaadid, keeled ja translaatorid (MTAT.05.085) Rein Raudjärv

Näiteid:
1. Kanooniline derivatsioon (g5.grm baasil):
T #S# #UV# #UcV# #Ucc# #abcc#
Tabel 2. G5.GRM
`T'->#`S'#
`S'->`U'`V'
`U'->a b
`V'->c`V'
`V'->c

2. Ühene grammatika:
G1 :
SaS
Sa
Derivatsioonid:
SaSaa
SaSaaSaaa
Ilmselt on G1 ühene.
3. Mitmene grammatika:
G2 :
SS
SaS
Sa
Derivatsioonid:
SaSaa
SSaSaa
Kõik derivatsioonid on kanoonilised, ent analüüsipuud on erinevad: G2 on mitmene (aga
mitte oluliselt mitmene).

7
Automaadid, keeled ja translaatorid (MTAT.05.085) Rein Raudjärv

4. Süntaksi analüüsi ülesanne


Süntaksi analüüsi ülesanne on püstitatud nii: on antud grammatika G ja sõna x ∈ VT* .
Tuleb välja selgitada,
1) kas antud sõna kuulub sellesse keelde ( x ∈ L( G ) );
2) kui kuulub, siis leida sõna x derivatsioon.
Olgu sõna x ∈ VT* pikkus (lekseemide arv) n .
1) Kui x analüüsimiseks kasutada strateegiat, kus alustame aksioomist S ja teeme läbi
kõik derivatsioonid jõudmaks x -ni ning G on mitmene, on parim kiirushinnang n3 .
2) Kui grammatika on ühene, siis garanteerib see strateegia kiirushinnangu n 2 .
3) Kui grammatika on eelnevusgrammatikad (EG; EG ⊂ KVG), siis on kiirushinnang n .
Eelnevusgrammatika süntaksi analüüsi samm (derivatsiooni vastand-samm):
1) Detekteerimine – lausevormist baasi ülesleidmine;
2) Redutseerimine – produktsiooni tagurpidi rakendamine (uue lause vormi
genereerimine)

8
Automaadid, keeled ja translaatorid (MTAT.05.085) Rein Raudjärv

5. Eelnevusrelatsioonid, eelnevusgrammatika (EG).


KVG teisendamine eelnevusgrammatikaks
Eelnevusrelatsioonide arvutamiseeskiri
Eelnevusrelatsioonide arvutamiseks leitakse kõigepealt mitteterminalist A ∈ VN ⊂ V
tuletatavate kõigi sõnade algus- (Leftmost) ja lõppsümbolite (Rightmost) hulgad L( A) ja
R ( A) :

L( A) = { X : X ∈ V & [ ∃φ : A → Xu ∨ ∃φ : A → Bu & X ∈ L( B ) ]} u ∈ V *
R( A) = { X : X ∈ V & [ ∃φ : A → uX ∨ ∃φ : A → uB & X ∈ R( B ) ]} u ∈ V *
Defineeritakse järgmised eelnevusrelatsioonid:
X = Y = { ( X , Y ) : ∃φ : A → uXYv} (loe: X ajastub Y -ga)
X < ⋅Y = { ( X , Y ) : ∃φ : A → uXBv & Y ∈ L( B )} (loe: X eelneb Y -ile)
 ( X , Y ) : [ ∃φ : A → uBYv & X ∈ R ( B ) ] 
X⋅ > Y =   (loe: X järgneb Y -ile)
∨ [ ∃φ : A → uBCv & X ∈ R( B ) & Y ∈ L( C ) ] 
Siin X , Y ∈ V A, B, C ∈ VN u , v ∈ V .
*

Def. Grammatika G = (VN , VT , P, S ) eelnevusmaatriksiks nimetatakse ( V − 1) -


mõõtmelist ruutmaatriksit M , kus iga eelnevusrelatsiooni R korral on lisatud kõigisse
lahtritesse mi , j 1 ≤ i, j ≤ V − 1 sümbol R , kui (U i , U j ) ∈ R U = V \ { S} .
Füüsilisel tasemel kodeeritakse eelnevusrelatsioone järgmiselt (binary):
 000 < ⋅ = 011
= 001 ⋅ > = 101
<⋅ 010 <⋅ ⋅> 110
⋅> 100 < ⋅ = ⋅ > 111

Def. Kontekstivaba grammatikat nimetatakse eelnevusgrammatikaks parajasti siis, kui


suvalise kahe sümboli vahel tähestikust V kehtib ülimalt üks eelnevusrelatsioon.
Eelnevusgrammatika võimaldab kiiresti ja väikese vaevaga tekstist leida analüüsipuu.
Näiteid
Eelnevusgrammatika on näiteks Tabel 1. G1.GRM ning Lisa 1. Trigoli keele grammatika.
Eelnevusgrammatika ei ole näiteks Tabel 3. G4.GRM.
Tabel 3. G4.GRM
`T'->#`S'#
`S'->a`A'
`S'->b`B'
`A'->0`A'1
`A'->0 1
`B'->0`B'1 1
`B'->0 1 1

Iga kontekstivaba grammatika saab teisendada eelnevusgrammatikaks. TTS Konstruktor


teeb selle teisenduse automaatselt. G = (VN , VT , P, S ) teisendatakse G ′ = (VN , VT′ , P′, S ) , kus
L( G ) = L( G′) .

9
Automaadid, keeled ja translaatorid (MTAT.05.085) Rein Raudjärv
Eelnevuskonfliktid
Def. Situatsiooni, kus X ja Y ( X , Y ∈ V ) vahel kehtib üle ühe eelnevusrelatsiooni,
nimetatakse eelnevuskonfliktiks.
Eelnevuskonflikte on kaht tüüpi: P1 ja P2 .
P1 -konfliktiks nimetatakse situatsiooni, kus X = ⋅ > Y , X < ⋅ ⋅ > Y või X < ⋅ = ⋅ > Y .
P2 -konfliktiks nimetatakse situatsiooni, kus X < ⋅ = Y .

Eelnevusteisendused
Konfliktide likvideerimiseks on olemas iteratiivne algoritm:
Tabel 4. Eelnevuskonfliktide likvideerimise algoritm

• S1: Kui P2 -konflikte pole, mine S2;


• Iga P2 -konflikti jaoks ( X , Y ) :
o Leia A → xXYy ;
o Asenda leitud produktsioon produktsiooniga A → xXDi ;
o Lisa uus produktsioon Di → Yy ;
• Tee uus eelnevusmaatriks ja mine S1;
• S2: Kui P1 -konflikte pole, STOPP;
• Iga P1 -konflikti jaoks ( X , Y ) :
o Leia A → xXZy Z ∈ L( Y ) või A → xXYy ;
o Asenda leitud produktsioon produktsiooniga A → Di Zy (vastavalt A → DiYy );
o Lisa uus produktsioon Di → xX ;
• Tee uus eelnevusmaatriks ja konfliktide korral mine S1, muidu STOPP.

Eelnevuskonfliktide eemaldamist nimetatakse ka vasakfaktoriseerimiseks.


Produktsiooni parema poole lõhkumist nimetatakse stratifikatsiooniks.

10
Automaadid, keeled ja translaatorid (MTAT.05.085) Rein Raudjärv

6. Pööratava eelnevusgrammatika analüsaator


Lausevormi baas
Väide. Kui G on eelnevusgrammatika G = (VN , VT , P, S ) ja
S⇒ X 1 , X 2 ,..., X k AY1 ,..., Yl ⇒ X 1 , X 2 ,..., X k Z1 ,..., Z mY1 ,..., Yl , kus X i , Z j ∈ V Yh ∈ VT , siis jada
k k

Z1 ,..., Z m on lausevormi baas (viimasena toimis produktsioon A → Z1 ,..., Z m ) ja kehtivad


relatsioonid:
• X i = X i +1 ∨ X i < ⋅ X i +1 ;
• X k < ⋅Z1 ;
• Z j = Z j +1 ;
• Z m ⋅ > Y1 .
Siin i = 1...k j = 1...m h = 1...l .
Lausevormi baasile eelneb tema vasak naaber ning järgneb tema ajastatud naaber.
Def. Kui kontekstivaba grammatika G produktsioonide hulgas ei leidu ühesuguse
parema poolega produktsioone, siis nimetatakse grammatikat G pööratavaks
grammatikaks.

Pööratavate eelnevusgrammatikate analüsaator


Tabel 5. Pööratava eelnevusgrammatika analüsaatori algoritm. Tulemuseks on antud sõna analüüsipuu.

Antud analüüsitav sõna on lekseemide massiiv T [ 0...n] ( T0 = Tn =' # ') .


Olgu M kolmetraktiline magasin (LIFO-tüüpi), mille esimene trakt on sümbolite, teine
relatsioonide ja kolmas analüüsipuu viitade jaoks.
• S1: M :=' # ' ; i := 1 ;
• S2: Kui relatsioon R sümbolite M ja Ti vahel
o puudub, on viga: STOPP;
o M < ⋅Ti :
 S3: P := uus analüüsipuu tipp; Lisa magasini ( Ti , R, P ) ; i = i + 1 ; mine S2;
o M = Ti :
 Kui Ti =' # ' , siis STOPP; muidu mine S3;
o M ⋅ > Ti :
 Detekteerimine (lausevormist baasi leidmine):
x := lausevormi baas ( M sisu tipust kuni relatsioonini < ⋅ );
 Redutseerimine (produktsiooni tagurpidi rakendamine):
kui leidub produktsioon A → x , jätka; muidu viga: STOPP;
 Tee analüüsipuu uus tipp P , ühenda x -i kuuluvate tippude viidad
ahelasse ja ahela esimene lüli tee P alluvaks;
 Eemalda x magasinist ( M tipus on x -le eelnev sümbol);
 Lisa magasini M := ( Ai , R, P ) , siin R on relatsioon M ja A vahel;

11
Automaadid, keeled ja translaatorid (MTAT.05.085) Rein Raudjärv

 Mine S2.
Vaata ka sõna A1.G1 analüüsi.

12
Automaadid, keeled ja translaatorid (MTAT.05.085) Rein Raudjärv

7. Konteksti kasutamine redutseerimiseks ja vastav analüsaator


Sõltumatu kontekst
Kui produktsioonide hulgas on kaks produktsiooni kujul A → x ja B → x , siis tekkib
redutseerimisprobleem: kas analüüsil tuleb asendada lausevormi baas x mitteterminali
A või B -ga. Sel juhul tuleb kasutada mitteterminali piiratud kanoonilist konteksti
BRC (1,1) (i.k. Bounded Right Context) e. mitteterminali piiratud sõltumatut konteksti:
analüüsisammu määravad siis üheselt lausevormi baas x , üks sümbol vasakult ja üks
sümbol paremalt.
Üldjuhul: BRC ( n, m ) on piiratud kanooniline kontekst, n sümboliga vasakult ning m sümboliga paremalt.

Väide. Kui S ⇒  X 1 , X 2 ,..., X k AY1 ,..., Yl ⇒ X 1 X 2 ,..., X k Z1 ,..., Z mY1 ,..., Yl ( Yi ∈ VT ) ,


k k

siis kehtivad relatsioonid:


• X k < ⋅ A ∨ X k = A ;

• A < ⋅Y1 ∨ A = Y1 ∨ A⋅ > Y1 .

Moodustatakse mitteterminali A ∈ VT ⊂ V vasaku (left context) ja parema sõltumatu


konteksti (right context) hulgad LC ( A) ja RC ( A) :
LC ( A) := { X : ( X < ⋅ A ∨ X = A) & X ∈ V }
RC ( A) := { X : ( A < ⋅ X ∨ A = X ∨ A⋅ > X ) & X ∈ VT }
Vasaku konteksti moodustavad eelnevusmaatriksis mitteterminalile A vastavas veerus
mittetühjadele lahtritele (loevad ainult < ⋅ ja = , mitte ⋅ > ) vastavate ridade sümbolid.
Parema konteksti moodustavad eelnevusmaatriksis mitteterminalile A vastavas reas
mittetühjadele lahtritele vastavate veergude lekseemid.
Def. Hulka C1|1 ( A) := LC ( A) × RC ( A) nimetatakse mitteterminali A (1 | 1) -sõltumatuks
kanooniliseks kontekstiks.

Def. Kui A → x, B → x A, B ∈ VN x ∈ V ning kehtib C1|1 ( A) ∩ C1|1 ( B ) = ∅ , siis ütleme, et


*

mitteterminalide A ja B sõltumatud kontekstid eristuvad ning G on (1 | 1) -


redutseeritav eelnevusgrammatika.

13
Automaadid, keeled ja translaatorid (MTAT.05.085) Rein Raudjärv
BRC(1,1) analüsaator
Tabel 6. BRC(1,1) analüsaatori algoritm (Markeeritud on erinevused võrreldes pööratava EG analüsaatoriga)

Antud analüüsitav sõna on lekseemide massiiv T [ 0...n] .


Olgu M kolmetraktiline magasin (LIFO-tüüpi), mille esimene trakt on sümbolite, teine
relatsioonide ja kolmas analüüsipuu viitade jaoks.
• S1: M :=' # ' i := 1 ;
• S2: Kui relatsioon R sümbolite M ja Ti vahel
o puudub, on viga: STOPP;
o M < ⋅Ti :
 P := uus analüüsipuu tipp; Lisa magasini ( Ti , R, P ) ; i = i + 1 ; mine S2;
o M = Ti :
 Kui Ti =' # ' , siis STOPP; muidu mine S3;
o M ⋅ > Ti :
 S3: Detekteerimine (lausevormist baasi leidmine):
x := lausevormi baas ( M sisu tipust kuni relatsioonini < ⋅ );
 Redutseerimine (produktsiooni tagurpidi rakendamine):
kui leidub produktsioon A → x , jätka; muidu viga: STOPP;
 Kui on ainult üks selline produktsioon, mine S4;
 L := M − 1 ; kas on mitu mitteterminali Ai , kus LC ( Ai ) = L ?
• Ei: mine S4;
•Jah: A := see Ai → x , mille RC ( Ai = Ti ) ;
 S4: Tee analüüsipuu uus tipp P , ühenda x -i kuuluvate tippude viidad
ahelasse ja ahela esimene lüli tee P alluvaks;
 Eemalda x magasinist ( M tipus on x -le eelnev sümbol);
 Lisa magasini M := ( Ai , R, P ) , siin R on relatsioon M ja A vahel;
 Mine S2.

Pööratava EG analüsaatori algoritm on BRC (1,1) analüsaatori algoritmi erijuht, kui


redutseerimisel leidub alati ainult üks produktsioon A → x .

14
Automaadid, keeled ja translaatorid (MTAT.05.085) Rein Raudjärv

8. Derivatsioonist sõltuv kontekst


Kui produktsioonide hulgas on kaks produktsiooni kujul A → x ja B → x ning kehtib
C1|1 ( A) ∩ C1|1 ( B ) ≠ ∅ , siis G pole (1 | 1) -redutseeritav eelnevusgrammatika. Paljudel sellistel
juhtudel aitab derivatsioonist sõltuv kontekst ( BRC (1,1) nim. ka sõltumatuks
kontekstiks, kuivõrd kontekst leitakse eelnevusmaatriksist sõltumatult derivatsioonist.)
Derivatsioonist sõltuva konteksti autor on Mati Tombak.
Moodustatakse mitteterminali A ∈ VT ⊂ V vasaku (left context) ja parema sõltuva
konteksti (right context) hulgad LC ( A) ja RC ( A) :
{
LC ( A) := X : S ⇒
 uXAv
k
}
RC ( A) := {T : S ⇒
 uATv & Tv ∈ V } T
*
k

Siin: X ∈ V A ∈ VN T ∈ VT u ∈ V v ∈ VT .
* *

(
Def. Hulka C1,1 ( A) := ( X , T ) : S ⇒ )
 uXATv & Tv ∈ VT* nimetatakse mitteterminali A
k

derivatsioonist sõltuvaks kontekstiks.

Väide. C1,1 ( A) arvutuseeskiri on järgmine:


C1,1 ( A) = γ 1 ( A) ∪ γ 2 ( A) ∪ γ 3 ( A) ∪ γ 4 ( A)

γ 1 ( A) := { ( X , T ) : B → uXADv ∈ P & [T = DvT ∈ L( D ) ]}


γ 2 ( A) := { ( X , T ) : B → uXA ∈ P & T ∈ RC ( B )}
γ 3 ( A) := { ( X , T ) : B → ADv ∈ P & X ∈ LC ( B ) & [T = DvT ∈ L( D ) ]}
γ 4 ( A) := {( X , T ) : B → A ∈ P & ( X , T ) ∈ C1,1 ( B )}

Def. Kui A → x, B → x A, B ∈ VN x ∈ V ning kehtib C1,1 ( A) ∩ C1,1 ( B ) = ∅ , siis ütleme, et


*

mitteterminalide A ja B derivatsioonist sõltuvad kontekstid eristuvad ning G on


(1,1) -redutseeritav eelnevusgrammatika.
Derivatsioonist sõltuva konteksti arvutuseeskiri võib tekitada lõpmatu tsükli e.
ringsõltuvuse (nn „surmahaare”). Sellisel juhul sõltuv kontekst ei eristu.
Analüüsi põhimõtteline algoritm on sama, mis (1,1) -redutseeritava grammatika jaoks.

15
Automaadid, keeled ja translaatorid (MTAT.05.085) Rein Raudjärv

Sõltuva kontekstiga grammatika näide


Tabel 7. G8.GRM
`T'->#`S'#
`S'->a`A'a
`S'->b`A'b
`S'->a`B'b
`S'->b`B'a
`A'->1
`B'->1

Näiteks Tabel 7. G8.GRM puhul mitteterminalide A ja B sõltumatu kontekst kattub


täielikult: C1|1 ( A) = C1|1 ( B ) = { ( a, a ) , ( a, b ) , ( b, a ) , ( b, b )} .

Keeles L( G8) on ainult 4 sõna:


S ⇒ aAa ⇒ a1a
S ⇒ bAb ⇒ b1b
S ⇒ aBb ⇒ a1b
S ⇒ bAa ⇒ b1a
ja näeme, et A kontekst on { ( a, a ) , ( b, b )} ning B kontekst on { ( a, b ) , ( b, a )} .
Vaata ka sõna Y.G8 analüüsi.
Mitteredutseeritava grammatika näide
Grammatika Tabel 3. G4.GRM pole redutseeritav.

16
Automaadid, keeled ja translaatorid (MTAT.05.085) Rein Raudjärv

9. Konteksti juurdetoomine
Kui sõltuv kontekst ei eristu, siis on paratamatu inimese sekkumine: pole teada algoritmi,
millega saaks garanteeritult grammatikat nii teisendada, et ta oleks redutseeritav.
Translaatori tegijale soovitatakse võimaluse korral juurde tuua vasakut konteksti ja kui
see pole võimalik, siis tuleb muuta keelt.
Näide
Vaatame, millest on tingitud grammatika Tabel 3. G4.GRM konteksti eristamatus.
Teeme kaks derivatsiooni:
T ⇒# S # ⇒# aA# ⇒# a 0 A1#
T ⇒# S # ⇒# bB # ⇒# b0 B11#
Püüame juurde tuua erineva vasaku konteksti, asendades kaks produktsiooni:
produktsioon A → A1 produktsiooniga A → CA1 ja
produktsioon B → 0B11 produktsiooniga B → DB11
ja lisades kaks uut produktsiooni:
C →0
D→0
Selliselt parandatud grammatika on Tabel 8. G41.GRM.
Tabel 8. G41.GRM
`T'->#`S'#
`S'->a`A'
`S'->b`B'
`A'->`C'`A'1
`A'->0 1
`B'->`D'`B'1 1
`B'->0 1 1
`C'->0
`D'->0

17
Automaadid, keeled ja translaatorid (MTAT.05.085) Rein Raudjärv

10. Analüüsi puu moodustamise juhtimine. Analüsaatori lõplik


algoritm
Analüüsi puu liiasus
Vajadus analüüsi puu moodustamise juhtimiseks tuleneb sellest, et analüsaator teeb liiase
puu.
Näiteks Lisa 1. Trigoli keele grammatika teeb derivatsiooni sõnani y := a + 1 järgmiselt
(loobume mitteterminalide apostroofidest ja sõna ümbritsevatest markeritest):
programm ⇒ programm12 ⇒ operaatorid ⇒ operaator ⇒ omistamine
⇒ muutuja:=omistamine1 ⇒ muutuja:=aritmav ⇒
muutuja:=aritmav+aritmav2 ⇒ muutuja:=aritmav+yksliige ⇒
muutuja:=aritmav+tegur ⇒ muutuja:=aritmav+1 ⇒
muutuja:=yksliige+1 ⇒ muutuja:=tegur+1 ⇒ muutuja:=a+1 ⇒ y:=a+1
Analüüsi puu (esitame keskjärjekorras läbituna) on järgmine:
programm(programm12)
programm12(operaatorid)
operaatorid(operaator)
operaator(omistamine)
omistamine(muutuja := omistamine1)
muutuja(y)
y( ∅ )
omistamine1(aritmav)
aritmav(yksliige)
aritmav(aritmav + aritmav2)
yksliige(tegur)
tegur(a)
a( ∅ )
aritmav2(yksliige)
yksliige(tegur)
tegur(1)
1( ∅ )
Vaja on aga sellist puud:
programm(omistamine)
omistamine(y aritmav)
y( ∅ )
aritmav(a 1)
a( ∅ )
1( ∅ )

18
Automaadid, keeled ja translaatorid (MTAT.05.085) Rein Raudjärv

TTSi semantilised muutujad


Puu moodustamist juhitakse semantiliste muutujate abil – need on naturaalarvud σ > 0 ,
mis seotakse lihtsa keele abil kas produktsioonide või terminaalse tähestiku sümbolitega.
TTSis esitatakse semantika lihtsa ASCII-failina, mille nimeks on xxx.sem (grammatikale
xxx.grm). Näiteks Trigoli keele semantika on järgmine:
Tabel 9. TRI.SEM
4=1 $ #i#
11=2 $ #c#
p32=3 $ <
p33=4 $ >
p34=5 $ <=
p35=6 $ >=
p36=7 $ /=
p37=8 $ =
p13=10 $ omistamine->muutuja:=omistamine1
p26=11 $ yksliige->yksliige/tegur
p25=12 $ yksliige->yksliige*yksliige4
p21=13 $ aritmav->aritmav-aritmav3
p20=14 $ aritmav->aritmav+aritmav2
p12=15 $ label->#i#
p18=16 $ suunamine->GOTO label
p44=18 $ tingimus->IF loogilav THEN
$ p17=19 iflause->tingimus operaator
p45=20 $ lugemine->READ #i#
p46=21 $ kirjutamine->WRITE #i#

Vaatame siit nt. kahte rida:


4=1 $ #i#
p13=10 $ omistamine->muutuja:=omistamine1
#1# järjekorranumber tähestikus V on 4 (seda on hõlpus leida Trigoli grammatika
terminaalsest sõnastikust (vt. Konstruktori protokolli Tri.htm osa „Terminal alphabet”)) ning
identifikaatorite semantika σ #i # := 1 .
Märgiga „$” algav reaosa on fakultatiivne; see on mõeldud semantikafaili lugemise
hõlbustamiseks.
Produktsiooni „omistamine->muutuja:=omistamine1” järjekorranumber produkt-
sioonide hulgas P on 13 (vt. Konstruktori protokolli Tri.htm osa „Productions”) ja tema
semantika σ P13 := 10 .
Semantikafaili töötleb Konstruktor. Kui xxx.sem pole ette antud, siis Konstruktor genereerib
selle ise, omistades semantika kõigile terminalidele ja kõigile produktsioonidele (soovitada
võibki uue grammatika puhul nii teha – Konstruktor teeb veatu ja kommenteeritud tekstifaili
ja sellega on lihtne manipuleerida, elimineerides mittevajaliku semantika vastava rea
kommentaariks muutmisega, lisades rea algusse „$”).

19
Automaadid, keeled ja translaatorid (MTAT.05.085) Rein Raudjärv
Analüsaatori lõplik algoritm
Tabel 10. Analüsaatori lõplik algoritm (Markeeritud on erinevused võrreldes BRC(1,1) analüsaatoriga)

Antud analüüsitav sõna on lekseemide massiiv T [ 0...n] .


Olgu M kolmetraktiline magasin (LIFO-tüüpi): MS trakt on sümbolite, MR relatsioonide
ja MV analüüsipuu viitade jaoks.
• S1: MS := T0 i := 1 ;
• S2: Kui relatsioon R sümbolite M ja Ti vahel
o puudub, on viga: STOPP;
o MS < ⋅Ti :
 Kui σ Ti > 0 : MV := uus analüüsipuu tipp; muidu MV := ∅ ;
 MS := Ti ; MR := R ; i = i + 1; mine S2;
o M = Ti :
 Kui Ti =' # ' , siis STOPP; muidu mine S3;
o M ⋅ > Ti :
 Detekteerimine (lausevormist baasi leidmine):
x = lausevormi baas ( MS sisu tipust kuni relatsioonini < ⋅ );
 Redutseerimine (produktsiooni tagurpidi rakendamine):
kui leidub produktsioon A → x , jätka; muidu viga: STOPP;
 Kui on ainult üks selline produktsioon, mine S4;
 L : MS − 1 ; kas on mitu mitteterminali Ai , kus LC ( Ai ) = L ?
• Ei: mine S4;
• Jah: A := see Ai → x , mille RC ( Ai = Ti ) ;
 S4: Läbi lausevormi baasile vastav osa MV -st vasakult paremale ja
ühenda viidatud tipud omavahel ahelasse (kui tipul on naabrid, siis
ühenda ka need),
 P := viit ahela esimesele lülile. Võib juhtuda, et P = ∅ .
 Eemalda x magasinist;
 MS := A . MR := Ri , kus R on relatsioon MS − 1 ja Ti vahel.
 Kui σ A→ x > 0 , siis N := uus analüüsi puu tipp; MV := N ; N -i alluv := P .
 Kui σ A→ x = 0 , siis MV := P ;
• S3: i := i + 1 ; kui i ≤ n , siis mine S2.

20
Automaadid, keeled ja translaatorid (MTAT.05.085) Rein Raudjärv

11. TTS Konstruktori üldine skeem


Tabel 11. TTS Konstruktori üldine skeem

Konstruktori lähteandmeteks on keele xxx produktsioonide hulk xxx.grm ja fakultatiivselt


xxx semantikafail xxx.sem.
Käsurealt käivitatuna: wcr32 xxx
• S1: Moodusta KVG xxx.grm baasil terminaalne ja mitteterminaalne tähestik VT ja VN ;

• S2: Moodusta ∀A ∈ VN jaoks hulgad L( A) ja R( A) .

• Koosta ( n × n ) -maatriks PM ( n := V + 1 ) ja kanna sinna kõik V sümbolite vahelised


eelnevusrelatsioonid. PM on eelnevusmaatriks
• Kas xxx on eelnevusgrammatika?
o Kui ei, siis tee eelnevusteisendused ja mine S2;
• Kas xxx on pööratav eelnevusgrammatika?
o Kui jah, siis mine S3;
• Moodusta sõltumatu konteksti hulgad maatriksitena (1 × n ) -maatriks LC ja (1 × m ) -
maatriks RC ( l := VN m := VT );
• Kas sõltumatu kontekst eristub?
o Kui jah, siis kirjuta kettale xxx.lc ja xxx.rc; mine S3;
• Moodusta derivatsioonist sõltuva konteksti hulgad nende mitteterminalide jaoks,
mille sõltumatu kontekst ei eristu;
• Kas sõltuv kontekst eristub?
o Kui jah, siis kirjuta kettale xxx.lc, xxx.rc ja xxx.dc; mine S3;
• Kirjuta kettale xxx.htm (Konstruktori logi) ja välju Konstruktorist.
• Püüa käsitsi juurde tuua vasakut konteksti (so. paranda grammatikat) ja mine S1;
• S3: Kas kettal on semantikafail xxx.sem?
o Kui ei, siis genereeri tekstifail xxx.sem;
• Tee parameetrite tabel xxx.prm ja semantikatabel xxx.sm; kirjuta kettale xxx.prm,
xxx.sm, xxx.v (tähestiku V puu), xxx.ht (redutseerimistabel), xxx.t (tähestik V ), xxx.tt
(skanneri tabel), xxx.htm (Konstruktori logi) ja xxxrd.htm (Konstruktori tabelid – vt. nt.
g8rd.htm). Välju Konstruktorist.

21
Automaadid, keeled ja translaatorid (MTAT.05.085) Rein Raudjärv

Lisa 1. Trigoli keele grammatika


TRI.GRM
`programm' -> `programm12'#
`programm12' -> #`operaatorid'
`operaatorid' -> `operaator'
-> `operaatorid13';`operaatorid'
`operaatorid13' -> `operaator'
`operaator' -> `label':`operaator'
-> `omistamine'
-> `iflause'
-> `suunamine'
-> `lugemine'
-> `kirjutamine'
`label' -> #i#
`omistamine' -> `muutuja':=`omistamine1'
-> `muutuja':=`loogilav'
`omistamine1' -> `aritmav'
`muutuja' -> #i#
`iflause' -> `tingimus'`operaator'
`suunamine' -> GOTO`label'
`aritmav' -> `yksliige'
-> `aritmav'+`aritmav2'
-> `aritmav'-`aritmav3'
`aritmav2' -> `yksliige'
`aritmav3' -> `yksliige'
`yksliige' -> `tegur'
-> `yksliige'*`yksliige4'
-> `yksliige'/`tegur'
`yksliige4' -> `tegur'
`tegur' -> #i#
-> #c#
-> (`tegur5'
`tegur5' -> `aritmav')
`loogilav' -> `aritmav'<`loogilav6'
-> `aritmav'>`loogilav7'
-> `aritmav'<=`loogilav8'
-> `aritmav'>=`loogilav9'
-> `aritmav'/=`loogilav10'
-> `aritmav'=`loogilav11'
`loogilav6' -> `aritmav'
`loogilav7' -> `aritmav'
`loogilav8' -> `aritmav'
`loogilav9' -> `aritmav'
`loogilav10' -> `aritmav'
`loogilav11' -> `aritmav'
`tingimus' -> IF`loogilav'THEN
`lugemine' -> READ #i#
`kirjutamine' -> WRITE #i#

22