TIE448 Kääntäjätekniikka, syksy 2009 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 9. marraskuuta 2009
Sisällys
Sisällys
Seuraava deadline Vaihe D tiistai 10.11. klo 10 välikielen generointi Vaihe E tiistai 24.11. klo 10 koodigenerointi (ilman rekisteriallokaatiota)
Kääntäjän rakenne lähdeohjelma SELAAJA sanasjono JÄSENTÄJÄ rakennepuu VÄLIKOODIN GENEROIJA välikoodi KOHDEKOODIN GENEROIJA kohdeohjelma TARKASTAJA SOKERINPILKKOJA OPTIMOIJA OPTIMOIJA
Sisällys
perusidea sama kuin maximal munch -algoritmissa (parilla erolla): Kohdekieli kuvataan joukkona tiilisääntöjä. Kullakin tiilisäännöllä on positiivinen kustannus. Syötteenä on lausekkeen rakennepuu (tai vastaava välikoodi). Tuloksena on puun optimaalinen tiilipeitto (ja sitä vastaava kohdekielen käskyjono). optimaalinen? siinä mielessä, että valittujen tiilien yhteiskustannus on minimaalinen käsitellään syötepuu kahdessa vaiheessa 1. kustannusten laskenta 2. käskyjonon generointi
Määritelmä: Puut ja puuhahmot Olkoon annettuna epätyhjä joukko solmulappuja 1. Puu on joko lehtisolmu, joka sisältää yhden solmulapun, taikka sisäsolmu, joka sisältää yhden solmulapun ja jolla on yksi tai useampi alipuu. Puuhahmo on joko jokerisolmu, lehtisolmu, joka sisältää yhden solmulapun, taikka sisäsolmu, joka sisältää yhden solmulapun ja jolla on yksi tai useampi alipuuhahmo. Puun ja puuhahmon juurella tarkoitetaan sen solmua ilman sen mahdollisia alipuita tai alipuuhahmoja. 1 Käskyjen valinnan tapauksessa nämä ovat välikielen käskyjä.
Algoritmi: Puuhahmon sovitus Syöte on puuhahmo ja puu. Tulos on joko tieto epäonnistumisesta taikka tiili ja joukko tiilin alipuita. Algoritmi on seuraavasti rekursiivinen: Jos puuhahmo ja puu ovat molemmat lehtisolmuja, tiili on puu itse ja tiilin alipuita ei ole. Jos puuhahmo ja puu ovat molemmat sisäsolmuja, joilla on sama määrä alipuita ja alipuuhahmoja: Sovelletaan algoritmia rekursiivisesti kuhunkin alipuuhahmo alipuu-pariin. Tiili on puun juuri, jolle annetaan lapsiksi kunkin rekursiivisen soveltamisen tuottama tiili. Tiilen alipuita ovat kaikki rekursiivisen soveltamisen tuottamat tiilin alipuut. Jos puuhahmo on jokerisolmu, ei tiiltä ole, ja puu on ainoa tiilen alipuu. Muutoin sovitus epäonnistuu.
Kustannusten laskenta Syöte joukko tiilisääntöjä kustannuksineen sekä välikielen käskyistä muodostettu puu Tulos kuhunkin syötepuun solmuun liitetty kohdekielinen käskyjono, kustannus ja tieto sen tiileen kuuluvista solmuista Algoritmi Tehdään kullekin solmulle jälkijärjestyksessä seuraavaa: Tehdään kullekin tiilisäännölle seuraavaa: Koetetaan sovittaa tiilisäännön puuhahmoa siihen alipuuhun, jonka juuri solmu on. Lasketaan yhteen tiilisäännön kustannus sekä tiilen alipuiden juurien kustannukset; olkoon tämä tiilisäännön kokonaiskustannus. Tehdään pienimmän kokonaiskustannuksen tiilisäännölle seuraavaa: Tallennetaan sen käskyjono solmun käskyjonoksi. Tallennetaan sen kokonaiskustannus solmun kustannukseksi. Merkitään solmuun tieto tiilestä.
Käskyjonon generointi Syöte kustannuksen laskennalle annettu puu ja kustannuksen laskennan antama tulos. Tulos kohdekielinen käskyjono Apuna joukko solmuja, joka alustetaan tyhjäksi Algoritmi Käydään puun solmut läpi etujärjestyksessä: Jos solmu löytyy solmujoukosta, ei tehdä mitään. Muutoin: 1. Lisätään tulokseen solmuun liitetty käskyjono. 2. Lisätään solmun tiileen kuuluvat solmut solmujoukkoon.
Huomioita Joihinkin solmuihin liitettyjä käskyjonoja ei koskaan liitetä tuloskäskyjonoon! Käsin koodaaminen täysin mahdollista, mutta on aika helppoa saattaa kaksi vaihetta epäsynkkaan. Merkittävä osa algoritmin työstä voidaan (hankalasti) tehdä etukäteen ja säästää näin kääntäjän ajoaikaa. Työkaluja: twig, burg, iburg...
Puukielioppi Edellä esitetty algoritmi on yksinkertainen puujäsentäjä, jossa konfliktit ratkaistaan kustannusten avulla! Tiilisäännöstö voidaan yleistää (painotetuksi) puukieliopiksi. Voidaan esim. tehdä omat välikesymbolit osoitteiden (lvalue) ja arvojen (rvalue) laskemiselle. Algoritmissa kustannukset, käskyjonot ja tiilet liitetään nyt solmu välikesymboli-pareihin. Mahdollista on myös esittää puu jonona ja käyttää normaaleja jonojäsennystekniikoita. LALR-jäsentäjiä on käytetty tähän tarkoitukseen. Ongelmana tarvittavien jonokielioppien koko ja moniselitteisyys. Jonojäsentäjien suuntabias (left-to-right yleensä) on merkittävä rajoite.
Tähdättävät kääntäjät Fiksu tapa tehdä tähdättävä kääntäjä on kuvata kukin kohdekieli suhteellisen kompaktisti (painotettuna) puukielioppina ja käyttää apuohjelmaa (kuten iburg) varsinaisen käskynvalitsijan generointiin puukieliopista.
Sisällys
Seuraava deadline Vaihe D tiistai 10.11. klo 10 välikielen generointi Vaihe E tiistai 24.11. klo 10 koodigenerointi (ilman rekisteriallokaatiota)