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

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

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

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

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

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

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

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

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

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

Attribuuttikieliopit

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

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

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

Täydentäviä muistiinpanoja jäsennysalgoritmeista

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

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

Jäsennys. TIEA341 Funktio ohjelmointi 1 Syksy 2005

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

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

Pinoautomaatit. Pois kontekstittomuudesta

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

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 27. lokakuuta 2009

follow(a) first(α j ) x

Täydentäviä muistiinpanoja Turingin koneiden vaihtoehdoista

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

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

Eloisuusanalyysi. TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 16. marraskuuta 2009 TIETOTEKNIIKAN LAITOS. Eloisuusanalyysi.

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

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

Tietotekniikan valintakoe

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

Muita rekisteriallokaatiomenetelmiä

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

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

ITKP102 Ohjelmointi 1 (6 op)

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

Testaa: Vertaa pinon merkkijono syötteeseen merkki kerrallaan. Jos löytyy ero, hylkää. Jos pino tyhjenee samaan aikaan, kun syöte loppuu, niin

Jatkeet. TIES341 Funktio ohjelmointi 2 Kevät 2006

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

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

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

Yhteydettömän kieliopin jäsennysongelma

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

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

Ydin-Haskell Tiivismoniste

ITKP102 Ohjelmointi 1 (6 op)

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

ITKP102 Ohjelmointi 1 (6 op)

ICS-C2000 Tietojenkäsittelyteoria Kevät 2016

M =(K, Σ, Γ,, s, F ) Σ ={a, b} Γ ={c, d} = {( (s, a, e), (s, cd) ), ( (s, e, e), (f, e) ), (f, e, d), (f, e)

Rajoittamattomat kieliopit (Unrestricted Grammars)

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

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

Lyhyt kertaus osoittimista

Ohjelmoinnin perusteet Y Python

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

58131 Tietorakenteet ja algoritmit (kevät 2016) Ensimmäinen välikoe, malliratkaisut

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

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

δ : (Q {q acc, q rej }) (Γ k {, }) Q (Γ k {, }) {L, R}.

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

A TIETORAKENTEET JA ALGORITMIT

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

TIETORAKENTEET JA ALGORITMIT

Syntaksi. TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 22. syyskuuta 2009 TIETOTEKNIIKAN LAITOS. Syntaksi. Aluksi.

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

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

TIEA341 Funktio-ohjelmointi 1, kevät 2008

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu

Laskennan teoria (kevät 2006) Harjoitus 3, ratkaisuja

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

Ohjelmoinnin perusteet, syksy 2006

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

Rajapinta (interface)

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

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

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

Rajoittamattomat kieliopit

Apuja ohjelmointiin» Yleisiä virheitä

semantiikasta TIE448 Kääntäjätekniikka, syksy 2009 Antti-Juhani Kaijanaho 5. lokakuuta 2009 TIETOTEKNIIKAN LAITOS Ohjelmointikielten staattisesta

ICS-C2000 Tietojenkäsittelyteoria

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

58131 Tietorakenteet ja algoritmit (syksy 2015)

S BAB ABA A aas bba B bbs c

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

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

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

arvostelija JavaCC Petri Kärki Helsinki 15. huhtikuuta 2005 Seminaarityö HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

MATEMATIIKAN KOE PITKÄ OPPIMÄÄRÄ

Algoritmit 2. Luento 13 Ti Timo Männikkö

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

5.5 Jäsenninkombinaattoreista

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

ITKP102 Ohjelmointi 1 (6 op)

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

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 5: Python

Transkriptio:

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

Sisällys

Sisällys

Seuraava deadline Vaihe B tiistai 6.10. klo 10 selaaja ja jäsentäjä toimivat

Sisällys

Kertaus: item Item koostuu produktiosta sekä indeksistä sen oikean puolen symbolien väleihin. Indeksin osoittamaa paikkaa merkitään tavallisesti piseteellä. Esimerkkinä produktion E E + T itemit: E E + T E E + T E E + T E E + T Pistettä edeltävä osa on jo luettu, pisteen jälkeistä osaa odotetaan.

Item-joukon sulkeuma Määritelmä Item-joukon I sulkeuma tarkoittaa pienintä joukkoa C(I), jolle pätevät seuraavat väitteet: 1. I C(I) 2. Jos C(I):ssä on item A α Bβ (joillakin A, α, B, β) ja kieliopista löytyy produktio B γ (jollakin γ), niin C(I):stä löytyy item B γ.

Item-joukon sulkeuma algoritmi 1. Syötteenä item-joukko I. 2. Alusta kaksi paikallista muuttujaa: C, joka on itemjoukko, ja Q, joka on itemjono. C on aluksi I, ja Q:ssa on aluksi (mielivaltaisessa järjestyksessä) I:n alkiot. 3. Toista seuraavaa kunnes Q on tyhjä: 3.1 Poista Q:sta jonon ensimmäinen alkio. 3.2 Jos poistamassasi itemissä on pisteen perässä välikesymboli, nimetään ko. välikesymboli A:ksi. Muutoin hypätään seuraavan askeleen yli. 3.3 Jokaiselle kieliopin produktiolle A α tee seuraavaa: Jos item A α ei ole C:ssä, lisää se C:hen sekä Q:n loppuun. 4. Lopputulos on nyt C:ssä.

Funktio GOTO Määritelmä GOTO(I, X) = C { A αx β (A α Xβ) I } Huomioita X voi olla niin pääte- kuin välikesymbolikin. GOTO(I, X) jättää huomiotta kaikki ne I:n itemit, joissa pistettä ei seuraa X. Tulosjoukossa on piste siirretty X:n yli.

Kanoninen LR(0)-automaatti Määritelmä Kanoniselle LR(0)-automaatille pätee seuraavaa: Sen tilat ovat itemjoukkoja. Sen aloitustila on C({S S}), missä S on uusi välikesymboli ja S on kieliopin aloitussymboli. Jos itemjoukko I on automaatin tila, niin jokaiselle pääte- ja välikesymbolille X pätee seuraavaa: Jos GOTO(I, X) ei ole tyhjä, niin GOTO(I, X) on automaatin tila ja automaatissa on X:llä laputettu siirtymä I:stä GOTO(I, X):ään. Automaatissa ei ole muunlaisia tiloja tai tilasiirtymiä.

LR-jäsennysalgoritmi: tietorakenteet Syöte on päätesymbolijono, jota käsitellään vain kahdella operaatiolla: tarkista, mikä symboli on syötteen alussa, ja poista syötteen alusta yksi päätesymboli. Pino sisältää tiloja (jotka yleensä on numeroitu, jolloin pinossa on vain numeroita). Pinoa käsitellään tavanomaisen pinon tapaan.

LR-jäsennysalgoritmi: ohjaustaulukot Siirtymätaulukko on kaksiulotteinen taulukko, jossa rivejä indeksoidaan tiloilla ja sarakkeita välikesymboleilla. Kussakin solussa on tila. Toimintotaulukko on kaksiulotteinen taulukko, jossa rivejä indeksoidaan tiloilla ja sarakkeita päätesymboleilla (ynnä syötteen loppumisella). Kussakin solussa on jokin seuraavista : SHIFT n poista syötteen ensimmäinen merkki ja lisää pinoon n; REDUCE S γ poista pinon päältä γ:n pituuden verran tiloja, hae siirtymätaulukon nykyisen tilan riviltä ja välikesymbolin S sarakkeelta uusi tila ja pistä tuo tila pinoon; ACCEPT lopeta jäsentäminen tähän; ja REJECT keskeytä jäsennys kielioppivirheen takia.

LR-jäsennysalgoritmi 1. Laita pinoon LR-automaatin aloitustila. 2. Olkoon a syötteen ensimmäinen symboli, tai jos syöte on lopussa, syötteen loppumisen merkki. 3. Olkoon s pinon päällimmäinen tila. 4. Tarkastellaan toimintotaulukon riviä s ja saraketta a: Jos siinä on SHIFT s, 4.1 poista syötteestä sen ensimmäinen symboli ja 4.2 laita pinoon s. Jos siinä on REDUCE A γ: 4.1 poista pinosta γ:n pituuden verran tiloja, 4.2 nimeä väliaikaisesti pinosta nyt löytyvä tila s :ksi, 4.3 laita pinoon siirtymätaulukon riviltä s ja sarakkeelta A löytyvä tila, ja 4.4 suorita produktioon A γ liittyvä ohjelmakoodi. Jos siinä on ACCEPT, lopeta. Jos siinä on REJECT, diagnosoi virhe ja lopeta. 5. Palaa kohtaan 2.

LR(0)-ohjaustaulukkojen konstruointi 1 Jos jossakin kanonisen LR(0)-automaatin tilassa I on item A α aβ (missä a on päätesymboli), merkitse toimintotaulukon riville I sarakkeeseen a SHIFT J, missä J on I:stä a:lla laputetun siirtymän kohde. Jos jossakin tilassa I on item A α (missä A ei ole S ), merkitse toimintotaulukon riville I kaikkiin sarakkeisiin REDUCE A α. Jos jossakin tilassa I on item S S, merkitse toimintotaulukon riville I syötteen loppumista merkitsevään sarakkeeseen ACCEPT. Merkitse siirtymätaulukon riville I sarakkeeseen A GOTO(I, A), jos määritelty. Jos jokin solu jää näin tyhjäksi, merkitse siihen REJECT. 1 Tällä kalvolla S tarkoittaa automaatin konstruktiossa luotua uutta välikesymbolia ja S kieliopin aloitussymbolia.

LR(0) konfliktit Jos toimintotaulukkoon tulisi samaan soluun useampi kuin yksi toiminto, on kyseessä konflikti. Tällöin kielioppi ei ole LR(0) ja jäsentimen konstruktio epäonnistuu. LR(0):ssa konflikteja tulee erittäin herkästi riittää jos samassa tilassa on itemeitä sekä muotoa A α että muunlaisia.

SLR(1)-toimintotaulukon konstruointi SLR on Simple LR Muuten samanlainen kuin LR(0), paitsi reduce-toiminnon osalta: Jos jossakin tilassa I on item A α (missä A ei ole S ), merkitse toimintotaulukon riville I REDUCE A α niihin sarakkeisiin, joiden päätesymbolit kuuluvat joukkoon FOLLOW(A). Tavanomainen lausekekielioppi on SLR(1) mutta ei LR(0).

Esimerkki kieliopista joka ei ole SLR(1) S L = R R L R id R L

Sisällys

LR(1)-item Kuten LR(0)-item, eli produktio, jossa on piste oikealla puolella, mutta: lisäksi päätesymboli (tai syötteen loppumista tarkoittava merkintä) eli lookahead-symboli. Notaatio: A α β, a Tulkinta: α on luettu, β:aa odotetaan, ja β:n jälkeen odotetaan a:ta. LR(k):ssa k tarkoittaa lookahead-symbolijonon pituutta; k > 1 on erittäin harvinainen.

LR(1)-itemjoukon sulkeuma Määritelmä Item-joukon I sulkeuma tarkoittaa pienintä joukkoa C(I), jolle pätevät seuraavat väitteet: 1. I C(I) 2. Jos C(I):ssä on item A α Bβ, a (joillakin A, α, B, β), kieliopista löytyy produktio B γ (jollakin γ) ja on olemassa b FIRST(βa), niin C(I):stä löytyy item B γ, b.

LR(1)-itemjoukon sulkeuma algoritmi 1. Syötteenä item-joukko I. 2. Alusta kaksi paikallista muuttujaa: C, joka on itemjoukko, ja Q, joka on itemjono. C on aluksi I, ja Q:ssa on aluksi (mielivaltaisessa järjestyksessä) I:n alkiot. 3. Toista seuraavaa kunnes Q on tyhjä: 3.1 Poista Q:sta jonon ensimmäinen alkio. 3.2 Jos poistamassasi itemissä on pisteen perässä välikesymboli, nimetään ko. välikesymboli A:ksi. Muutoin hypätään seuraavan kolmen askeleen yli. 3.3 Nimetään poistetun itemin lookahead-symboli a:ksi. 3.4 Nimetään poistetun itemin pisteen jälkeisen A:n jälkeinen osa β:ksi. 3.5 Jokaiselle kieliopin produktiolle A α ja jokaiselle b FIRST(βa) tee seuraavaa: Jos item A α, b ei ole C:ssä, lisää se C:hen sekä Q:n loppuun. 4. Lopputulos on nyt C:ssä.

Funktio GOTO Määritelmä GOTO(I, X) = C { A αx β, a (A α Xβ, a) I }

Kanoninen LR(1)-automaatti Määritelmä Kanoniselle LR(1)-automaatille pätee seuraavaa: Sen tilat ovat itemjoukkoja. Sen aloitustila on C({S S, $}), missä S on uusi välikesymboli, S on kieliopin aloitussymboli ja $ tarkoittaa syötteen loppumista. Jos itemjoukko I on automaatin tila, niin jokaiselle pääte- ja välikesymbolille X pätee seuraavaa: Jos GOTO(I, X) ei ole tyhjä, niin GOTO(I, X) on automaatin tila ja automaatissa on X:llä laputettu siirtymä I:stä GOTO(I, X):ään. Automaatissa ei ole muunlaisia tiloja tai tilasiirtymiä.

LR(1)-ohjaustaulukkojen konstruointi 2 Jos jossakin kanonisen LR(1)-automaatin tilassa I on item A α aβ, b (missä a on päätesymboli), merkitse toimintotaulukon riville I sarakkeeseen a SHIFT J, missä J on I:stä a:lla laputetun siirtymän kohde. Jos jossakin tilassa I on item A α, a (missä A ei ole S ), merkitse toimintotaulukon riville I sarakkeeseen a REDUCE A α. Jos jossakin tilassa I on item S S, $, merkitse toimintotaulukon riville I syötteen loppumista merkitsevään sarakkeeseen ACCEPT. Merkitse siirtymätaulukon riville I sarakkeeseen A GOTO(I, A), jos määritelty. Jos jokin solu jää näin tyhjäksi, merkitse siihen REJECT. 2 Tällä kalvolla S tarkoittaa automaatin konstruktiossa luotua uutta välikesymbolia ja S kieliopin aloitussymbolia.

Lookahead LR (LALR) C:n kaltaisen kielen LR(1)-jäsentäjässä on tyypillisesti tuhansia tiloja. Lookahead LR (LALR) on lähes LR(1):n veroinen menetelmä, jolla tilojen määrä tippuu merkittävästi. Ideana yhdistää LR(1)-tilat, joissa on lookahead-symboleja vaille samat itemit tällöin LALR-itemissä on lookahead-symbolijoukko.

LR LALR ei tuota shift/reduce-konfliktia Oletetaan, että LALR-jäsentimessä on shift/reduce-konflikti. Tällöin täytyy olla jossakin tilassa sekä A α, {..., a,...} että B β aγ, {..., b,...}. Tällöin alkuperäisessä LR-jäsentimessä täytyy olla tila, jossa on sekä A α, a että B β aγ, b. Kyseisessä LR-tilassa on shift/reduce-konflikti.

LR LALR voi luoda r/r-konfliktin Tarkastellaan LR(1)-tiloja ja {(A c, d), (B c, e)} {(A c, e), (B c, d)}. Kummassakaan ei ole konfliktia. Näistä syntyy LALR(1)-tila {(A c, {d, e}), (B c, {d, e})}, jossa on reduce/reduce-konflikti.

Sisällys

toiminnot Sekä LL- että LR-jäsennyksessä ohjelmoija voi yleensä liittää produktioon ohjelmakoodia. Ohjelmakoodissa on käytettävissä produktion oikean puolen symbolien semanttiset arvot. Ohjelmakoodin odotetaan laskevan produktion vasemman puolen välikesymbolille semanttisen arvon. LL-jäsentimessä ohjelmakoodi suoritetaan produktion toteuttavan koodin lopuksi, ja laskettu semanttinen arvo palautetaan aliohjelman paluuarvona. LR-jäsentimessä ohjelmakoodi suoritetaan produktion REDUCEn yhteydessä, ja semanttinen arvo liitetään pinossa olevan tilaan lisätiedoksi. Päätesymbolin semanttinen arvo liitetään pinon tilaan toki SHIFTin yhteydessä.

Esimerkki: käsin koodattu prediktiivinen 3 private Expression parseprefixexpression() throws IOException, ParseException { Pos pos = l.getpos(); int op = l.peek(); switch (op) { case + : l.get(); return new UnaryPlusExpression(pos, parseprefixexpression()); case - : l.get(); return new UnaryMinusExpression(pos, parseprefixexpression()); case ~ : l.get(); return new BitwiseNotExpression(pos, parseprefixexpression()); case ( : if (istypefirst(l.peek(1))) { l.get(); Type ty = parsetype(); l.get( ) ); return new CastExpression(pos, ty, parseprefixexpression()); } } /* passthrough */ default: return parsepostfixexpression(); } 3 http://antti-juhani.kaijanaho.fi/darcs/darcsweb/ darcsweb.cgi?r=alkeis2007-compiler;a=headblob;f= /alkeis/parser.java

Esimerkki: CUP multiplicative_expression ::= prefix_expression:e {: RESULT = e; :} multiplicative_expression:e1 ASTERISK prefix_expression:e2 {: RESULT = new MultiplicationExpression(e1,e2); :} multiplicative_expression:e1 SOLIDUS prefix_expression:e2 {: RESULT = new DivisionExpression(e1,e2); :} multiplicative_expression:e1 PERCENT prefix_expression:e2 {: RESULT = new RemainderExpression(e1,e2); :} ;

Määrittelyjen kommunikointi selaajalle Jos kielessä on tarpeen erotella eri nimisanasluokkia sen mukaan, mitä on ohjelmassa määritelty, tulee jäsentimen päivittää selaajan näkemystä nimiluokista määrittelyn tultua jäsennettyä. Tällöin selaajassa on hyvä olla kolme metodia void enterscope(), void leavescope() ja void declaretypename(string) (tai vastaava). enterscope pistää muistiin näkyvyysalueen alkamisen. leavescope peruu kaikki declaretypenamet, jotka on tehty viimeisimmän leavescope-parittoman enterscopen jälkeen. declaretypename lisää annetun nimen tyyppinimien luetteloon.

Toteutus selaajassa Tyyppinimien luettelo koostuu kahdesta tietorakenteesta: hajautustaulusta, jossa on kulloinkin voimassa olevat tyyppinimet, ja pinosta, jonka alkioissa on tieto muutetusta nimestä sekä sen vanhasta statuksesta. enterscope laittaa pinoon jonkinlaisen merkin. leavescope käy pinoa läpi kunnes löytää merkin, ja palauttaa pinossa olevien alkioiden avulla nimille niiden vanhat statukset. declaretypename laittaa pinoon nimen vanhan statuksen ja kirjaa uuden statuksen hajautustauluun. Esim. mallikääntäjän fi.jyu.ties448.eska.util.scopedset.

Toteutus jäsentäjässä Kun on jäsennetty uuden määrittelyalueen alku (esim. lohkon alku), tulee jäsentäjän kutsua selaajan enterscopea. Kun on jäsennetty määrittelyalueen loppu (esim. lohkon loppu), tulee jäsentäjän kutsua selaajan leavescopea. Kun jäsennetty määrittely, tulee jäsentäjän kutsua selaajan declaretypenamea. Huom! Tämä on usein ennen määrittelyn lopullista päättymistä esim. luokkanimi pitää declaretypenamettaa ennen luokan jäsenten (attribuutit, metodit) jäsentämistä!

Esimerkki CUP:ssa block ::= block_head:l stmts:ss CBRACE:r {: RESULT = new BlockStatement(ss, new Pos(l.pos,r.pos)); getca().leavescope(); :} ; block_head ::= OBRACE:it {: getca().enterscope(); RESULT = it; :} ; class_definition ::= class_head:ch extends_opt:ex OBRACE class_body:b CBRACE:r {: RESULT = new ClassDefinition(ch, ex, b, new Pos(ch.pos, r.pos)); :} class_head:d SEMICOLON {: RESULT = d; :} ; class_head ::= CLASS:l IDENTIFIER:id {: getca().declaretypename(id.value); RESULT = new ClassDeclaration(id, new Pos(l.pos, id.pos)); :} CLASS:l TYPENAME:id {: RESULT = new ClassDeclaration(id, new Pos(l.pos, id.pos)); :} ;

Sisällys

Käyttäjä usein odottaa, että kääntäjä diagnosoi muitakin virheitä kuin ensimmäisen vastaantulleen. Jäsentimen tulee tällöin kyetä toipumaan virheistä. Yksinkertainen tapa on paniikkitila: syödään syötettä kunnes löydetään synkronointimerkki (esim. ;), ja poistetaan pinosta kamaa kunnes löytyy jotain, joka osaa sen syödä. Jäsennyksen päätyttyä tarkistetaan, annettiinko virhediagnooseja, ja lopetetaan käännös jos annettiin.

Paniikkitila käsin kirjoitetussa jäsentimessä Kun havaitaan virhe, diagnosoidaan se ja heitetään poikkeus. Jokin toipumiseen soveltuva produktioaliohjelma (esim. statement) nappaa poikkeuksen kiinni, syö syötettä kunnes löytää synkronointimerkin ja sitten jatkaa kuin mitään ei olisi tapahtunut. Hyviä synkronointimerkkejä ovat synkronoivan välikesymbolin FOLLOW-joukon alkiot, sekä tyypilliset synkronoivan välikesymbolin päättävät päätesymbolit (usein puolipiste).

Paniikkitila LR-jäsentimessä Kun havaitaan virhe, poistetaan pinosta tiloja kunnes löytyy sellainen, jossa on SHIFT-toiminto fiktiiviselle ERROR-päätesymbolille, toteutetaan ko. SHIFT koskematta kuitenkaan syötteeseen, ja jatketaan kuin mitään ei olisi tapahtunut. tulee lisätä kielioppiin sopiviin kohtiin ERROR-päätesymboli. Hyvä idea on lisätä statement-nonterminaalille (S) produktio S ERROR ; Eli siis ERROR, ja sen perään synkronointimerkki. tulee myös yleensä tällöin itse tuottaa virhediagnoosi error-produktion ohjelmakoodissa.

Sisällys

Seuraava deadline Vaihe B tiistai 6.10. klo 10 selaaja ja jäsentäjä toimivat