Kääntäjätekniikka
Luento 8 (6.4.2017)
Vaihepalautus
Tarkista ensin, että kaikki tarpeellinen on commitattu:
git status
Tee sitten git-tagi:
git tag TAGIN-NIMI
Puske tagi:
git push origin TAGIN-NIMI
Virheilmoituksien laatimisesta
- Ohjelmoijat odottavat saavansa kaikki relevantit virheilmoitukset kerralla
- Virheilmoitustilanteessa ei siten ole aina järkevää heittää poikkeusta
- Testauksessa on järkevää, että virheilmoitukset eivät tulostu vaan annetaan testiajurille testivasteen osana.
- Tee siis virheenhallintamoduli:
- tallettaa virheilmoitukset jonnekin
- rakenteisena datana, ei merkkijonoina!
- tarjoaa proseduurin/metodin virheilmoituksen lisäämiseen
- parametrina tms tieto siitä, oliko tämä virhe vai varoitus
- modulilta pitää voida kysyä, tuliko virheitä
- tallettaa virheilmoitukset jonnekin
- Virhetilanteessa kerro virheenhallintamodulille mutta jatka kääntämistä, jos mahdollista
- Ennen välikoodin generointia tarkista, oliko virheitä
Jatketaan tyyppitarkastuksesta
Sijoituslauseen tarkastus
- Usein sijoituslause on muotoa \(E = E\), missä \(E\) on lauseke.
- Vasen lauseke kertoo muistipaikan, johon oikean arvo tallennetaan.
- Left value eli lvalue tarkoittaa lausekkeen tulkintaa sijoituslauseen vasemmalla puolella, ja
- Right value eli rvalue tarkoittaa lausekkeen tulkintaa sijoituslauseen oikealla puolella.
- Vain osa lausekkeista kelpaa vasemmalle puolelle (eli vain osalla lausekkeista on lvalue).
- Esimerkiksi
a[i]
on lvalue muttax + y
ei (yleensä) ole.
- Esimerkiksi
- Sijoituslauseen tarkastus:
- Tee tyyppitarkastus molemmille lausekkeille.
- Tarkista, että molemmilla on sama tyyppi.
- Tarkista vielä, että vasemmalla lausekkeella on lvalue.
Aliohjelman määrittely
- Aliohjelman määrittelystä on tarkastettava että
- sen nimeä ei ole jo määritelty samassa sisimmässä lohkossa,
- sen parametrien nimissä ei esiinny toistoa,
- sen parametreille on annettu hyväksyttävät tyypit,
- että sen runko on hyvin tyypitetty silloin kun parametrinimeillä on ne tyypit, jotka niille on määrittelyssä annettu, ja
- sen rungossa palautetaan määrittelyn vaatimaa tyyppiä oleva arvo (mikäli määritelmä sen vaatii) silloin kun parametrinimillä on ne tyypit, jotka niille on määrittelyssä annettu.
Aliohjelmakutsu
- Aliohjelmatyypin arvoa voi käyttää aliohjelmakutsun vasemmalla puolella.
- Aliohjelmakutsusta
f(a1, ... , an)
on tarkastettava, ettäf
:n tyyppi onn
-parametrisen aliohjelman tyyppi,f
:n tyypissä on paluutyyppi, jos kutsu esiintyy lausekkeessa, tai ettäf
:n tyypissä ei ole paluutyyppiä, jos kutsu esiintyy lauseena, ja- kunkin
ai
:n tyyppi kelpaaf
:n tyypini
:nnen parametrin tyypiksi.
- Kutsun tyyppi on
f
:n paluutyyppi (jos sellainen on). - Onko aliohjelmakutsulla lvalue?
Tietueet
- Tietuemääritelmä määrittelee uuden tyyppinimen ja koostuu tietueen sisällä näkyvistä muuttujamäärittelyistä (ilman alustusta) eli kentistä.
- Tietuemäärittelystä on tarkastettava, että
- samaa kenttää ei määritellä useasti,
- kenttien tyypit ovat sellaiset, että ne kelpaavat tähän käyttöön.
- Tietuetta käytetään projektio-operaattorilla
e.l
; siitä on tarkastettava, ettäe
:llä on tietuetyyppi jal
one
:n tyypissä määritelty kenttä.- Tällaisen lausekkeen tyyppi on
l
:llee
:n tyypissä määritelty tyyppi. - Tällaisella lausekkeella on lvalue, jos
e
:llä on lvalue.
Varianttityyppi
- Varianttityyppi on kuin tietue, mutta sen kentät ovat muistissa päällekkäin, ei peräkkäin.
- Vain yksi variantin kentistä on aktiivinen kulloinkin. Varianttiin sisältyy lisäksi tieto siitä, mikä kentistä on aktiivinen.
- ns. tagged union (toisin kuin C:n union)
- Tyyppitarkastus kuten tietueelle.
- Lisäksi variantti tarjoaa
- jonkin tavan selvittää, mikä kenttä on kulloinkin aktiivinen, esim. sopivasti muokattu switch–case-lause
- jonkin tavan asettaa variantin arvo aktiivinen kenttä valiten
These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.