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 [xxx.sem]

Analüsaator (Parser)
yyy.prm yyy.pt yyy.t [yyy.it] [yyy.kt]

Konstruktor (Constructor)
xxx.prm xxx.v xxx.ht xxx.pm xxx.t xxx.tt xxx.sm [xxx.lc] [xxx.rc] [xxx.dc]

Interpretaator (Interpreter)
Lahendamistul emused

Kompilaator (Compiler)
yyy.asm yyy.exe

Trigol – TTS jaoks loodud primitiivne programmeerimiskeel. TTS kodulehekülg: http://www.cs.ut.ee/~isotamm/tts/HELP.HTM

Tähistus
G KVG EG V VN

VT P S → ⇒  ⇒  ⇒
k k

grammatika kontekstivaba grammatika eelnevusgrammatika tähestik ( a, A, b,1,0,... ) mitteterminaalne e. mõistete tähestik ( A, B,... ) terminaalne e. lekseemide tähestik (leksika) ( a,b,1,0, # ,... ) produktsioon ( A → x ) aksioom produtseerib (produces) on vahetult tuletatav on tuletatav ? ? 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 BackusNaur 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
jada z k , z k −1 ,..., z1 , z 0 nimetatakse sõna x analüüsiks.

= x . Siis

* 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 produktsiooni kujul A → A või mille keeles leidub tühisõna, on mitmesed.  A⇒ A või

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) 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

Rein Raudjärv

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 genereerimine) – produktsiooni tagurpidi rakendamine (uue lause vormi

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}  X < ⋅Y = { ( X , Y ) : ∃φ : A → uXBv & Y ∈ L( B )}  ( X , Y ) : [ ∃φ : A → uBYv & X ∈ R ( B ) ]  X⋅ > Y =   ∨ [ ∃φ : A → uBCv & X ∈ R( B ) & Y ∈ L( C ) ] 
* Siin X , Y ∈ V A, B, C ∈ VN u , v ∈ V .

(loe: X ajastub Y -ga) (loe: X eelneb Y -ile) (loe: X järgneb Y -ile)

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 001 010 100

<⋅ =  ⋅> =  <⋅ ⋅> <⋅ = ⋅> 

011 101 110 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: P ja P2 . 1   P -konfliktiks nimetatakse situatsiooni, kus X = ⋅ > Y , X < ⋅ ⋅ > Y või X < ⋅ = ⋅ > Y . 1  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 P -konflikte pole, STOPP; 1 Iga P -konflikti jaoks ( X , Y ) : 1 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 o o M < ⋅Ti :  S3: P := uus analüüsipuu tipp; Lisa magasini ( Ti , R, P ) ; i = i + 1 ; mine S2; Kui Ti =' # ' , siis STOPP; muidu mine 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; 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 M = Ti :        M ⋅ > Ti :

Automaadid, keeled ja translaatorid (MTAT.05.085)  Mine S2.

Rein Raudjärv

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 o o M < ⋅Ti :  P := uus analüüsipuu tipp; Lisa magasini ( Ti , R, P ) ; i = i + 1 ; mine S2; Kui Ti =' # ' , siis STOPP; muidu mine S3; 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 ? 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. • Ei: mine S4; M = Ti :       M ⋅ > Ti :

   

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) :

{ }  RC ( A) := {T : S ⇒ uATv & Tv ∈ V }
 LC ( A) := X : S ⇒ uXAv
k k * T

* * 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 ringsõltuvuse (nn „surmahaare”). Sellisel juhul sõltuv kontekst ei eristu.

tsükli

e.

Analüüsi põhimõtteline algoritm on sama, mis (1,1) -redutseeritava grammatika jaoks.

15

Automaadid, keeled ja translaatorid (MTAT.05.085) 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

Rein Raudjärv

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 produktsioonide 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 :   o o      Kui σ Ti > 0 : MV := uus analüüsipuu tipp; muidu MV := ∅ ; MS := Ti ; MR := R ; i = i + 1; mine S2; Kui Ti =' # ' , siis STOPP; muidu mine S3; 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 ) ;

M = Ti :  M ⋅ > 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' `operaatorid' `operaatorid13' `operaator' -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> `programm12'# #`operaatorid' `operaator' `operaatorid13';`operaatorid' `operaator' `label':`operaator' `omistamine' `iflause' `suunamine' `lugemine' `kirjutamine' #i# `muutuja':=`omistamine1' `muutuja':=`loogilav' `aritmav' #i# `tingimus'`operaator' GOTO`label' `yksliige' `aritmav'+`aritmav2' `aritmav'-`aritmav3' `yksliige' `yksliige' `tegur' `yksliige'*`yksliige4' `yksliige'/`tegur' `tegur' #i# #c# (`tegur5' `aritmav') `aritmav'<`loogilav6' `aritmav'>`loogilav7' `aritmav'<=`loogilav8' `aritmav'>=`loogilav9' `aritmav'/=`loogilav10' `aritmav'=`loogilav11' `aritmav' `aritmav' `aritmav' `aritmav' `aritmav' `aritmav' IF`loogilav'THEN READ #i# WRITE #i#

`label' `omistamine' `omistamine1' `muutuja' `iflause' `suunamine' `aritmav' `aritmav2' `aritmav3' `yksliige' `yksliige4' `tegur' `tegur5' `loogilav'

`loogilav6' `loogilav7' `loogilav8' `loogilav9' `loogilav10' `loogilav11' `tingimus' `lugemine' `kirjutamine'

22

Sign up to vote on this title
UsefulNot useful