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ä
  • 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 mutta x + y ei (yleensä) ole.
  • 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 on n-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 kelpaa f:n tyypin i: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 ja
    • l on e:n tyypissä määritelty kenttä.
    • Tällaisen lausekkeen tyyppi on l:lle e: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.