TIEA241 Automaatit ja, kevät 2012 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 2. helmikuuta 2012
Sisällys
Sisällys
Chomskyn hierarkia kieli säännöllinen kontekstiton kontekstinen rekursiivisesti lueteltava automaatti äärellinen pino lineaarirajoitettu Turingin kone
Sisällys
Formaalisti Määritelmä Nelikko G = (V, Σ, P, S) on kontekstiton kielioppi (engl. context-free grammar, ), jos seuraavat väitteet pätevät: V on epätyhjä, äärellinen joukko (muuttujat eli nonterminaalit eli välikemerkit eli syntaktiset kategoriat) Σ on epätyhjä, äärellinen joukko (päätemerkit eli terminaalit) V Σ = P V (V Σ) (produktiot eli kielioppisäännöt) S V (aloitusmerkki) 1 1 Formaali määritelmä siis kiinnittää, minkä välikemerkin kieltä tarkastellaan.
Tavanomainen esitystapa Produktiot (v, w) P luetellaan kukin omalla rivillään muodossa v w. Aloitusmerkin produktiot luetellaan ensimmäisenä. Saman välikemerkin produktiot voidaan esittää lyhennysmerkinnällä: A ω 1 ω 2 on sama kuin A ω 1 A ω 2 Produktion oikean puolen tyhjyyttä voidaan korostaa käyttämällä ε-merkintää: A ε Kaikki merkit, jotka esiintyvät produktion vasemmalla puolella, ovat välikemerkkejä, ja muut ovat päätemerkkejä, ellei muuta sanota.
Käyttäytyminen Määritelmä Olkoon G = (V, Σ, P, S), olkoot v, u, w (V Σ) välike- ja päätemerkkien jonoja, ja olkoon A V välikemerkki. Merkkijono vaw antaa (engl. yields) merkkijonon vuw, merkitään vaw G vuw, 2 jos A u on G:n produktio eli jos (A, u) P pätee. 2 Alaindeksi G voidaan jättää pois, jos on selvää, mitä kielioppia tarkoitetaan.
Sisällys
Määritelmä Olkoon G = (V, Σ, P, S). Pääte- ja välikemerkkien jonosto v 0,..., v n 1 (V Σ), jolle pätee i {1,..., n 1} : v i 1 G v i, on v n 1 :n johto v 0 :sta, ja sitä merkitään usein v 0 G G v n 1 tai lyhentäen v 0 G v n 1. Luku n on johdon pituus. Olkoot w, u (V Σ) välike- ja päätemerkkien jonoja. Jos on olemassa w:n johto u:sta, niin u johtaa eli tuottaa (engl. derives) w:n, merkitään u G w.
kielet Määritelmä Kontekstittoman kieliopin G = (V, Σ, P, S) tuottama kieli on L(G) = { w Σ S G w } Määritelmä Kieli on kontekstiton (engl. context-free), jos on olemassa kontekstiton kielioppi, joka tuottaa sen.
L(G):tä koskevien todistusten strategia Olkoon G = (V, Σ, P, S). Todistettava, että L(G):n kaikilla merkkijonoillaw L(G) on ominaisuus P(w). Määritellään kullekin välikemerkkille A V ominaisuus P A ( ). Todistetaan 3, että w Σ : P(w) P S (w) pätee. Todistetaan, että A V, w (V Σ) : P A (w) (A G w) pätee. Todistetaan, että A V, w (V Σ) : (A G w) P A (w) pätee. 3 Tämä usein sivuutetaan triviaalina.
Esimerkki Lause Olkoon G seuraava kontekstiton kielioppi. S asb ε Tällöin L(G) = { a k b k k N } pätee. Todistus Taululla.
Vasen ja oikea johto Määritelmä Olkoon G = (V, Σ, P, S) kontekstiton kielioppi ja olkoon v 0 G G v n 1 johto. Jos kaikilla i {1,..., n 1} on olemassa u Σ ja w, ω 1,..., ω m (V Σ) ja A V siten, että v i 1 = uaw ja v i = uω 1 ω m w pätevät, kyseinen johto on vasen johto (engl. leftmost derivation). Jos kaikilla i {1,..., n 1} on olemassa w Σ ja u, ω 1,..., ω m (V Σ) ja A V siten, että v i 1 = uaw ja v i = uω 1 ω m w pätevät, kyseinen johto on oikea johto (engl. rightmost derivation).
Sisällys
Jäsennyspuu Jäsennyspuu (tietyn kieliopin suhteen) on puu, jolla on seuraavat ominaisuudet: Sen kukin lehtisolmu on merkitty pääte- tai välikemerkillä taikka ε:lla. Sen juuri ja jokainen sisäsolmu on merkitty välikemerkillä. Kullekin sisäsolmulle (jonka merkki on) A, jolla on lapsisolmut (joiden merkit ovat) ω 1,..., ω n, on olemassa kieliopin produktio A ω 1 ω n Jäsennyspuu on tietyn merkkijonon jäsennyspuu tietystä välikemerkistä lähtien, jos tuo merkkijono voidaan lukea jäsennyspuun lehtisolmujen merkeistä vasemmalta oikealle (ε-solmut huomiotta jättäen) ja puun juuri on merkitty kyseisellä välikemerkillä.
Taululla Piirretään joitakin seuraavan kieliopin jäsennyspuita 4 E c E E + E E E E E E E E E / E E (E) Kuinka monta jäsennyspuuta voidaan piirtää merkkijonolle c + c c? 4 Päätemerkki c on leksikaalinen kategoria, jonka edustajia ovat kaikki Unix-regexpin [+-]?[[:digit:]]+ kuvaamat merkkijonot.
Puuta koskevien todistusten strategia Yleensä rakenneinduktio (eli induktio puun solmujen määrän suhteen): Perustapauksena käsitellään joko tyhjä puu taikka puu, joka koostuu yksinomaan yhdestä lehtisolmusta. Induktiotapauksessa tarkastellaan puuta, jossa on vähintään kaksi solmua. Induktio-oletus on, että väite pätee kaikille puun aidoille alipuille 5 tai yleisemmin, että väite pätee kaikille puille, joissa on vähemmän solmuja kuin tarkasteltavana olevassa puussa. 5 Puussa on alipuu jokaista puun solmua kohti: kyseinen solmu tulkitaan juureksi, ja alipuuhun kuuluvat kaikki tuon solmun jälkeläiset; alipuu on aito, jos siinä on vähemmän solmuja kuin alkuperäisessä puussa.
Jäsennyspuiden peruslause Lause Olkoon G = (V, Σ, P, S). Olkoon A V välikemerkki, ja olkoon w (V Σ) merkkijono. Seuraavat ovat yhtäpitäviä: 1. On olemassa w:n jäsennyspuu A:sta lähtien G:n suhteen. 2. A G w. Todistus. Sivuutetaan (tulee jälkiprujussa)
Sisällys
Määritelmä Kontekstiton kielioppi on yksiselitteinen, jos kaikilla merkkijonoilla on enintään yksi jäsennyspuu. Muuten se on moniselitteinen (engl. ambiguous). Lause Merkkijonolla on saman kieliopin suhteen ja samasta välikemerkistä alkaen yhtä monta jäsennyspuuta kuin sillä on erilaisia vasempia johtoja.
Operaattori Operaattorikieliopilla tarkoitetaan tässä sellaista kielioppia, jossa on vain yksi välikemerkki (merkitään sitä seuraavassa E:llä); (vain) seuraavanlaisia produktioita E E on prefiksioperattori E E on postfiksioperaattori E E E on infiksioperaattori E on primäärilauseke missä on (mahdollisesti tyhjä) merkkijono, joka ei ala eikä lopu E:hen; yleensä (mutta ei aina) yksi päätemerkki; sekä jokaiselle operaattorille määritelty presedenssi ja assosiatiivisuus.
Esimerkkejä operaattoreista Tavanomaisten operaattoreiden (+, jne) lisäksi: C:n typecast (tyyppi) on prefiksioperaattori. Funktiokutsu (arg1,...,argn) on postfiksioperaattori. Mixfix-operaattorit kuten C:n?lauseke: ovat tämän analyysin kannalta infiksioperaattoreita.
Operaaattoreiden presedenssi Jos operaattorilla on suurempi presedenssi kuin operaattorilla, niin lauseke a b c tulkitaan (a b) c. Presedenssin tulee olla operaattorien presedenssiekvivalenssiluokkien täydellinen järjestysrelaatio. Yleensä helppo esittää taulukkomuodossa, esim. aritmetiikassa: / +
Operaattoreiden assosiatiivisuus Määritellään operaattoreille assosiatiivisuus: Operaattori assosioi vasemmalle, jos a b c tulkitaan (a b) c. Operaattori assosioi oikealle, jos a b c tulkitaan a (b c). Operaattori ei assosioi, jos a b c on diagnosoitava kielioppivirheeksi. Useimmat operaattorit assosioivat vasemmalle. Prefiksioperaattorit assosioivat joko oikealle tai eivät ollenkaan. a on ( a) jos mitään Postfiksioperaattorit assosioivat joko vasemmalle tai eivät ollenkaan. a on (a ) jos mitään
C-kielen operaattoritaulukko operaattorit (E on lauseke, T on tyyppi) ass. [E] (E,...,E). -> ++ -- postf. (vas.) sizeof & * + - ~! ++ -- pref. (oik.) (T) pref. (oik.) * / % vasemmalle + - vasemmalle << >> vasemmalle < <= > >= vasemmalle ==!= vasemmalle & vasemmalle ^ vasemmalle vasemmalle && vasemmalle vasemmalle?e: vasemmalle = *= /= %= += -= <<= >>= &= ^= = oikealle, vasemmalle
Operaattorikieliopin yksiselitteistäminen 1 Numeroidaan presedenssitasot 1,..., n, missä pienempi luku tarkoittaa korkeampaa presedenssitasoa. Luodaan kullekin presedenssitasolle i uusia välikesymboleja: E i joka tapauksessa, E l i (sekä produktio E i E l i ), jos presedenssitasolla on vasemmalle assosioivia operaattoreita, E r i (sekä produktio E i E r i ), jos presedenssitasolla on oikealle assosioivia operaattoreita, ja E n i (sekä produktio E i E n i ), jos presedenssitasolla on ei-assosioivia operaattoreita.
Operaattorikieliopin yksiselitteistäminen 2 Kullekin välikemerkkille E x i (missä x = l, r, n) lisätään produktio E x i E i 1. Kullekin presedenssitason i operaattorille lisätään produktio taulukon mukaisesti: assosioi fiksi produktio vasemmalle in E l i E l i E i 1 oikealle in E r i E i 1 E r i ei in E n i E i 1 E i 1 kyllä post E l i E l i ei post E n i E i 1 kyllä pre E r i E r i ei pre E n i E i 1
Operaattorikieliopin yksiselitteistäminen 3 Luodaan lisäksi uusi välikemerkki E 0. Jokaiselle primäärilausekkeelle lisätään produktio E 0. Lisätään vielä produktio E E n. Poistetaan lopputuloksesta tarpeettomat välikemerkit ja produktiot. Annetaan luoduille välikesymboleille kuvaavat nimet (jos mahdollista).
Esimerkki primary-expression: constant ( expression ) multiplicative-expression: primary-expression multiplicative-expression * primary-expression multiplicative-expression / primary-expression multiplicative-expression % primary-expression additive-expression: multiplicative-expression additive-expression + multiplicative-expression additive-expression - multiplicative-expression expression: additive-expression
Roikkuva else <statement> ::= print <expression> ; { <statement-list> } if ( <expression> ) <statement> if ( <expression> ) <statement> else <statement> <statement-list> ::= <empty> <statement-list> <statement> <empty> ::= Kysymys Mitä tulostaa if (a) if (b) print 1; else print 2; jos a on epätosi? (a) 2 (b) ei mitään
Ratkaisu Yleensä valitaan (b), jolloin else paritetaan sisimmän parittoman if:n kanssa. Tämän yksiselitteistäminen ei onnistu operaattorikieliopin tekniikalla Harjoitustehtävä: miksi ei? Yksiselitteistys tehdään pakottamalla then-lauseen pariutuminen: <statement> ::= <matched-statement> <open-statement> <matched-statement> ::= print <expression> ; { <statement-list> } if ( <expression> ) <matched-statement> else <matched-statement> <open-statement> ::= if ( <expression> ) <statement> if ( <expression> ) <matched-statement> else <open-statement>