Sve 1.5 Iikka Hauhio 18. tammikuuta 2015
Sisältö 1 Suorituksenaikainen ympäristö 1 1.1 Oliot ja niiden rakenne........................ 1 1.1.1 Hajautustaulut........................ 1 1.2 Muuttujat ja muuttujaympäristöt.................. 3 2 Leksikaalinen rakenne 3 3 Kielioppi 3 3.1 Lauseet................................ 3 3.1.1 Lohkolause.......................... 3 3.1.2 Ehtolause........................... 4 3.1.3 While-silmukkalause..................... 4 3.1.4 Do-silmukkalause....................... 4 3.1.5 For-silmukkalause...................... 4 3.1.6 Hyppylause.......................... 5 3.1.7 Palautuslause......................... 5 3.1.8 Lausekelause......................... 5 3.1.9 Funktiolause......................... 5 3.2 Lausekkeet.............................. 5 3.2.1 Binäärioperaattorilauske................... 5 3.2.2 Taululausekkeet....................... 7 3.2.3 Funktiokutsulauseke..................... 7 3.2.4 Vastalukulauseke....................... 7 3.2.5 EI-lauseke........................... 7 3.2.6 Ehtolauseke.......................... 8 3.2.7 Muuttujalausekkeet..................... 8 3.2.8 Listalauseke.......................... 9 3.2.9 Taululauseke......................... 9 3.2.10 Funktiolauseke........................ 9 3.2.11 Sanalauseke.......................... 9
1 Suorituksenaikainen ympäristö Ennen varsinaisen kieliopin esittelemistä lienee parasta selostaa Sve-kielen suorituksenaikainen ympäristö, jonka ymmärtäminen on oleellista kieliopillisten lauseiden toiminnan käsittämiseksi. 1.1 Oliot ja niiden rakenne Olio on Sven tärkein käsite. Ohjelman käyttämä muisti on aina järjestelty oliohin. Kaikki oliot voidaan jakaa kahteen osaan: kangastusarvoon ja hajautustauluun. Nämä kaksi osaa ovat toisistaan erottamattomat. Kangastusarvo on luonteeltaan arvo ja hajautusarvo viittaus. Kangastusarvoluokat on lueteltu alla. Luku IEEE 754 -standardin mukainen liukulukuarvo. Merkkijono Totuusarvo Unicode-standardia tukeva merkkijonoarvo. Totuusarvo: tosi tai epätosi. Nil Arvo, jota käytetään ilmaisemaan kangastusarvon puuttumista tai olemattomuutta. Huomaa, että nil-tyyppisillä olioilla on silti hajautustaulu. Funktio Viittaus svefunktioon ja sen määritelleeseen ympäristöön. Natiivifunktio Viittaus funktioon, jota ei ole kirjoitettu Svellä. Taulu Oliota, jolla ei ole kangastusarvoa, sanotaan tauluolioksi. Käytetään, jos halutaan korostaa olion hajautustaulua. 1.1.1 Hajautustaulut Hajautustaulut ovat Sven monimutkaisin ominaisuus. Jokainen hajautustaulu sisältää viittauksia paitsi tavallisiin olioihin, myös kahteen muuhun hajautustauluun ja yhteen funktioon. Taulujen idea on yksinkertainen: ne yhdistävät avaimina toimivat merkkijonot niitä vastaaviin olioihin. Taulut ovat monikäyttöisijä ja lähes jokainen sveohjelma käyttää niitä. Hajautustaulujen tärkein osa on niiden sisältämä lista avain-olio-pareista. Jos taululle tehdään kysyly tiettyyn avaimeen liitetystä arvosta, palautetaan ensisijaisesti taulun omasta listasta löytyvä olio. Jos tästä listasta ei kuitenkaan oliota löydy, sitä yritetään etsiä ylitaulusta, mikäli sellaiseen on viittaus. Ylitaulu on tavallinen hajautustaulu ja jos siitäkään ei löydy ko. avaimella oliota, etsitään sitä taas sen ylitaulusta, jne. Jos ylitaulukysely ei tuota tulosta, etsitään arvoa prototyyppitaulusta. Prototyyppitaulu käyttäytyy kuin ylitaulu. Jos prototyyppitaulukin palautti kieltävän vastauksen, kutsutaan vielä prototyyppifunktiota avaimella. Prototyyppifunktion palauttama arvo palautetaan. Kysylyprosessi vielä pseudokoodina: 1
Funktio HaeArvo ( taulu, avain ) Jos avain Listassa taulu. l i s t a Palauta taulu. l i s t a [ avain ] Muulloin Jos taulu. y l i t a u l u On Olemassa tmp := HaeArvo ( taulu. y l i t a u l u ) Jos tmp On Olemassa Palauta tmp Muulloin Jos taulu. p r o t o t y y p p i t a u l u On Olemassa tmp := HaeArvo ( taulu. p r o t o t y y p p i t a u l u ) Jos tmp On Olemassa Palauta tmp Muulloin Jos taulu. p r o t o t y y p p i f u n k t i o On Olemassa Palauta taulu. p r o t o t y y p p i f u n k t i o ( avain ) Palauta Epä t o s i Lopeta Funktio Hajautustaulun arvojen asettaminen on verrattavissa edellä kuvattuun prosessiin. Ensiksi tutkitaan onko ylitaulussa tai sen missään ylitaulussa ko. avaimeen yhdistetty oliota. Jos on, kysely ohjataan ylitaululle. Jos ylitaulusta ei löytynyt avainta, lisätään avain ja olio uutena parina olion omaan listaan. Funktio Tarkista ( taulu, avain ) Jos avain Listassa taulu. l i s t a Palauta Tosi Muulloin Jos taulu. y l i t a u l u On Olemassa Palauta Tarkista ( taulu. y l i t a u l u, avain ) Palauta Epä t o s i Lopeta Funktio Funktio AsetaArvo ( taulu, avain, arvo ) Jos Tarkista ( taulu. y l i t a u l u, avain ) Palauta AsetaArvo ( taulu. y l i t a u l u, avain, arvo ) Muulloin Palauta taulu. l i s t a [ avain ] := arvo Lopeta Funktio Hajautustaululla ei ole pakko olla yli- tai prototyyppitauluja tai prototyyppifunktiota. 2
1.2 Muuttujat ja muuttujaympäristöt Svessä muuttujat säilötään muuttujaympäristöihin, jotka ovat tavallisia tauluolioita. Nykyinen muuttujaympäristö säilötään muuttujaan nimeltä $$ ja ylätason muuttujaympäristö, jonka aliympäristöjä kaikki muut ympäristöt ovat, muuttujaan $. Vain kaksi kieliopillista rakennetta voivat esitellä uuden muuttujaympäristön: lohko ja funktiokutsu (ks. Lohkolause ja Funktiokutsulauseke ). 2 Leksikaalinen rakenne Tokeneiksi lasketaan kaikki sellaiset osat lähdekooditiedostoa, jotka eivät sisällä merkkejä väli, sarkain, rivinvaihto, rivinpalautus, ;, <, >, (, ),,, :, +, -, *, /, %, =, &,, {, },.,!, [ ja ] ja edellä mainitut merkit. Merkkiyhdistelmät ->, =>, ==,!=, &&,, <=, >=, ++, -- ja :: lasketaan omiksi tokeneikseen. Merkkijonot alkavat " -merkistä ja päättyvät sellaiseen. Merkkijonot voivat sisältää mitä tahansa merkkejä mukaanlukien uudet rivit, merkki nro. 0 ja kaikki Unicode-merkit. Merkkijonot tukevat seuraavia ohituskoodeja: \" = ", \t = sarkain, \n = uusi rivi, \r = rivinpalautus, \\ = \. 3 Kielioppi 3.1 Lauseet Svetulkki suorittaa svelauseita yksitellen. Kaikki lauseet ja niiden merkityksen on lueteltu tässä luvussa. Ohjelma := { Lause } Lause := Lohkolause Ehtolause While silmukkalause Do silmukkalause For silmukkalause Hyppylause P a l a u t u s l a u s e Lausekelause Funktiolause NOP l a u s e NOP l a u s e := ; 3.1.1 Lohkolause Lohkolause := { { Lause } } Svetulkki suorittaa lohkolauseen suorittamalla kaikki sen sisällä olevat lauseet järjestyksessä uudessa muuttujaympäristössä. 3
mj := nykyisen muuttujaympä r i s t ön aliymp ä r i s t ö S u o r i t a ( k a i k k i l a u s e e t, mj ) 3.1.2 Ehtolause Ehtolause := i f : ehto=lauseke s i l l o i n=lause [ e l s e : muulloin=lause ] Ehtolauseen silloin-osa suoritetaan, jos ehto on tosi. Muulloin suoritetaan muulloin-osa, mikäli sellainen on. Jos S u o r i t a ( ehto, nykyinen ympä r i s t ö ) = Tosi S u o r i t a ( s i l l o i n, nykyinen ympä r i s t ö ) Muulloin S u o r i t a ( muulloin, nykyinen ympä r i s t ö ) 3.1.3 While-silmukkalause While silmukkalause := while : ehto=lauseke v a r t a l o=lause Silmukan sisällä olevaa lausetta suoritetaan uudestaan ja uudestaan niin kauan, kun ehto on tosi. Kun S u o r i t a ( ehto, nykyinen ympä r i s t ö ) = Tosi S u o r i t a ( vartalo, nykyinen ympä r i s t ö ) Lopeta Kun BREAK: 3.1.4 Do-silmukkalause Do silmukkalause := do : v a r t a l o=lause while : ehto=lauseke Do-silmukan sisällä oleva lause suoritetaan kerran, minkä jälkeen sitä suoritetaan uudestaan niin kauan, kun ehto on tosi. S u o r i t a ( vartalo, nykyinen ympä r i s t ö ) Kun S u o r i t a ( ehto, nykyinen ympä r i s t ö ) = Tosi S u o r i t a ( vartalo, nykyinen ympä r i s t ö ) Lopeta Kun BREAK: 3.1.5 For-silmukkalause For silmukkalause := f o r : a l u s t u s=lauseke, ehto=lauseke, kasvatus=lauseke v a r t a l o=lause For-silmukan alustusosa suoritetaan kerran, minkä jälkeen suoritetaan vartaloa ja kasvatus-lausetta vuorotellen niin kauan, kun ehto on tosi. 4
S u o r i t a ( a l u s t u s, nykyinen ympä r i s t ö ) Kun S u o r i t a ( ehto, nykyinen ympä r i s t ö ) = Tosi S u o r i t a ( vartalo, nykyinen ympä r i s t ö ) S u o r i t a ( kasvatus, nykyinen ympä r i s t ö ) Lopeta Kun BREAK: 3.1.6 Hyppylause Hyppylause hyppää ulos sisimmästä silmukasta. Pseudokoodeissa uloshyppykohtaa merkitään BREAK: -lauseella. Hyppylause := break 3.1.7 Palautuslause Palautuslause määrittää lopettaa funktion suorittamisen ja palauttaa sisällään olevan lausekkeen arvon. P a l a u t u s l a u s e := r eturn Lauseke 3.1.8 Lausekelause Lausekelauseen sisällä oleva lauseke suoritetaan. Lausekelause := Lauseke 3.1.9 Funktiolause Funktiolause := def : fnimi=nimi [ ( [ NIMI {, NIMI } ] ) ] v a r t a l o=lause Funktiolause määrittelee muuttujan fnimi arvoksi funktion annetuilla parametreilla ja vartalolla nykyiseen muuttujaympäristöön. nykyinen muuttujaympä r i s t ö. l i s t a [ fnimi ] = Funktioarvo ( fnimi, parametrit, v a r t a l o ) 3.2 Lausekkeet Kaikki unääri- ja binäärioperaattorit tauluoperaattoreita lukuunottamatta luovat uuden olion, eivät muunna annettua. Lauseke := T o t u u s o p eraatiolauseke 3.2.1 Binäärioperaattorilauske Sve tukee rajoitettua määrää binäärioperaatioita. && Boolen algebran JA-operaatio. Palauttaa toisen operandin, jos ensimmäinen on arvoltaan nil tai epätosi, muulloin ensimmäisen. Ei suorita toista lauseketta, jos sille ei ole tarvetta. 5
Boolen algebran TAI-operaatio. Palauttaa ensimmäisen operandin, jos se ei ole arvoltaan nil tai epätosi, muulloin toisen. Ei suorita toista lauseketta, jos sille ei ole tarvetta. == Yhtäsuuri kuin. Jos molemmat operandit ovat lukuja, vertailee niitä IEEE 754 -standardin mukaan. Muissa tapauksissa operandit muutetaan merkkijonoiksi, joita vertaillaan.!= Erisuuri kuin. Vertailee lukuja IEEE 754 -standardin mukaan ja muita tyyppejä merkkijonoina. Käänteinen ==-operaatio. < Pienempi kuin. Vertailee lukuja IEEE 754 -standardin mukaan. Hyväksyy vain luvut. > Suurempi kuin. Vertailee lukuja IEEE 754 -standardin mukaan. Hyväksyy vain luvut. <= Pienempi tai yhtäsuuri kuin. Vertailee lukuja IEEE 754 -standardin mukaan. Hyväksyy vain luvut. >= Suurempi tai yhtäsuuri kuin. Vertailee lukuja IEEE 754 -standardin mukaan. Hyväksyy vain luvut. + Jos molemmat operandit ovat lukuja, suorittaa IEEE 754 -standardin mukaisen yhteenlaskun, muissa tapauksissa muuntaa operandit merkkijonoiksi ja liittää ne yhteen. - IEEE 754 -standardin mukainen vähennyslasku. Hyväksyy vain luvut. * IEEE 754 -standardin mukainen kertolasku. Hyväksyy vain luvut. / IEEE 754 -standardin mukainen jakolasku. Hyväksyy vain luvut. % IEEE 754 -standardin mukainen jakojäännös. Hyväksyy vain luvut. T o t u u s o p e r a a t i o l a u s eke := Totuusoperaatiolauseke ( && ) V e r t a i l u l a u s e k e V e r t a i l u l a u s e k e V e r t a i l u l a u s e k e := V e r t a i l u l a u s e k e ( ==!= < > <= >= ) Summalauseke Summalauseke Summalauseke := Summalauseke ( + ) Tulolauseke Tulolauseke Tulolauseke := Tulolauseke 6
( / % ) Taulu t a i f u n k t i o l a u s e k e Taulu t a i f u n k t i o l a u s e k e Taulu t a i f u n k t i o l a u s e k e := Taulu t a i f u n k t i o l a u s e k e ( ( [ Lauseke {, Lauseke } ] ) : : Lauseke > Primää r i l a u s e k e [ ( [ Lauseke {, Lauseke } ] ) ] ) Primää r i l a u s e k e Primää r i l a u s e k e := Vastalukulauseke EI l a u s e k e Ehtolauseke Muuttujalauseke L i s t a l a u s e k e Taululauseke Funktiolauseke Sanalauseke Merkkijonolauseke Lukulauseke 3.2.2 Taululausekkeet Arvonhakulauseke Hakee arvon taulukosta (ks. luku Hajautustaulut ). Arvonsijoituslauseke Hajautustaulut ). Sijoittaa arvon tietyllä avaimella tauluun (ks. luku 3.2.3 Funktiokutsulauseke Luo uuden funktion määrittely-ympäristön aliympäristön ja suorittaa funktion vartalon siinä. Ympäristöön asetetaan ennen suoritusta parametreja vastaavien argumenttilausekkeiden arvot. Toimittamattomat argumentit korvataan nil-arvoilla. Ympäristöön asetetaan myös muuttujat $freturn = nil, $parent = ympäristö, josta funktiota kutsuttiin, $self = viittaus funktioon itseensä ja $args = lista argumenteista. Palauttaa funktion palautuslauseen arvon, tai, jos sellaista ei ole, $freturn -muuttujan arvon. 3.2.4 Vastalukulauseke Palauttaa olion, joka vastaa luvun vastalukua IEEE 754 -standardin mukaan. Vastalukulauseke := Taulu t a i f u n k t i o l a u s e k e 3.2.5 EI-lauseke Palauttaa totuusarvon EI-arvon Boolen algebrassa. EI l a u s e k e :=! Taulu t a i f u n k t i o l a u s e k e 7
3.2.6 Ehtolauseke Jos ehtolausekkeen arvo on tosi, palauttaa silloin-lausekkeen arvon, muulloin muulloin-lausekkeen arvon. Suorittaa vain palautettavan lausekkeen. Ehtolauseke := i f : ehto=lauseke s i l l o i n=lauseke e l s e : muulloin=lauseke 3.2.7 Muuttujalausekkeet Muuttujalausekkeet muistuttavat taululausekkeita, mutta koskevat paikallisen muuttujaympäristön taulua erikseen määritellyn sijaan. Muuttujalauseke := ++ NIMI NIMI NIMI ++ NIMI l o c a l NIMI = Lauseke NIMI = Lauseke NIMI ++NIMI Sama kuin (NIMI=NIMI+1), asettaa muuttujan arvoksi luvun seuraajan ja palauttaa sen. Hyväksyy vain luku-tyyppisiä muuttujia. Palauta AsetaArvo ( nykyinen muuttujaympä r i s t ö, NIMI, HaeArvo ( nykyinen muuttujaympä r i s t ö ). kangastus +1) --NIMI Sama kuin (NIMI=NIMI-1), asettaa muuttujan arvoksi luvun edeltäjän ja palauttaa sen. Hyväksyy vain luku-tyyppisiä muuttujia. Palauta AsetaArvo ( nykyinen muuttujaympä r i s t ö, NIMI, HaeArvo ( nykyinen muuttujaympä r i s t ö ). kangastus 1) NIMI++ Asettaa muuttujan arvoksi luvun seuraajan ja palauttaa alkuperäisen arvon. Hyväksyy vain luku-tyyppisiä muuttujia. arvo := HaeArvo ( nykyinen muuttujaympä r i s t ö ) AsetaArvo ( nykyinen muuttujaympä r i s t ö, NIMI, arvo. kangastus +1) Palauta arvo NIMI-- Asettaa muuttujan arvoksi luvun edeltäjän ja palauttaa alkuperäisen arvon. Hyväksyy vain luku-tyyppisiä muuttujia. arvo := HaeArvo ( nykyinen muuttujaympä r i s t ö ) AsetaArvo ( nykyinen muuttujaympä r i s t ö, NIMI, arvo. kangastus 1) Palauta arvo 8
Asettaa paikallisen muuttujaympäristön listaan muut- local NIMI = Lauseke tujalle NIMI arvon. Palauta nykyinen muuttujaympä r i s t ö. l i s t a [ NIMI ] = S u o r i t a ( Lauseke, nykyinen muuttujaympä r i s t ö ) NIMI = Lauseke Asettaa muuttujan arvon. Palauta AsetaArvo ( nykyinen muuttujaympä r i s t ö, NIMI, S u o r i t a ( Lauseke, nykyinen muuttujaympä r i s t ö ) ) NIMI Jos NIMI on luku tai merkkijono, palauttaa uuden luku- tai merkkijonoolion. Muulloin palauttaa muuttujan arvon. Luvuiksi tulkitaan kaikki numeroista koostuvat nimet ja vakiot Infinity ja NaN. Numeroista koostuvat luvut voivat sisältää yhden pisteen desimaalierottimena. Pisteen on oltava vähintään kahden numeron välissä. Jos Luku (NIMI) Palauta Lukuarvo ( NIMI) Muulloin Jos Merkkijono ( NIMI) Palauta Merkkijonoarvo (NIMI) Muulloin Palauta HaeArvo ( nykyinen muuttujaympä r i s t ö, NIMI) 3.2.8 Listalauseke Lista on taulu, jonka avaimet ovat numeerisia. Avaimet alkavat nollasta. L i s t a l a u s e k e := [ [ Lauseke {, Lauseke } ] ] 3.2.9 Taululauseke Taululauseke, kuten listalauseke, luo uuden hajautustaulun. Taululauseke := { [ NIMI = Lauseke {, NIMI = Lauseke } ] } 3.2.10 Funktiolauseke Luo uuden funktio-olion. Funktiolauseke := def [ ( [ NIMI {, NIMI } ] ) ] v a r t a l o=lause 3.2.11 Sanalauseke Yhden sanan pituinen merkkijonoliteraali. :NIMI == "NIMI". Sanalauseke := : NIMI 9