TIES542 kevät 2009 Lausekkeista ja vähän muustakin

Samankaltaiset tiedostot
Luku 3. Syntaktisia kysymyksiä. 3.1 Lausekkeet

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

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

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

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

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

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

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

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

Rekursiiviset tyypit

Tietojenkäsittelyteorian alkeet, osa 2

Yhteydettömät kieliopit [Sipser luku 2.1]

(1) refleksiivinen, (2) symmetrinen ja (3) transitiivinen.

Matematiikassa ja muuallakin joudutaan usein tekemisiin sellaisten relaatioiden kanssa, joiden lakina on tietyn ominaisuuden samuus.

11.4. Context-free kielet 1 / 17

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

FORMAALI SYSTEEMI (in Nutshell): aakkosto: alkeismerkkien joukko kieliopin määräämä syntaksi: sallittujen merkkijonojen rakenne, formaali kuvaus

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

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

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

Luonnollisten lukujen ja kokonaislukujen määritteleminen

Ensimmäinen ohjelmointikieli

MAT Algebra 1(s)

Attribuuttikieliopit

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

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

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

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

Täydentäviä muistiinpanoja Turingin koneiden vaihtoehdoista

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

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

Kuvauksista ja relaatioista. Jonna Makkonen Ilari Vallivaara

2. Yhteydettömät kielet

Silmukkaoptimoinnista

MS-A0402 Diskreetin matematiikan perusteet

Mitään muita operaatioita symbolille ei ole määritelty! < a kaikilla kokonaisluvuilla a, + a = kaikilla kokonaisluvuilla a.

Java-kielen perusteet

Esko Turunen Luku 3. Ryhmät

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

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

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

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

Diskreetin matematiikan perusteet Laskuharjoitus 2 / vko 9

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

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

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

Jäsennys. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Täydentäviä muistiinpanoja jäsennysalgoritmeista

6. Tekijäryhmät ja aliryhmät

Ongelma(t): Miten mikro-ohjelmoitavaa tietokonetta voisi ohjelmoida kirjoittamatta binääristä (mikro)koodia? Voisiko samalla algoritmin esitystavalla

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

ALGEBRA KEVÄT 2013 JOUNI PARKKONEN

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

Algebra I Matematiikan ja tilastotieteen laitos Ratkaisuehdotuksia harjoituksiin 3 (9 sivua) OT

T Syksy 2004 Logiikka tietotekniikassa: perusteet Laskuharjoitus 7 (opetusmoniste, kappaleet )

Java-kielen perusteet

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Pinot, jonot, yleisemmin sekvenssit: kokoelma peräkkäisiä alkioita (lineaarinen järjestys) Yleisempi tilanne: alkioiden hierarkia

Matematiikan tukikurssi

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

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

Logiikan kertausta. TIE303 Formaalit menetelmät, kevät Antti-Juhani Kaijanaho. Jyväskylän yliopisto Tietotekniikan laitos.

Kuvaus eli funktio f joukolta X joukkoon Y tarkoittaa havainnollisesti vastaavuutta, joka liittää joukon X jokaiseen alkioon joukon Y tietyn alkion.

MS-A0401 Diskreetin matematiikan perusteet

Kuvaus eli funktio f joukolta X joukkoon Y tarkoittaa havainnollisesti vastaavuutta, joka liittää joukon X jokaiseen alkioon joukon Y tietyn alkion.

MS-A0402 Diskreetin matematiikan perusteet Esimerkkejä, todistuksia ym., osa I

2.4 Normaalimuoto, pohja ja laskentajärjestys 2.4. NORMAALIMUOTO, POHJA JA LASKENTAJÄRJESTYS 13

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

MS-A0402 Diskreetin matematiikan perusteet Esimerkkejä, todistuksia ym., osa I

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

[a] ={b 2 A : a b}. Ekvivalenssiluokkien joukko

Ongelma(t): Miten jollakin korkeamman tason ohjelmointikielellä esitetty algoritmi saadaan suoritettua mikro-ohjelmoitavalla tietokoneella ja siinä

Valitsemalla sopivat alkiot joudutaan tämän määritelmän kanssa vaikeuksiin, jotka voidaan välttää rakentamalla joukko oppi aksiomaattisesti.

Matematiikan johdantokurssi, syksy 2016 Harjoitus 11, ratkaisuista

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

Kokonaislukuoptimointi

811120P Diskreetit rakenteet

Kurssikoe on maanantaina Muista ilmoittautua kokeeseen viimeistään 10 päivää ennen koetta! Ilmoittautumisohjeet löytyvät kurssin kotisivuilla.

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

Yhtälönratkaisusta. Johanna Rämö, Helsingin yliopisto. 22. syyskuuta 2014

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

8. Kieliopit ja kielet

Johdatus diskreettiin matematiikkaan Harjoitus 2, Osoita että A on hyvin määritelty. Tee tämä osoittamalla

Matematiikan tukikurssi, kurssikerta 2

Yhteydettömän kieliopin jäsennysongelma

Täydentäviä muistiinpanoja laskennan rajoista

Sisällys. 3. Muuttujat ja operaatiot. Muuttujat ja operaatiot. Muuttujat. Operaatiot. Imperatiivinen laskenta. Muuttujat. Esimerkkejä: Operaattorit.

8 KANNAT JA ORTOGONAALISUUS. 8.1 Lineaarinen riippumattomuus. Vaasan yliopiston julkaisuja 151

A TIETORAKENTEET JA ALGORITMIT

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

Matriisit, L20. Laskutoimitukset. Matriisikaavoja. Aiheet. Määritelmiä ja merkintöjä. Laskutoimitukset. Matriisikaavoja. Matriisin transpoosi

3. Muuttujat ja operaatiot 3.1

1 Lineaariavaruus eli Vektoriavaruus

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

8 Joukoista. 8.1 Määritelmiä

Algoritmit 2. Luento 4 To Timo Männikkö

Pinoautomaatit. Pois kontekstittomuudesta

a) Mitkä seuraavista ovat samassa ekvivalenssiluokassa kuin (3, 8), eli kuuluvat joukkoon


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

Transkriptio:

IES542 kevät 2009 Lausekkeista ja vähän muustakin Antti-Juhani Kaijanaho 13. tammikuuta 2009 1 Lausekkeet Ehkä mullistavin ero toisen ja kolmannen ohjelmointikielisukupolvien siis symbolisen konekielen ja tavanomaisen (imperatiivisen) ohjelmointikielen välillä on siinä, miten laskutoimitukset on niissä ilmaistava. Symbolisessa konekielessä laskentakäskyt ovat tyypillisesti muotoa ota luku muistipaikasta A, ota toinen luku muistipaikasta B ja tallenna niiden summa muistipaikkaan C, ja ohjelmoijaparan epäkiitolliseksi tehtäväksi jää laskutehtävän pilkkominen tällaisten atomisten laskutoimitusten jonoksi. Esimerkiksi hypotenuusan pituuden laskeminen c a 2 + b 2 joudutaan kirjoittamaan symbolisella konekielellä tyyliin t 1 a a t 2 b b t 3 t 1 + t 2 c t 3 (missä nuoli vasemmalle ilmaisee muuttujaan sijoittamista toki jokaisella konekielellä on omat erityispiirteensä, ja kullakin konekielellä koodi näyttäisi huomattavastikin erilaiselta kuin yllä, mutta ylläolevassa tulee olennainen esille). Kun vielä tyypillisessä konekielessä nopeiden muistipaikkojen eli rekisterien määrä on erittäin rajallinen (vanhoissa koneissa muutama, Intelin 32-bittisissä puolisen tusinaa, parhaissa muutama kymmenen) ja tyypillisessä ohjelmassa tällaista laskentaa harjoitetaan jatkuvasti, kasvaa ohjelmoijan työmäärä ja virhealttius merkittävästi. Ensimmäiset ohjelmointikielet eivät olleet juuri sen kummallisempia kuin symbolisten konekielten yksinkertaisia laajennuksia, joissa ohjelmoija saattoi kirjoit- 1

taa sijoituskäskyn oikealle puolelle kohtuullisen monimutkaisen aritmeettisen laskutehtävän. Vielä tänäkin päivänä tuki tällaisille lausekkeille on ohjelmointikielen yksi tärkeimmistä (mutta helposti huomaamatta jäävistä) tehtävistä. Maailman vanhimman korkean tason ohjelmointikielen nimi on ORRAN, formula translator, syystä. Sallittujen lausekkeiden joukko riippuu kielestä. Käytännössä kaikki ohjelmointikielet tukevat ainakin tavallisia aritmeettisia lausekkeita: 1. Lukuvakio on aritmeettinen lauseke. 2. Muuttuja, joka on nykyisessä ympäristösssä sidottu lukuarvoon, on aritmeettinen lauseke. 3. Jos e ja e ovat aritmeettisia lausekkeita, niin e + e, e e, e e ja e/e ovat aritmeettisia lausekkeita. 4. Jos e on aritmeettinen lauseke, niin e ja (e) ovat aritmeettisia lausekkeita. Yllä esitetyt lauseketyypit voidaan jaotella primäärilausekkeisiin (engl. primary expressions), unaarilausekkeisiin (engl. unary expressions) sekä binäärilausekkeisiin (engl. binary expressions). Primäärilausekkeita ovat sulkulausekkeet (e) sekä lukuvakiot ja muuttujat lausekkeina. Unaarilausekkeet jäsentyvät siten, että niissä on ensin jokin operaattori (engl. operator) ja sitten alilauseke (ns. operandi (engl. operand)); unaarilausekkeita ovat muotoa e, missä operaattori on ja operandi on e. Binäärilausekkeet alkavat alilausekkeella (vasen operandi), jonka jälkeen tulee operaattori (+,, tai /) ja lopuksi toinen alilauseke (oikea operandi). Lauseketta, jossa binäärinen operaattori voi sijaita operandiensa välissä, sanotaan infix-lausekkeeksi. Ongelmana tällaisissa lausekkeissa on, että ei ole aina aivan selvää, miten lauseke pitäisi ymmärtää. Esimerkki tällaisesta moniselitteisestä (engl. ambiguous) lausekkeesta on 1 + 2 3: pitääkö se ymmärtää samoin kuin (1 + 2) 3 vai kenties samoin kuin 1 + (2 3)? Jo muinaiset matemaatikot tiesivät tähän ratkaisun: pitää määritellä, mikä on eri operaattoreiden presedenssi (engl. precedence) ja assosiatiivisuus (engl. associativity). Jos tarkasteltavana on lauseke muotoa e e e, missä operaattorilla on korkeampi presedenssi kuin operaattorilla, sen sovitaan tarkoittavan (e e ) e ; jos taas operaattorilla on matalampi presedenssi kuin operaattorilla, sen sovitaan tarkoittavan e (e e ). Jos operaattoreilla ja on sama presedenssi, niin lausekkeen tulkinta riippuu niiden assosiatiivisuudesta. Jos molemmat assosioituvat vasemmalle (engl. associate to the left), lauseke tulkitaan (e e ) e, ja jos molemmat assosioituvat oikealle (engl. associate to the right), lauseke tulkitaan e (e e ). Jos ne assosioituvat eri suuntaan tai ainakaan toinen ei assosioidu lainkaan, lausekkeen todetaan olevan kielen sääntöjen vastainen. Jos sama ope- 2

(unaarinen) / + aulukko 1: avanomaisten aritmeettisten operaattoreiden normaali presedenssirelaatio raattori voi esiintyä sekä unaarisena että binäärisenä (esimerkiksi ), tulee sen unaarinen ja binäärinen versio pitää erillään; niillä on yleensä eri presedenssi. Presedenssi- ja assosiointisäännöt vaihtelevat kielestä toiseen. Yleensä lienee järkevää, että matematiikasta tutut aritmeettiset operaattorit (esimerkiksi yhteen-, vähennys-, kerto- ja vähennyslaskuoperaattorit sekä vastalukuoperaattori) noudattavat matematiikasta tuttua presedenssiä: vastalukuoperaattorilla (unaarinen ) on korkeampi presedenssi kuin kerto- ja jakolaskuoperaattoreilla, joilla puolestaan on korkeampi presedenssi kuin yhteen- ja vähennyslaskuoperaattoreilla. Kerto- ja jakolaskuoperaattoreilla on sama presedenssi, ja samoin yhteen- ja vähennyslaskuoperaattoreilla on sama presedenssi. Kaikki nämä operaattorit assosioituvat vasemmalle paitsi vastalukuoperaattori, joka assosioituu oikealle. Presedenssi muodostaa operaattoreiden välille osittaisjärjestyksen 1. Yleensä kuitenkin presedenssirelaatio on täydellinen järjestys ja se esitetään tavallisesti taulukkona, jossa korkeamman presedenssin omaavat operaattorit ovat korkeammalla kuin matalamman presedenssin omaavat operaattorit. Edellä esitetyt tavanomaiset presedenssisäännöt on esitetty taulukossa 1. Kannattaa huomata, että presedenssi ja assosiatiivisuus eivät määrittele laskujärjestystä vaan jäsennyksen, vaikka toisin usein ajatellaankin. Esimerkiksi lausekkeessa 2 + 3 + 4 5 voidaan laskea ensin 2 + 3 siitä huolimatta, että koulussa opetettiin, että kertolasku lasketaan ensin. Vaikka infix-lausekkeet ovatkin kaikista tutuimpia, eivät ne ole ainoat mahdollisuudet. Voidaan esimerkiksi käyttää ns. puolalaisia (engl. Polish) eli prefixlausekkeita, joissa operaattori tulee aina ensin ja vasta sitten operandit. ämän esitystavan etu on, että sulkuja tai presedenssi- ja assosiatiivisuussääntöjä ei tarvita, jos operaattorien operandimäärä on kiinteä (eli jos sama operaattori ei ole sekä unaarinen että binäärinen): + 2 3 4 5 tarkoittaa yksiselitteisesti samaa kuin infix-lauseke (2 3) + (4 5). Vastaavasti voidaan käyttää käänteisesti puolalaisia (engl. reverse Polish) eli postfix-lausekkeita, joissa operaattori tulee 1. Muistakaamme, että osittaisjärjestys (engl. partial order) on relaatio, joka on refleksiivinen (a a pätee aina), antisymmetrinen (jos a b ja b a pätevät, niin a = b pätee) ja transitiivinen (jos a b ja b c pätevät, niin a c pätee). äydellinen järjestys (engl. total order) vaatii lisäksi totaalisuuden (a b tai b a pätee aina). 3

/ + 2 3 6 7 8 Kuva 1: Lausekkeen (2 + 3) 6 7/8 rakennepuu operandien jälkeen. uo sama lauseke olisi postfix-lausekkeena 2 3 4 5 +. 2 Lausekkeita onkin paras ajatella puina, jotka vain kirjoitetaan näkyviin infix-, prefix- tai postfix-tyylillä. Näissä puissa operaattorit ovat sisäsolmuja ja operandit ovat operaattorinsa alipuita. Puun lehdet muodostuvat muuttujista ja lukuvakioista. ällaista puuta sanotaan lausekkeen rakennepuuksi (engl. structural tree); eräs sellainen on kuvattu kuvassa 1. 2 Syntaksi Ohjelmointikielten konkreetti ja abstrakti kielioppi määritellään yleensä täsmällisesti käyttämällä yhteydettömien kielioppien (context-free grammars) käsitteistöä. Abstrakti kielioppi ilmaistaan tavallisesti puhtaasti muunnossäntöinä (rewrite rules, productions): E E + E E E E E E/E L 2. Postfix-lausekkeet ovat käytössä orth- ja Postscript-kielissä. Prefix-lausekkeiden muunnelma, ns. Cambridgen-puolalainen lauseketyyppi, jossa operaattorit tulevat aina operandien edellä mutta lausekkeiden ympärillä on aina sulut, on käytössä Lisp-sukuisissa kielissä. 4

ässä E ja L ovat välikesymboleja (nonterminal symbols) ja +,, ja / ovat päätemerkkejä (terminal symbols). Välikesymboli L edustaa literaalisanasta, jonka rakennetta ei ole tässä kuvattu. ärkeää tässä on huomata, että tämä kielioppi on moniselitteinen (ambiguous) se ei kelpaisi merkkijonon jäsentämiseen. Siihen se ei ole tarkoitettukaan: tämä kielioppi on abstrakti, se kuvailee nelilaskimen lausekkeiden oleelliset osat, ei kaikkea sitä, jota niiden kirjoittamiseen merkkijonona tarvitaan. Oikeastaan abstrakti kielioppi kuvaa tietorakenteen, jossa tällaiset lausekkeet voidaan esittää havainnollisesti. Saman asian konkreetti kielioppi on yksiselitteinen ja varsin sotkuinen: E E + E / L (E) Edellä käytettyjen merkintöjen lisäksi tässä esiintyy kaksi uutta välikesymbolia ( ja ) seka kaksi uutta päätemerkkiä (aaltosulkeet). Konkreetti kielioppi ilmaistaan yleensä käyttäen John Backusin 1950- ja 1960- lukujen vaihteessa kehittämää merkintätapaa, jota Peter Naur kehitti edelleen ja käytti Algol 60:n määrittelydokumentissa, nimittäin BN:ää (Backus Naur form, ei Backus normal form 3 ) tai jotain sen muunnelmaa. BN:llä ilmaistuna ylläoleva kielioppi kirjoitetaan seuraavasti: Expression ::= erm Expression + erm Expression erm erm ::= actor erm actor erm / actor actor ::= Literal ( Expression ) 3. Donald E. Knuth. Backus Normal orm vs. Backus Naur orm. Communications of the ACM (letters to the editor), vol. 7, no. 12, December 1962. 5

ISO ja IEC standardoivat vuonna 1996 laajennetun version BN:stä 4, EBN:n. EBN laajentaa BN:ää lisäämällä siihen tuen valinnaisuuden, toiston, ryhmittelyn, määräkertaisen toiston ja poikkeustapausten ilmaisemiseen. EBN sallii välikesymbolin koostua useammasta sanasta. Lisäksi EBN sallii kommenttien lisäämisen kieliopin kuvaukseen. Internet-protokollien määrittelyissä käytetty BN:n muunnelma (Augmented BN eli ABN) on myös standardoitu: RC5234 5 on syntaktisen metakielen Internetstandardi. Konkreetin kieliopin voi ajatella kuvaukseksi, joka kuvaa merkkijonoja (tai sanasjonoja) järjestetyiksi puiksi. Näiden puiden sisäsolmut ovat välikesymboleita ja lehtisolmut päätemerkkejä (sanasia). ällaisesta ns. jäsennyspuusta (parse tree) voidaan lukea koko merkkijono (sanasjono) käymällä puu läpi järjestyksessä ja merkitsemällä kukin kohdattu lehtisolmu ylös. Kunkin (epätriviaalin) alipuun juuri (joka on alkuperäisen puun sisäsolmu) kertoo, mitä välikesymbolia kyseinen puu vastaa. Kuvassa 2 kuvataan erään aritmeettisen lausekkeen jäsennyspuu edellä annetun konkreetin kieliopin mukaan. 3 Algebrallinen tulkinta Matemaattisesta näkökulmasta katsoen abstrakti kielioppi määrittelee (algebrallisen) operaattoriston (engl. (algebraic) operator domain). Määritelmä 1 Operaattoristo koostuu epätyhjästä joukosta lajeja (engl. sort, phylum); epätyhjästä joukosta operaattoreita (engl. operator); kuvauksesta, joka liittää kuhunkin operaattoriin lajin (sen (tulos)laji, (result) sort); kuvauksesta, joka liittää kuhunkin operaattoriin luonnollisen luvun (sen paikkaluvun, arity), joka voi olla nolla; ja kuvauksesta, joka liittää kuhunkin operaattoriin jonon lajeja (sen operandilajit, operand sorts), missä ko. jonon pituus on operaattorin paikkaluku. Jos operaattoristossa on vain yksi laji, ei operaattorien tulos- ja operandilajeja luonnollisestikaan ole tarpeen määritellä riittää määritellä vain operaattorit ja niiden paikkaluvut. 4. Information lechnology Syntactic metalanguage Extended BN. International standard ISO/IEC 14977:1996(E), 1996. 5. http://www.rfc-editor.org/rfc/rfc5234.txt 6

L E E L L L E E L ( 2 + 3 ) 6 8 / 7 Kuva 2: Lausekkeen (2 + 3) 6 7/8 jäsennyspuu sivulla 5 annetun konkreetin kieliopin mukaan 7

operaattori tulos- paikka- operandilajit laji luku 1 2 3 + luvut 2 luvut luvut luvut 2 luvut luvut luvut 2 luvut luvut luvut 1 luvut = totuusarvot 2 luvut luvut < totuusarvot 2 luvut luvut > totuusarvot 2 luvut luvut totuusarvot 2 luvut luvut totuusarvot 2 luvut luvut totuusarvot 2 totuusarvot totuusarvot totuusarvot 2 totuusarvot totuusarvot totuusarvot 2 totuusarvot totuusarvot totuusarvot 2 totuusarvot totuusarvot? : luvut 3 totuusarvot luvut luvut aulukko 2: Eräs kaksilajinen operaattoristo Esimerkiksi aritmeettisten lausekkeiden operaattoristo muodostuu seuraavasti: yksi laji (luvut); neljä operaattoria (+,, ja unaarinen ); operaattoreiden +, ja paikkaluku on kaksi; ja unaarisen -operaattorin paikkaluku on yksi. Kun ohjelmointikieleen yleensä sisältyy myös tarve tehdä päätöksiä laskutoimitusten tulosten perusteella, saadaan hieman monimutkaisempi (mutta kuitenkin suhteellisen yksinkertaisempi) operaattoristo aikaan. Operaattoristossa on kaksi lajia (luvut ja totuusarvot), ja sen muut ominaisuudet on määritelty kompaktisti taulukossa 2. Oikeastaan kummastakin esimerkistä puuttuu operaattoreita, sillä myös kaikki vakiot pitäisi luetella operaattoreina (lukuvakiot kuin myös mahdolliset totuusarvovakiot). Vakio-operaattoreiden paikkaluku on luonnollisesti nolla. Operaattoriston merkitys tulee näkyviin kunnolla vasta, kun on määritelty algebra: Määritelmä 2 Olkoon meillä annettuna jokin operaattoristo. Algebra määrittelee kullekin lajille kantajajoukon (engl. carrier set) sekä 8

kullekin operaattorille kuvauksen sen operandilajien kantajajoukoilta sen tuloslakin kantajajoukolle. Esimerkiksi edellä määriteltyyn aritmetiikan operaattoristoon voidaan määritellä algebra seuraavasti: Kantajajoukkona on kokonaislukujen joukko. Operaattori + on kokonaislukujen yhteenlasku. Operaattori on kokonaislukujen vähennyslasku. Operaattori on kokonaislukujen kertolasku. Unaarinen on vastalukuoperaattori. Jokaiselle operaattoristolle on olemassa erityinen algebraluokka seuraavasti: Määritelmä 3 Olkoon annettuna kullekin operaattoriston lajille s joukko X s siten, että sama alkio ei kuulu kahden eri lajin X-joukkoon. Lajin s 0-sanoja ovat kaikki jonot, joiden ainoa alkio kuuluu X s :ään. Lajin s n + 1-sanoja ovat kaikki jonot, jotka ovat muotoa Oa 1... a n, missä O on operaattori, jonka paikkaluku on n ja jonka tuloslaji on s, ja kukin a i on O:n i:nnen operandilajin n-sana ja peräkkäin kirjoittaminen tarkoittaa jonojen yhdistämistä (konkatenaatio). Äärellinen jono on lajin s sana, jos on olemassa jokin luonnollinen luku n siten, että kyseinen jono on lajin s n-sana. Määritellään kullekin operaattorille O kuvaus sen operandilajien sanojen joukoilta sen tuloslajin sanojen joukolle siten, että sanat a 1,..., a n (missä n on O:n paikkaluku) kuvataan sanaksi Oa 1... a n. Se algebra, jonka kantajajoukkoja ovat kunkin lajin sanojen joukot ja jossa operaattoriin liitetään edellä määritelty kuvaus, on operaattoriston sana-algebra yli X:n (engl. word algebra over X). Joukkojen X s alkioita sanotaan muuttujiksi. Esimerkiksi aritmetiikan operaattoriston sanoja ovat muiden muassa +xy, +x yz, kunhan x, y ja z kuuluvat X-joukkoon. Lienee helppo huomata, että sanat ovat operaattoreista ja muuttujista muodostettavia prefix-lausekkeita. Sanat voitaisiin ihan hyvin määritellä myös sulutettuina infix-lausekkeina taikka postfixlausekkeina, mutta tapana on käyttää prefix-muotoa. Sana-algebra yli tyhjän muuttujajoukon on esimerkki initaalialgebrasta (engl. initial algebra). Initiaalialgebran täsmällinen määritelmä on sen verran sotkuinen (ei 9

tosin vaikea), että sivuutetaan se tässä (ks. esim. Piercen kategoriateoriakirja 6 ), mutta sen idea on seuraava: Jokaisesta initiaalialgebrasta on yksikäsitteinen rakenteen säilyttävä (eli homomorfinen) kuvaus jokaiselle saman operaattoriston algebralle. Varsin hämmästyttävä kategoriateorian alkeistulos on, että kaikki initiaalialgebrat ovat isomorfisia (eli olennaisesti samanlaisia ). Mikä tahansa kielen konkreetti kielioppi kelpaa sen initiaalialgebraksi varsin yksinkertaisella tavalla. Myös jäsennyspuut ja rakennepuut muodostavat initiaalialgebroja. Gougen ja kumppanit 7 esittivätkin 1970-luvulla varsin näppärän määritelmän abstraktille syntaksille: kielen abstrakti syntaksi on kaikki kielen initiaalialgebrat tulkittuna (isomorfisuuden nojalla) samaksi vekottimeksi. 6. Benjamin C. Pierce: Basic Category heory for Computer Scientists, MI Press, 1991. 7. J. A. Gougen, J. W. hatcher, E. G. Wagner ja J. B. Wright: Initial Algebra Semantics and Continuous Algebras, Journal of the ACM 24 (1), 1977. 10