Täydentäviä muistiinpanoja kontekstittomien kielioppien jäsentämisestä Antti-Juhani Kaijanaho 30. marraskuuta 2015 1 Yksiselitteiset operaattorikieliopit 1.1 Aritmeettiset lausekkeet Tällä kurssilla on tullut tutuksi aritmeettisten lausekkeiden moniselitteinen kielioppi E c E E + E E E E E E / E (E) Tässä kieliopissa on yksi prefiksioperaattori ( ), neljä infiksioperaattoria (+,, ja /) ja kaksi primäärilauseketta (c ja (E)). Huomaa, että yksi päätemerkeistä on kaksoisroolissa: on sekä prefiksioperaattori (negaatio) että infiksioperaattori (vähennyslasku). Tavanomainen aritmeettisten operaattoreiden presedenssijärjestys on seuraava: korkein presedenssi on negaatiolla, seuraavaksi korkein on kerto- ja jakolaskulla, ja alin presedenssi on yhteen- ja vähennyslaskulla. Aritmetiikassa ei ole väliä, ovatko yhteen-, vähennys- ja kertolasku vasemmalle vai oikealle assosiatiivisia, mutta tavanomaista ohjelmointikielissä on julistaa ne vasemmalle assosiatiivisiksi. Jakolaskulle on luonnollista ottaa sama assosiatiivisuus kuin kertolaskulle. Prefiksioperaattorina negaatio on luontevimmin oikealle assosiatiivinen, jolloin 4 = ( 4). Lajitellaan nyt operaattorit luokkiin. Aritmeettisten lausekkeiden tapauksessa luokilla on vakiintuneet nimet: 1. Lausekeluokkaan (engl. expressions) kuuluvat yhteen- ja vähennyslaskut. TIEA241 Automaatit ja kieliopit, syksy 2015; Earleyn algoritmin soveltamisesimerkkiä korjattu lievästi 30.11.2015. 1
2. Termiluokkaan (engl. terms) kuuluvat kerto- ja jakolaskut. 3. Tekijäluokkaan (engl. factors) kuuluu negaatio. Lisäksi lisätään loppuun primäärilausekkeiden luokka, johon kuuluvat vakiolausekkeet ja suljelausekkeet. Valitaan kullekin luokalle englanninkielisen nimen alkukirjain välikesymboliksi: E, T, F ja P. Noudattamalla kalvojen menetelmää edelleen saadaan seuraava yksiselitteinen kielioppi: E T E + T E T T F T F T / F F P F P c (E) 1.2 Säännölliset lausekkeet Säännöllisille lausekkeille voidaan kirjoittaa seuraava moniselitteinen kontekstiton kielioppi: R () c R RR R R (R) (Huomaa kieliopissa valintaa merkitsevän pystyviivan ja päätemerkin huonosti näkyvä mutta erittäin tärkeä ero.) Aluksi todetaan operaattorit. Löytyy yksi postfiksioperaattori ( ), kaksi infiksioperaattoria (ε ja ) ja neljä primäärilauseketta (, c, () ja (R)). Ne muodostavat presedenssiluokat seuraavasti: 1. 2. ε 3. Näille ei ole erityisiä nimiä, joten käytetään välikesymbolien niminä alaindeksoitua R:ää. Käsitellään kaikkia operaattoreita vasemmalle assosiatiivisina. Nyt saadaan seuraava yksiselitteinen kielioppi: R 1 R 2 R 1 R 2 R 2 R 3 R 2 R 3 R 3 R 4 R 3 R 4 c () (R 1 ) 2
2 Vasemman rekursion poisto Molemmat edellä laaditut yksiselitteiset kieliopit ovat vasenrekursiivisia. Sen poistaminen johtaa seuraavanlaisiin kielioppeihin: E T E E ε + T E T E T F T T ε F T / F T F P F P c (E) R 1 R 2 R 1 R 1 ε R 2 R 1 R 2 R 3 R 2 R 2 ε R 3 R 2 R 3 R 4 R 3 R 3 ε R 3 R 4 c () (R 1 ) 3 Esimerkki Earleyn algoritmin soveltamisesta Tarkastellaan kielioppia G : E E + E E E (E) c ja sovelletaan Earleyn algoritmia siihen sekä merkkijonoon c + c c. Seuraavassa esityksessä on yksi taulukko per S i -joukko. Taulukon otsikkorivillä kerrotaan, mistä joukosta on kyse, sekä mitä kohtaa merkkijonosta se tarkastelee (jolloin selaus tarkastelee pisteen jälkeistä merkkiä). Kukin taulukko luetteloi (ja numeroi) joukossa olevat asetelmat siinä järjestyksessä, jossa ne on siihen lisätty. Kunkin asetelman kohdalla on kerrottu, miksi se on joukkoon lisätty (sulkeissa olevat numerot viittaavat aiempiin riveihin). Jos sama asetelma tulee lisättäväksi samaan taulukkoon useampaan kertaan, käytetään ensimmäisen lisäyksen riviä merkitsemään myös myöhempien lisäysten syyt. 3
S 0 c + c c 1 S E, 0 alustus 2 E E + E, 0 ennustus (1, 2, 3) 3 E E E, 0 ennustus (1, 2, 3) 4 E (E), 0 ennustus (1, 2, 3) 5 E c, 0 ennustus (1, 2, 3) S 1 c +c c 1 E c, 0 selaus S 0 (5) 2 S E, 0 täydennys (1), S 0 (1) 3 E E +E, 0 täydennys (1), S 0 (2) 4 E E E, 0 täydennys (1), S 0 (3) S 2 c + c c 1 E E + E, 0 selaus S 1 (3) 2 E E + E, 2 ennustus (1, 2, 3) 3 E E E, 2 ennustus (1, 2, 3) 4 E (E), 2 ennustus (1, 2, 3) 5 E c, 2 ennustus (1, 2, 3) S 3 c + c c 1 E c, 2 selaus S 2 (5) 2 E E + E, 0 täydennys (1), S 2 (1) 3 E E +E, 2 täydennys (1), S 2 (2) 4 E E E, 2 täydennys (1), S 2 (3) 5 S E, 0 täydennys (2), S 0 (1) 6 E E +E, 0 täydennys (2), S 0 (2) 7 E E E, 0 täydennys (2), S 0 (3) S 4 c + c c 1 E E E, 2 selaus S 3 (4) 2 E E E, 0 selaus S 3 (7) 3 E E + E, 4 ennustus (1, 2) 4 E E E, 4 ennustus (1, 2) 5 E (E), 4 ennustus (1, 2) 6 E c, 4 ennustus (1, 2) 4
S 5 c + c c 1 E c, 4 selaus S 4 (6) 2 E E E, 2 täydennys (1), S 4 (1) 3 E E E, 0 täydennys (1), S 4 (2) 4 E E +E, 4 täydennys (1), S 4 (3) 5 E E E, 4 täydennys (1), S 4 (4) 6 E E + E, 0 täydennys (2), S 2 (1) 7 E E +E, 2 täydennys (2), S 2 (2) 8 E E E, 2 täydennys (2), S 2 (3) 9 S E, 0 täydennys (3, 6), S 0 (1) 10 E E +E, 0 täydennys (3, 6), S 0 (2) 11 E E E, 0 täydennys (3, 6), S 0 (3) Koska (S E, 0) S 5 pätee, julistetaan että c + c c L(G) myös pätee. Edellä olevista taulukoista voidaan myös lukea jäsennyspuut. Piirretään ensiksi sellaiset puut, joissa solmuina ovat algoritmin taulukoista löytyvät asetelmat. Asetelmojen väliset suhteet luetaan taulukoista seuraavasti: Asetelma (S E, 0) on puun juuri. Asetelma A on jonkin toisen asetelman B oikeanpuolimmainen lapsi, jos asetelma B on merkitty johdetuksi täydennyksellä samassa taulukossa olevasta asetelmasta A. Jos asetelmalla on useita oikeanpuolimmaisia lapsia, on kyse tilanteesta, jossa on useita jäsennyspuita. Valitsemalla oikeanpuolimmaisista lapsista jonkin saadaan aikaan jokin jäsennyspuista. Asetelma, joka on johdettu toisesta selauksella taikka täydennyksellä jostakin edellisen taulukon asetelmasta, on sen oikeanpuoleinen sisarus. Sisarussuhdeketjussa tulee olla kaikilla asetelmilla sama produktio. Jos näin ei ole, algoritmia on sovellettu väärin. Sisarussuhdeketjun yhteisen produktion oikean puolen kutakin symbolia kohden pitää olla ketjussa asetelma, jossa piste on ko. symbolin kohdalla. Jos näin ei ole, puu on hylättävä epäonnistuneena jäsennysyrityksenä. Seuraavat ei-hylättävät puut saadaan aikaan. Merkitsen asetelman siten lyhentäen, että laitan varsinaiseksi merkiksi sen merkin, joka tulee asetelmassa ennen pistettä, ja varustan sen ylä- ja alaindekseillä i, j, joissa i kertoo sen 5
taulukon ja j sen rivin, josta asetealma löydettiin puuhun. Yläindeksi viittaa oikeanpuolimmaisella (tai ainoalla) sisaruksella ylenevään polveen ja muilla sisaruuteen oikealle päin. Alaindeksi viittaa suhteeseen oikeanpuolimmaiseen (tai ainoaan) lapseen. Siis esimerkiksi E 5,6 3,2 kertoo, että kyseisessä asetelmassa pistettä edeltää E, että sen vanhempi selviää tarkastelemalla taulukon S 5 rivin 6 suhteita ja että sen lapsi selviää tarkastelemalla taulukon S 3 rivin 2 suhteita. E 5,9 E 3,5 E 3,7 5,14 4,2 E 5,3 5,3 E 1,3 1,3 + 2,1 E 3,2 5,6 E 1,3 1,3 + 2,1 E 5,6 3,2 c 5,1 c 1,1 E 3,4 3,4 4,1 E 5,2 5,2 c 1,1 c 3,1 c 3,1 c 5,1 6