11.4. Context-free kielet 1 / 17 Määritelmä Tyypin 2 kielioppi (lauseyhteysvapaa, context free): jos jokainenp :n sääntö on muotoa A w, missäa V \V T jaw V. Context-free kielet ja kieliopit ovat tärkeitä mm. seuraavista syistä: 1) Kielioppeja on helppo käsitellä, koska säännön soveltaminen tarkoittaa yhden kirjaimen korvaamista sanalla (säännöt ovat muotoa A w). 2) Monien ohjelmointikielien syntaksi on määritelty context-free muotoisella kieliopilla. 3) Context-free kieliopin johto voidaan esittää graafisesti johtamispuun avulla (palataan myöhemmin). 2 / 17 Merkki kerrallaan Lause 11.2. JosLon context-free kieli, niin on olemassa sellainen context-free kielioppig, että L = L(G) ja jokainen kielenlsana tuotetaan kieliopissagmerkki kerrallaan ja halutusta suunnasta edeten (esim. vasemmalta oikealle). Todistus. Sivuutetaan. 3 / 17 1
Esimerkki 11.3. Esimerkki 11.3. Määrää kielioppi, joka tuottaa täsmälleen kielenl = {0 n 1 n n = 1,2,...} sanat merkki kerraltaan vasemmalta oikealle. 4 / 17 Backus- Naur muoto Context free kielioppien yhteydessä käytetään usein Backus Naur muotoa (BNF-muotoa). Koska jokaisen säännönw 1 w 2 vasen puoli on yksittäinen apukirjain (ei terminaali-)symboli, niin samasta symbolista johtuvia sääntöjä ei anneta erillisinä vaan ryhminä. Ei terminaalisymbolit merkitään sulkujen sisään ja säännön eri tuotokset erotetaan pystyviivalla toisistaan. Alkukirjain Backus-Naur muodossa on ensimmäisen säännön vasemmanpuoleinen apukirjain. 5 / 17 2
Backus-Naur jatkoa Esimerkki. KielioppiG = ({a,b,a,b},{a,b},a,p), missä P = {A baa,a a,a AB,B bb,b b} Backus-Naur muodossa: A ::= b A a a A B B ::= b B b 6 / 17 Esimerkkejä Esimerkki 11.4. Muunna esimerkin 11.3. kielioppi Backus-Naur muotoon. Esimerkki 11.5. Määrää Backus-Naur muotoinen kielioppi, joka tuottaa merkki merkiltä vasemmalta oikealle kaikki merkeistä0,1ja2koostuvat sanat, joissa ei esiinny kahta samaa merkkiä peräkkäin, ja vain ne. Kuuluuko tyhjä sana oikein muodostetun kieliopin tuottamaan kieleen. 7 / 17 3
Esimerkkejä jatkoa Esimerkki 11.6. Tiedonsiirrossa siirrettävä informaatio pilkotaan lohkoihin, joihin lisätään tarkistusmerkkejä, joiden avulla voidaan havaita siirtotien aiheuttamia virheitä. Kuusi merkkiä käsittävä lohko koostuu4:stä varsinaisesta merkistä ja kahdesta tarkistusmerkistä seuraavasti: (1) ensimmäinen ja toinen merkki ovat kirjaimia joukosta{a,b,c}; (2) kolmas ja neljäs merkki ovat lukuja joukosta{2,3}; (3) viides merkki on merkkien3ja4summa; (4) kuudes merkki onx, jos ensimmäinen ja toinen merkki ovat samat ja muulloin Y. Tee Backus-Naur muotoinen kielioppi, joka tuottaa kaikki oikein muodostetut siirtolohkot. Ratk... 8 / 17 Esimerkki 11.7. Esimerkki 11.7. Ohjelman piti tarkistaa syötetyt päivämäärät (luvut), jotka olivat nelimerkkisiä ja tyyppiä p 1 p 2 k 1 k 2, missä lukup 1 p 2 ilmoittaa päivän ja lukuk 1 k 2 kuukauden. Tarkistamisohjelmaa varten laadittiin säännöt mainitunlaisten merkkijonojen tuottamiseksi. Tee Backus-Naur muotoiset säännöt päivämäärien/lukujen p 1 p 2 k 1 k 2 tuottamiseksi merkki merkiltä vasemmalta oikealle, kun ohjelmalla tarkistetaan (tavallisen) karkausvuoden päiviä. Ratk... 9 / 17 4
11.5. Jäsennyspuu 10 / 17 Kääntäminen ja BNF Ohjelmointikielten kuten Java, C++, Pascal, Fortran jne. syntaksi määritellään tyypillisesti BNF-muotoisilla säännöillä. Sääntöjä on usein satoja. Ohjelman kääntämisessä testataan onko ohjelma muodollisesti oikein eli toteuttaako se ohjelmointikielen syntaksin. Siis voidaanko ohjelmakoodi johtaa ohjelmointikielen syntaksin määrittelevistä BNF-säännöistä. 11 / 17 Kokonaisluvun johto Esimerkki. Kokonaisluvun määrittelevät BNF-muotoiset säännöt Integer ::= SignedInteger U nsignedinteger SignedInteger ::= + U nsignedinteger U nsignedinteger U nsignedinteger ::= Digit Digit U nsignedinteger Digit ::= 0 1 2 9 12 / 17 5
Johtamispuu Context-free kielioping = (V,V T,S,P) johtoons w voidaan aina liittää johtoa kuvaava jäsennyspuu (=johtamispuu, parse tree) seuraavasti: 1) Puun pisteet merkitäänv:n symboleilla taiλ:lla. 2)Jos johdossa ensimmäinen käytetty sääntö ons α 1 α 2 α m,m 1,α i V, aina kuni = 1,2,...,m, niin jatketaan puutam:llä symbolilla, jotka merkitään vasemmalta oikealleα 1,α 2,...,α m. Jos ensimmäinen sääntö ons λ, niin jatketaan puuta yhdellä pisteellä, jota merkitäänλ:lla. 3) Josα i on apukirjain, johdon toinen sääntö kohdistuu siihen ja onα i β 1 β 2 β k, niin jatketaan puutaα i :tä vastaavasta pisteestäk:lla pisteellä, jotka merkitään vasemmalta oikealle symboleinβ 1,β 2,...,β k. Jos toinen sääntö on muotoa α i λ, niin jatketaan puuta pisteellä, jota merkitäänλ:lla. 13 / 17 Johtamispuu jatkoa 4) Tällä tavoin jatketaan puun rakentamista. Sitä voidaan jatkaa mistä tahansa apukirjaimesta, ei pelkästään viimeksi saadusta. 5) Lopulta jokainen puun piste johon sääntöä ei ole sovellettu on merkitty joko aakkostonv T symbolilla taiλ:lla. Näistä pisteistä johtoa ei enää voi jatkaa (kysessä ovat puun lehdet). Silloin johto päättyy ja johdon tuottama sana voidaan lukea puun lehdistä vasemmalta oikealle. 14 / 17 6
Jäsentämispuun käyttö Jäsentämispuuta käytetään sanan oikeellisuuden (onko annettu sana kielen sana) tarkistamisessa. Puhutuille kielille ei tarkkoja sääntöjä kyetä luomaan, joten myöskään oikeellisuuden testaaminen ei ole mahdollista. Ohjelmointikielet määritellään tarkasti, joten jäsennyspuu on käyttökelpoinen väline ohjelman oikeellisuuden tutkimiseen. 15 / 17 Esimerkki 11.9. Merkitään seuraavassa kieliopin sääntöjoukkoaa w 1,A w 2,...A w n lyhyesti A w 1 w 2 w n. Esimerkki 11.9. Määrää kieliopin G = ({A,B,0,1},{0,1},S,P), missä P = {S A B,A 0 0A 1AA AA1 A1A,B 1 1B 0BB BB0 B0B}, johto ja johtoa vastaava jäsennyspuu sanalle0111. 16 / 17 7
Vasen johto JohtoaS w on vasen johto, jos siinä aina jatketaan vasemmalta lukien aina ensimmäisestä soveltuvasta apukirjaimesta. Jokainen johto voidaan aina korvata vasemmalla johdolla. Context-free kielioppi on moniselitteinen (ambiquous), jos jollakin kielenl(g) sanalla on ainakin kaksi erilaista vasemmanpuoleista johtoa. Muulloin kielioppigon yksiselitteinen (unambiquous). Esimerkki 11.10. Onko kielioppi missä G = ({A,B,0,1},{0,1},S,P), P = {S 01A 0B,A 1,B 11}, moniselitteinen? 17 / 17 8