Attribuuttikieliopit

Samankaltaiset tiedostot
TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 30. marraskuuta 2015

TIEA241 Automaatit ja kieliopit, kevät Antti-Juhani Kaijanaho. 16. helmikuuta 2012

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 3. lokakuuta 2016

TIEA241 Automaatit ja kieliopit, kevät Antti-Juhani Kaijanaho. 12. kesäkuuta 2013

Pinoautomaatit. TIEA241 Automaatit ja kieliopit, kesä Antti-Juhani Kaijanaho. 6. kesäkuuta 2013 TIETOTEKNIIKAN LAITOS. Pinoautomaatit.

TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho. 29. huhtikuuta 2011

jäsentäminen TIEA241 Automaatit ja kieliopit, syksy 2015 Antti-Juhani Kaijanaho 26. marraskuuta 2015 TIETOTEKNIIKAN LAITOS

TIEA241 Automaatit ja kieliopit, kevät Antti-Juhani Kaijanaho. 2. helmikuuta 2012

TIEA241 Automaatit ja kieliopit, kesä Antti-Juhani Kaijanaho. 10. kesäkuuta 2013

Pinoautomaatit. Pois kontekstittomuudesta

Täydentäviä muistiinpanoja jäsennysalgoritmeista

Jäsennysalgoritmeja. TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 29. syyskuuta 2009 TIETOTEKNIIKAN LAITOS. Jäsennysalgoritmeja

TIEA241 Automaatit ja kieliopit, kesä Antti-Juhani Kaijanaho. 29. toukokuuta 2013

Jäsennysaiheesta lisää Täydentäviä muistiinpanoja TIEA241 Automaatit ja kieliopit, syksy 2016

LR-jäsennys. Antti-Juhani Kaijanaho. 3. lokakuuta 2016

Täydentäviä muistiinpanoja Turingin koneiden vaihtoehdoista

TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho. 31. maaliskuuta 2011

jäsentämisestä TIEA241 Automaatit ja kieliopit, syksy 2015 Antti-Juhani Kaijanaho 27. marraskuuta 2015 TIETOTEKNIIKAN LAITOS

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 12. lokakuuta 2016

Jäsennys. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Tietueet. Tietueiden määrittely

Täydentäviä muistiinpanoja kontekstittomien kielioppien jäsentämisestä

TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho. 31. maaliskuuta 2011

jäsennyksestä TIEA241 Automaatit ja kieliopit, syksy 2016 Antti-Juhani Kaijanaho 29. syyskuuta 2016 TIETOTEKNIIKAN LAITOS Kontekstittomien kielioppien

Pinoautomaatit. TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 6. lokakuuta 2016 TIETOTEKNIIKAN LAITOS

TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho. 16. toukokuuta 2011

Turingin koneet. Sisällys. Aluksi. Turingin koneet. Turingin teesi. Aluksi. Turingin koneet. Turingin teesi

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 9. lokakuuta 2016

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Rajoittamattomat kieliopit (Unrestricted Grammars)

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 3. joulukuuta 2015

Rajoittamattomat kieliopit

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 20. lokakuuta 2016

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 16. marraskuuta 2015

Säännölliset kielet. Sisällys. Säännölliset kielet. Säännölliset operaattorit. Säännölliset kielet

TIEA241 Automaatit ja kieliopit, kevät Antti-Juhani Kaijanaho. 26. tammikuuta 2012

Yhteydettömät kieliopit [Sipser luku 2.1]

TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 29. syyskuuta 2009

ICS-C2000 Tietojenkäsittelyteoria Kevät 2016

Laskennan rajoja. TIEA241 Automaatit ja kieliopit, kesä Antti-Juhani Kaijanaho. 20. kesäkuuta 2013 TIETOTEKNIIKAN LAITOS.

vaihtoehtoja TIEA241 Automaatit ja kieliopit, syksy 2016 Antti-Juhani Kaijanaho 13. lokakuuta 2016 TIETOTEKNIIKAN LAITOS

Laskennan rajoja. Sisällys. Meta. Palataan torstaihin. Ratkeavuus. Meta. Universaalikoneet. Palataan torstaihin. Ratkeavuus.

Laskennan rajoja. TIEA241 Automaatit ja kieliopit, kevät Antti-Juhani Kaijanaho. 6. maaliskuuta 2012 TIETOTEKNIIKAN LAITOS.

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 8. syyskuuta 2016

Laskennan rajoja. TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 10. joulukuuta 2015 TIETOTEKNIIKAN LAITOS.

Chomskyn hierarkia ja yhteysherkät kieliopit

TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 9. marraskuuta 2009

TIEA241 Automaatit ja kieliopit, kevät Antti-Juhani Kaijanaho. 8. maaliskuuta 2012

11.4. Context-free kielet 1 / 17

Muunnelmia Turingin koneista sekä muita vaihtoehtoisia malleja

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

S BAB ABA A aas bba B bbs c

Yhteydettömän kieliopin jäsennysongelma

Oliot ja tyypit. TIES542 Ohjelmointikielten periaatteet, kevät Antti-Juhani Kaijanaho. Jyväskylän yliopisto Tietotekniikan laitos

1. Universaaleja laskennan malleja

Chomskyn hierarkia. tyyppi 0 on juuri esitelty (ja esitellään kohta lisää) tyypit 2 ja 3 kurssilla Ohjelmoinnin ja laskennan perusmallit

TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho. 19. tammikuuta 2012

Tietotekniikan valintakoe

Vasen johto S AB ab ab esittää jäsennyspuun kasvattamista vasemmalta alkaen:

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla

T Syksy 2002 Tietojenkäsittelyteorian perusteet Harjoitus 8 Demonstraatiotehtävien ratkaisut

Kontekstittomien kielten jäsentäminen Täydentäviä muistiinpanoja TIEA241 Automaatit ja kieliopit, syksy 2016

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 12. lokakuuta 2016

T Syksy 2006 Tietojenkäsittelyteorian perusteet T Harjoitus 7 Demonstraatiotehtävien ratkaisut

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 5. marraskuuta 2015

TIEA241 Automaatit ja kieliopit, kevät Antti-Juhani Kaijanaho. 12. tammikuuta 2012

TIEA241 Automaatit ja kieliopit, kesä Antti-Juhani Kaijanaho. 26. kesäkuuta 2013

uv n, v 1, ja uv i w A kaikilla

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 9. lokakuuta 2016

TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 7. joulukuuta 2009

Ohjelmointi 2. Jussi Pohjolainen. TAMK» Tieto- ja viestintäteknologia , Jussi Pohjolainen TAMPEREEN AMMATTIKORKEAKOULU

Ohjelmoinnin perusteet Y Python

Laskennan mallit (syksy 2010) Harjoitus 8, ratkaisuja

8. Näppäimistöltä lukeminen 8.1

Harjoitus 3 (viikko 39)

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 12. marraskuuta 2015

Loppukurssin järjestelyt

Täydentäviä muistiinpanoja laskennan rajoista

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 19. syyskuuta 2016

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A.

(0 1) 010(0 1) Koska kieli on yksinkertainen, muodostetaan sen tunnistava epädeterministinen q 0 q 1 q 2 q3

Ei-yhteydettömät kielet [Sipser luku 2.3]

9. Periytyminen Javassa 9.1

Lyhyt kertaus osoittimista

Ohjelmointi 1 Taulukot ja merkkijonot

5.5 Jäsenninkombinaattoreista

2. Yhteydettömät kielet

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

8. Näppäimistöltä lukeminen 8.1

TIEA341 Funktio-ohjelmointi 1, kevät 2008

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

AS C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

Ydin-Haskell Tiivismoniste

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

Ohjelmointiharjoituksia Arduino-ympäristössä

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Loppukurssin järjestelyt C:n edistyneet piirteet

follow(a) first(α j ) x

Metodien tekeminen Javalla

Transkriptio:

TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 3. toukokuuta 2011

Sisällys t

Chomskyn hierarkia kieli säännöllinen kontekstiton kontekstinen rekursiivisesti lueteltava automaatti äärellinen pino lineaarirajoitettu Turingin kone

Pieni koukkaus alkuun Mikä ihme on ε?

Sisällys t

Kieliopilla yksin ei pitkälle pötki Kontekstiton kielioppi vastaa kysymykseen, kuuluuko jokin merkkijono kieleen. Entä jos merkkijonoon pitäisi liittää jotain tulkintaa?

Kieliopilla yksin ei pitkälle pötki Kontekstiton kielioppi vastaa kysymykseen, kuuluuko jokin merkkijono kieleen. Entä jos merkkijonoon pitäisi liittää jotain tulkintaa? Voidaan toki rakentaa jäsennyspuu ja sitten määritellä tulkinta sen mukaan. Vähän tähän tapaan käytännössä toimitaankin! Yksi samankaltainen idea on attribuuttikieliopit. Donald E. Knuth: Semantics of Context-Free Languages. Mathematical systems theory, 2 (2), 1968.

Yksinkertainen laskin E T E 0.v := T 1.v E T + E E 0.v := T 1.v + E 1.v E T E E 0.v := T 1.v + E 1.v T F T 0.v := F 1.v T F T T 0.v := F 1.v T 1.v F c F 0.v := c 1.v F (E) F 0.v := E 1

Yksinkertainen laskin LL(1) E TE E 0.v := E 1.v E 1.l := T 1.v E ε E 0.v := E 0.l E +TE E 0.v := E 1.v E 1.l := E 0.l + T 1.v E TE E 0.v := E 1.v E 1.l := E 0.l T 1.v T FT T 0.v := T 1.v T 1.l := F 1.v T ε T 0.v := T 0.l T FT T 0.v := T 1.v T 1.l := T 0.l F 1.v T /FT T 0.v := T 1.v T 1.l := T 0.l/F 1.v F c F 0.v := c 1.v F (E) F 0.v := E 1.v

Lähtökohtana kontekstiton kielioppi. Kullekin välike- ja päätesymboleille voidaan määritellä attribuutteja kuin olioluokille. Kukin attribuutti on joko synteettinen taikka periytyvä. Jokaiseen produktioon liitetään laskentasääntöjä: Laskentasääntö voi lukea produktion vasemman puolen symbolin periytyviä attribuutteja oikean puolen symbolien synteettisiä attribuutteja Laskentasääntöjen tulee kirjoittaa kuhunkin produktion vasemman puolen symbolin synteettiseen attribuuttiin oikean puolen symbolin periytyvään attribuuttiihin Laskentasäännöllä ei saa olla sivuvaikutuksia. Laskentasäännön käyttäytyminen saa riippua vain produktion symboleiden kenttien arvoista.

Huomioita Laskentasäännöt kirjoitetaan produktion oikealle puolelle. Produktion vasemman puolen symboliin viitataan alaindeksillä 0. Kunkin symbolin n:nteen esiintymiseen produktion oikealla puolella viitataan alaindeksillä n. Tarkka syntaksi vaihtelee lähteen mukaan. Nämä pätevät tällä kurssilla.

Laskentaperiaate 1. Selvitä ensiksi syötemerkkijonon jäsennyspuu. Jokainen puun solmu on oma olionsa attribuuttien näkökulmasta. 2. Alusta puun kaikkien solmujen kaikki attribuutit. Välikesymbolien attribuutit alustetaan määrittelemättömiksi. Päätesymbolien attribuutit johdetaan syötteestä. 3. Kunnes kaikkien solmujen kaikki attribuutit on määritelty, toista: 3.1 Valitse jokin solmu X, jolla on lapset α 1,..., α n, sekä produktion X α 1 α n laskentasääntö r, joille pätee solmun X ja sen lapsien kontekstissa: Attribuutti, jonka r laskee, on määrittelemätön Attribuutit, jotka r lukee, on määritelty. 3.2 Suorita laskentasääntö r solmun X ja sen lapsien kontekstissa.

Esimerkki taululla E TE E 0.v := E 1.v E 1.l := T 1.v E ε E 0.v := E 0.l E +TE E 0.v := E 1.v E 1.l := E 0.l + T 1.v E TE E 0.v := E 1.v E 1.l := E 0.l T 1.v T FT T 0.v := T 1.v T 1.l := F 1.v T ε T 0.v := T 0.l T FT T 0.v := T 1.v T 1.l := T 0.l F 1.v T /FT T 0.v := T 1.v T 1.l := T 0.l/F 1.v F c F 0.v := c 1.v F (E) F 0.v := E 1.v w = c + c c c 1.v = 1 c 2.v = 2 c 3.v = 3

Rajoitettuja versioita S-attributoitu kielioppi on sellainen, jossa ei lainkaan esiinny periytyviä attribuutteja. L-attributoitu kielioppi on sellainen, jossa attribuutit voidaan laskea yhdellä puun läpikäynnillä vasemmalta oikealle.

Sisällys t

t 1 engl. parser generators ohjelmia, jotka tuottavat (attribuutti)kieliopin perusteella jäsenninohjelman yksi vanhimmista edelleen käytössä olevista on Yacc, joka tuottaa C-kieltä moderneja versioita ovat Byacc ja GNU Bison Javaa tuottavat mm. Antlr, CUP, SableCC useimmille kielille on omansa, jotkin (kuten Antlr) tukevat useita 1 Meinasin otsikoida tämän jäsenninloimet mutta tulin järkiini.

Laskin Yaccilla, osa 1 %{ #include <stdio.h> #define YYSTYPE double %} %token CONST EOL ERR %%

Laskin Yaccilla, osa 2 input : /**/ { } input EOL { } input error EOL { } input expression EOL { printf("%lg\n", $2); } expression : term { $$ = $1; } expression + term { $$ = $1 + $3; } expression - term { $$ = $1 - $3; } term : primary { $$ = $1; } term * primary { $$ = $1 * $3; } term / primary { if ($3 == 0) { fputs("division by zero.\n", stderr); YYERROR; } else { $$ = $1 / $3; } } primary : CONST { $$ = $1; } ( expression ) { $$ = $2; } %%

Laskin Yaccilla, osa 3 double getnum(void) {... } void yyerror(const char *s) {... } int yylex(void) {... } int main(void) { yyparse(); return 0; }

Yacc Yacc-tiedosto jakaantuu kolmeen osaan, joiden välissä on symboli %%. Ensimmäisessä osassa on erilaisia määrittelyjä. Toisessa osassa on varsinainen kielioppi. Kolmas osa on vapaata C-koodia. Kielioppi on kontekstiton. jäsennysalgoritmina LALR jäsennys etenee jäsennyspuun lehdistä kohti juurta Yacc ei tosin konstruoi puuta tietorakenteeksi asti Produktion perään voidaan kirjoittaa aaltosulkeisiin C-koodia, joka suoritetaan, kun produktiota vastaava solmu lisätään puuhun. muistuttaa S-attributoitua kielioppia $n tarkoittaa oikean puolen n:nnen symbolin arvoa $$ tarkoittaa vasemman puolen symbolin arvoa

Yacc vs attribuuttikieliopit Yaccissa ei ole attribuutteja, mutta symboleilla on kokonaislukuarvo. Symbolien yhteisen tyypin vaihtaminen onnistuu määrittelemällä YYSTYPE, kuten esimerkissä. Kullekin symbolille voidaan myös (hankalammin) määritellä oma tyyppinsä. Symbolin tyyppi voi olla tietue, jolloin symbolilla voi ajatella olevan attribuutteja. Yacc ei tue periytyviä attribuutteja. On tosin olemassa yksi überhaxxor-keino, jota ei oikein uskalla suositella... Yacc ei rajoita produktioon liitetyn koodinpätkän tekemisiä. Sivuvaikutukset ovat sallittuja ja yleisesti käytettyjä.

Yacc ja syötteen luku Yaccin mielestä symbolit ovat kokonaislukuja. Päätesymboleita ovat kaikki syötemerkistön merkit (kokonaisluvuksi muutettuna), joihin viitataan C-tyylisellä syntaksillä, esim. + erikseen %token-määrittelyllä luetellut symboliset päätesymbolit (joille Yacc määrittelee automaattisesti kokonaislukutunnuksen) Kun Yacc haluaa tietää syötteen seuraavan merkin, se kutsuu (ohjelmoijan laatimaa) aliohjelmaa yylex ilman parametreja. Sen tulee palauttaa seuraava päätemerkki taikka 0 (syöte päättyi).

Konfliktit Yaccissa Yacc käyttää LALR-jäsennystä Laajempi kuin LL(1): vasenrekursio on sallittua, jopa toivottavaa. LALR on useimpiin tietokonekielten käsittelytilanteisiin riittävä. LALR ei kuitenkaan tue kaikkia kontekstittomia kielioppeja. Jos kielioppi ei ole LALR-kielioppi, Yacc antaa virheilmoituksen. Virheitä on kahta tyyppiä: shift/reduce ja reduce/reduce.

shift/reduce Yaccilla on päätettävänään, kumpaa seuraavista produktioista sovelletaan (pistenotaatio kuten Earleyn algoritmissa): A ω 1 A ω 1 ω 2 Reduce tarkoittaa ensimmäisen valintaa, shift jälkimmäisen. Yacc valitsee oletuksena shiftin mutta valittaa siitä huolimatta. Tämä on usein se, mitä haluttiin, mutta parempi olisi kirjoittaa kielioppi sellaiseksi, että konflikti katoaa.

ajk@kukkaseppele:~/opetus/auki/koodit$ cat shiftred.y %token CONST %% expression : expression + expression expression - expression expression * expression expression / expression ( expression ) CONST ajk@kukkaseppele:~/opetus/auki/koodit$ byacc shiftred.y byacc: 16 shift/reduce conflicts.

reduce/reduce Yaccilla on päätettävänään, kumpaa seuraavista produktioista sovelletaan (pistenotaatio kuten Earleyn algoritmissa): A ω 1 A ω 2 Tämä tarkoittaa useimmiten, että kielioppi ei tee sitä, mitä tekijä haluaa.

ajk@kukkaseppele:~/opetus/auki/koodit$ cat redred.y %token ID %% prog : type expr type : ID expr : ID ajk@kukkaseppele:~/opetus/auki/koodit$ byacc redred.y byacc: 1 rule never reduced byacc: 1 reduce/reduce conflict.