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

Samankaltaiset tiedostot
Attribuuttikieliopit

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

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

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

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

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

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

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

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

Täydentäviä muistiinpanoja jäsennysalgoritmeista

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

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

Pinoautomaatit. Pois kontekstittomuudesta

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

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

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

Jäsennys. TIEA341 Funktio ohjelmointi 1 Syksy 2005

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

Täydentäviä muistiinpanoja Turingin koneiden vaihtoehdoista

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

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

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

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

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

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

Tietueet. Tietueiden määrittely

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

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

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

ICS-C2000 Tietojenkäsittelyteoria Kevät 2016

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

Rajoittamattomat kieliopit (Unrestricted Grammars)

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

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

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

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

Rajoittamattomat kieliopit

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

Yhteydettömät kieliopit [Sipser luku 2.1]

TIEA341 Funktio-ohjelmointi 1, kevät 2008

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

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

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

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

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

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

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

Chomskyn hierarkia ja yhteysherkät kieliopit

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

11.4. Context-free kielet 1 / 17

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

Muunnelmia Turingin koneista sekä muita vaihtoehtoisia malleja

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

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

Ohjelmoinnin perusteet Y Python

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

Tietotekniikan valintakoe

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

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

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

Yhteydettömän kieliopin jäsennysongelma

follow(a) first(α j ) x

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

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

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

5.5 Jäsenninkombinaattoreista

Harjoitus 3 (viikko 39)

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

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

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

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

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

Laskennan mallit (syksy 2010) Harjoitus 8, ratkaisuja

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

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

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Ohjelmointiharjoituksia Arduino-ympäristössä

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

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

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

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

Loppukurssin järjestelyt

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

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

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

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

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

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

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Ydin-Haskell Tiivismoniste

Täydentäviä muistiinpanoja laskennan rajoista

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

ICS-C2000 Tietojenkäsittelyteoria

Rekursiiviset palautukset [HMU 9.3.1]

JOHDATUS TEKOÄLYYN TEEMU ROOS

9. Periytyminen Javassa 9.1

ITKP102 Ohjelmointi 1 (6 op)

Transkriptio:

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

Sisällys t

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 E 1 + T E E 1 T T F T T 1 F T T 1 / F F c F (E) E.v := T.v E.v := E 1.v + T.v E.v := E 1.v T.v T.v := F.v T.v := T 1.v F.v T.v := T 1.v / F.v F.v := c.v F.v := E.v

Yksinkertainen laskin LL(1) E TE E.v := E.v E.l := T.v E ε E.v := E.l E +TE 1 E.v := E 1.v E 1.l := E.l + T.v E TE 1 E.v := E 1.v E 1.l := E.l T.v T FT T.v := T.v T.l := F.v T ε T.v := T.l T FT 1 T.v := T 1.v T 1.l := T.l F.v T /FT 1 T.v := T 1.v T 1.l := T.l/F.v F c F.v := c.v F (E) F.v := E.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. Jos sama symboli esiintyy useamman kerran produktiossa, tulee esiintymät erottaa toisistaan alaindeksein. 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.v := E.v E.l := T.v E ε E.v := E.l E +TE 1 E.v := E 1.v E 1.l := E.l + T.v E TE 1 E.v := E 1.v E 1.l := E.l T.v T FT T.v := T.v T.l := F.v T ε T.v := T.l T FT 1 T.v := T 1.v T 1.l := T.l F.v T /FT 1 T.v := T 1.v T 1.l := T.l/F.v F c F.v := c.v F (E) F.v := E.v w = c 1 + c 2 c 3 c 1.v = 1 c 2.v = 2 c 3.v = 3

Koodaus ennustavaksi jäsentimeksi Lasketaan ensiksi NULLABLE, FIRST ja FOLLOW (merkitään syötteen loppua ): NULLABLE FIRST FOLLOW E c ( ) E + ) T c ( + ) T / + ) F c ( / + ) Sitten jäsennystaulukko: + / ( ) c E E TE E TE E E +TE E TE E ε E ε T T FT T FT T T ε T ε T FT T /FT T ε T ε F F (E) F c

Attribuutit ennustavassa jäsennyksessä Synteettiset attribuutit on luonnollisinta käsitellä jäsennysaliohjelman paluuarvona. Periytyvät attribuutit ovat luonnollisimmin jäsennysaliohjelman parametreja. Tämä ei tokikaan tue kaikkia mahdollisia attribuuttikielioppeja!

Osa jäsennyskoodista double T_ ( double l ) { i n t tok ; t a i l r e c : tok = get ( ) ; switch ( tok ) { double r ; case + : case : case ) : case 0 : case EOL: unget ( tok ) ; return l ; case * : r = F ( ) ; l = l * r ; goto t a i l r e c ; case / : r = F ( ) ; i f ( r == 0) { fputs ( " Division by zero.\n", stderr ) ; l = 0 ; } e lse { l = l /r ; } goto t a i l r e c ; } default : oops ( ) ; return 0 ; }

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.