Beskrivelse av programmeringsspråket Simpila INF5110 - Kompilatorteknikk Våren 2012



Like dokumenter
Beskrivelse av programmeringsspråket Compila15 INF Kompilatorteknikk Våren 2015

Oversikt. INF5110 Obligatorisk Oppgave 1. Andreas Svendsen SINTEF

Oversikt. Praktisk. Litt om meg. Obligatorisk oppgave 1 - Kort om oppgaven og verktøyene. Fredrik Sørensen OMS-gruppen, IfI.

Obligatorisk oppgave 1 INF Kompilatorteknikk Våren 2012 Frist mandag 19. mars

Obligatorisk Oppgave 1

Obligatorisk Oppgave 1

INF Oblig 2 semantikksjekk og kodegenerering

INF5110. Oblig 2 presentasjon

Viktig. Rettet i koden. Oppgaven. Obligatorisk oppgave 2 - Kort om oppgaven og litt informasjon. Fredrik Sørensen OMS-gruppen, IfI

Obligatorisk Innlevering 2

Eivind Gard Lund. 24. Mars 2009 Foilene bygger på 2009 utgaven av Andreas Svendsen

Oblig 2 - Simpila. INF Kompilatorteknikk. Våren Typesjekking, sjekking av bruk av navn og blokkstrtuktur i språk.

Diverse eksamensgaver

Dagens tema: 12 gode råd for en kompilatorskriver. Sjekking av navn. Lagring av navn. Hvordan finne et navn?

UNIVERSITETET I OSLO

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

INF1000 Metoder. Marit Nybakken 16. februar 2004

UNIVERSITETET I OSLO

Kapittel 1 En oversikt over C-språket

UNIVERSITETET I OSLO

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

Dagens tema Syntaks (kapittel Komp. 47, kap. 1 og 2)

Litt om kompilering og interpretering. Dagens tema Syntaks (kapittel Komp. 47, kap. 1 og 2) Syntaks og semantikk

Dagens tema: Sjekking

2012 2a. C rc; void main() { rc = new C (); rc.m2(); } } INF 3110/ INF /28/13 1

Anatomien til en kompilator - I

2 Om statiske variable/konstanter og statiske metoder.

Anatomien til en kompilator - I

UNIVERSITETET I OSLO

INF Repetisjon: Hvordan bygge treet og analysere? 8. september Typisk situasjon. De problematiske syntaks-diagrammene

INF 1000 høsten 2011 Uke september

Dagens tema: Mer av det dere trenger til del 1

INF1000 undervisningen INF 1000 høsten 2011 Uke september

Repetisjon: Statiske språk uten rekursive metoder (C1 og C2) Dagens tema Kjøresystemer (Ghezzi&Jazayeri 2.6, 2.7)

Dagens tema Kjøresystemer (Ghezzi&Jazayeri 2.6, 2.7)

INF109 - Uke 1b

MED SVARFORSLAG UNIVERSITETET I OSLO. Det matematisk-naturvitenskapelige fakultet

Semantisk Analyse del I

Del 1 En oversikt over C-programmering

Kort om meg. INF1000 Uke 2. Oversikt. Repetisjon - Introduksjon

INF5110 Obligatorisk Oppgave 2 del 2. Andreas Svendsen SINTEF. 23. April Oversikt

3 emner i dag! INF1000 Uke 5. Objekter og pekere. null. Litt om objekter, pekere og null Filer og easyio Litt mer om tekster

INF1000 (Uke 5) Mer om løkker, arrayer og metoder

Blokker og metoder INF1000 (Uke 6) Metoder

Løse reelle problemer

Dagens tema: INF2100. Syntaksanalyse. Hva annet gjør en kompilator? Sjekking av navnebruk. Testutskrifter

Skal bindes opp til en deklarasjon av samme navn

<?php. count tar en array som argument, og returnerer et tall som uttrykker antallet innførsler i arrayen.

Kap 6.3: Symboltabellen Foiler ved Birger Møller-Pedersen Forelest av Stein Krogdahl 17. mars Dagens tema:

Hjemmeeksamen 2 i INF3110/4110

Syntaksanalyse. Dagens tema: Språkdiagrammene Jernbanediagrammene er et ypperlig utgangspunkt for å analysere et program: INF2100 INF2100 INF2100

Leksjon 3. Kontrollstrukturer

Skal bindes opp til en deklarasjon av samme navn

2 Om statiske variable/konstanter og statiske metoder.

Dagens tema: 12 gode råd for en kompilatorskriver

INF1000 : Forelesning 4

Shellscripting I. Innhold

i=0 i=1 Repetisjon: nesting av løkker INF1000 : Forelesning 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker j=0 j=1 j=2 j=3 j=4

MAT1030 Diskret matematikk

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

Spørsmål fra forrige forelesning. INF1000 Forelesning 7. Oppførselen til inword()/inint()/etc. Operator-presedens i Java

MED SVARFORSLAG UNIVERSITETET I OSLO

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

Forelesning inf Java 4

Oversikt. INF1000 Uke 6. Objekter, pekere og null. Lese og skrive fra/til fil. Litt om objekter, pekere og null Filer og easyio. Litt mer om tekster

Lese fra fil. INF1000 : Forelesning 5. Eksempel. De vanligste lesemetodene. Metoder:

INF1000 (Uke 6) Mer om metoder, tekster

Rep: Metoder. INF1000 (Uke 6) Mer om metoder, tekster. Rep: Metoder. 3 typer variable: Klassevariable. Java-programmene så langt i kurset:

Dagens Tema: Grammatikker Kap. 3 i K. C. Louden

Hvor er vi nå - kap. 3 (+4,5)? Forenklet skisse av hva en parser gjør PARSER. Kontekstfrie grammatikker og syntaksanalyse (parsering)

Dagens Tema: Grammatikker

Tre måter å lese fra terminal. Java 4. Eksempel. Formatert utskrift til skjerm

Oversikt. INF1000 Uke 3. Repetisjon Program. Repetisjon Program. Litt repetisjon Program Variabler og Uttrykk Presedens Matematiske funksjoner

TOD063 Datastrukturer og algoritmer

Oversikt. INF1000 Uke 2. Repetisjon - Program. Repetisjon - Introduksjon

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Forelesning inf Java 5

Forelesning inf Java 5

Inf1000 uke 5 18.sept. 2007

INF 5110, 3. februar Dette foilheftet: Kapittel 3

Dagens Tema: Grammatikker Kap. 3 i K. C. Louden

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

INF1000 Behandling av tekster

Enkle generiske klasser i Java

Oversikt. Introduksjon Kildekode Kompilering Hello world Hello world med argumenter. 1 C programmering. 2 Funksjoner. 3 Datatyper. 4 Pekere og arrays

Forelesningsquiz. Forelesning inf Java 5. Sett dere to (eller tre) sammen og besvar de fire spørsmålene på utdelt ark. Tid: 15 min.

Kapittel 1. Datamaskiner og programmeringsspråk. 1.1 Programmering

INF1000: Forelesning 7

INF1000 (Uke 6) Mer om metoder, tekster

Orakeltjeneste på Abel Hjelp til Obligatorisk oppgave 2. INF1000 (Uke 6) Mer om metoder, tekster. Rep: Metoder. Rep: Metoder

Gjennomgang prøveeksamen oppgave 1, 2, 4, 5, 7

Dagens Tema: Grammatikker

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

Oppgaver til INF 5110, kapittel 4, med svarforslag Gjennomgått torsdag 14. febr Disse foilene er justert 15/2, kl. 11

Verdier, variabler og forms

Java. INF1000 : Forelesning 2. Ulike varianter for ulike behov. Java Standard Edition (Java SE) Java:

Oversikt. INF1000 Forelesning 6. Variable Deklarasjon. Variabel en plass i lageret int radius;

Transkript:

Beskrivelse av programmeringsspråket Simpila INF5110 - Kompilatorteknikk Våren 2012 Her beskrives syntaksen og den statiske semantikken (hva som skal sjekkes av kompilatoren) til språket Simpila. Den dynamiske semantikken (altså hva som skal gjøres under utførelsen) skulle være rimelig opplagt, men eventuelle detaljer som er nødvendige vil vi komme tilbake til i forbindelse med Oblig 2. 1. Syntaks I beskrivelsen av grammatikken under er ikke-terminaler skrevet med store bokstaver, og metasymbolene (i bokas betydning, altså de som brukes til å beskrive grammatikken) er : ->,, (, ), {, }, [, ], Her betyr {...} gjentakelse null eller flere ganger, og [...] betyr at det kan være med eller ikke. Alt annet, som er skrevet som tette sekvenser, er terminalsymboler, og de med små bokstaver er reserverte (!) nøkkelord. Merk at alle terminalsymbolene er skrevet i anførselstegn for å skille dem fra de tilsvarende metasymbolene. Det er noen spesielle terminaler som er skrevet med store bokstaver, og uten anførselstegn. Disse er betegnet NAME, INT LITERAL, FLOAT LITERAL og STRING LITERAL. NAME skal starte med bokstav, og deretter være en sekvens av siffer, bokstaver og underscore. Store og små bokstaver regnes som forskjellige tegn. Alle nøkkelord skrives med små bokstaver, og de kan ikke brukes som vanlige navn. INT LITERAL skal inneholde ett eller flere siffer. FLOAT LITERAL skal inneholde ett eller flere siffer, fulgt av et punktum, fulgt av ett eller flere siffer. STRING LITERAL skal beståav en tekststreng innesluttet i anførselstegn ( ). Strengen kan ikke inneholde linjeskift. Den semantiske verdien av en er kun det som er inni anførselstegn; selve anførselstegnene skal ikke inkluderes. 2. Datatyper Språket har fire innebygde typer: float, int, string og bool. I tillegg utgjør hver klasse en type.

3. Klasser Simpila har en enkel form for klasser. Klasser kan kun inneholde variable og har ingen arv. Altså, ingen metoder, konstruktører eller subklasser. Klasser i Simpila slekter ellers veldig på klasser i Java. Dermed kan variabler av en klassetype enten peke på et objekt av klassen eller den spesielle verdien NULL. 4. Parametere For å presist kunne snakke om parametere brukes følgende spesifiseringer i denne teksten: Aktuell parameter - Uttrykket gitt ved prosedyrekall. Formell parameter - En del av prosedyredefinisjonen. Parametere i Simpila kan enten overføres ved pass-by-value eller pass-by-reference. Pass-by-value vil kopiere verdien av den aktuelle parameteren til den formelle parameteren. Pass-by-reference vil gi den formelle parameter en implisitt referanse til den aktuelle parameter, som må være en variabel av riktig type. Derfor vil en tilordning til den formelle parameteren forandre verdien til den aktuelle parameter. Pass-by-reference markeres i Simpila med nøkkelordet ref, som må brukes både i prosedyredefinisjonen og i prosedyrekallet. Et eksempel: proc swap(ref int a, ref int b){ var int tmp ; tmp := a ; a := b ; b := tmp ; } proc Main( ){ var int x; var int y; x := 42; y := 84; swap(ref x, ref y); // nå er x = 84, y = 42. } 5. Standardbibliotek Programmet har et standardbibliotek med et sett av IO-prosedyrer. proc int readint() Leser en int fra standard inn. proc float readfloat() Leser en float fra standard inn. proc int readchar() Leser ett tegn fra standard inn og returnerer ASCIIverdien som en int. Returnerer -1 ved EOF. proc string readstring() Leser en string fra standard inn opp til første whitespace. 2

proc string readline() Leser en tekstlinje fra standard inn. proc printint( int i ) Skriver en int til standard ut. proc printfloat( float f ) Skriver en float til standard ut. proc printstr( string s ) Skriver en string til standard ut. proc printline( string s ) Skriver en string til standard ut fulgt av et linjeskift. 6. Kommentarer Kommentarer i Simpila starter med // og fortsetter linjen ut (som i C++/Java). 7. Grammatikk PROGRAM -> DECL { DECL } DECL -> VAR_DECL PROC_DECL CLASS_DECL VAR_DECL -> "var" TYPE NAME ";" PROC_DECL -> "proc" [ "ret" TYPE ] NAME "(" [ PARAM_DECL { "," PARAM_DECL } ] ")" "{" { DECL } { STMT } "}" CLASS_DECL -> "class" NAME "{" { VAR_DECL } "}" PARAM_DECL EXP VAR -> [ "ref" ] TYPE NAME -> EXP LOG_OP EXP "not" EXP EXP REL_OP EXP EXP ARIT_OP EXP "(" EXP ")" LITERAL CALL_STMT "new" NAME VAR -> NAME EXP "." NAME LOG_OP -> "&&" " " REL_OP -> "<" "<=" ">" ">=" "=" "<>" ARIT_OP -> "+" "-" "*" "/" "**" LITERAL -> FLOAT_LITERAL INT_LITERAL STRING_LITERAL "true" "false" "null" STMT -> ASSIGN_STMT ";" IF_STMT WHILE_STMT RETURN_STMT ";" 3

CALL_STMT ";" ASSIGN_STMT -> VAR ":=" EXP IF_STMT -> "if" EXP "then" "{" { STMT } "}" [ "else" "{" { STMT } "}" ] WHILE_STMT -> "while" EXP "do" "{" { STMT } "}" RETURN_STMT -> "return" [ EXP ] CALL_STMT -> NAME "(" [ ACTUAL_PARAM { "," ACTUAL_PARAM } ] ")" ACTUAL_PARAM TYPE -> "ref" VAR EXP -> "float" "int" "string" "bool" NAME 8. Presedens Presedens-rekkefølge (fra lavest til høyest): 1. 2. && 3. not 4. Alle relasjonsoperatorene 5. + og - 6. * og / 7. ** (eksponensiering) 8.. (punktum, for tilgang til objektvariabler) 9. Assosiativitet, &&, +, -, *, / og. er venstre-assosiative ** er høyre-assosiativ Relasjonoperatorene er ikke-assosiative (altså er f.eks. a<b+c<d ulovlig). Det er lov å skrive not not not b, og det betyr: not( not( not b))). 10. Semantikk (ikke viktig i oblig 1) Bruksforskomster av navn uten punktum foran bindes på vanlig måte til en deklarasjon: Let ut gjennom blokkene (altså prosedyrer eller program) som omslutter bruksstedet. Se på deklarasjonene i hver blokk, og velg den deklarasjonen der du først får treff. Om man ikke får treff er det en feil i programmet. Her regnes en parameter med til de lokale deklarasjonene i prosedyren. Alle navn må være deklarert tekstlig før de brukes. 10.1 Uttrykk Det må sjekkes at uttrykk er typeriktig formet, på den opplagte måten. Hele uttrykket blir derved også tilordnet en type. 4

Det må sjekkes at typen på begge sider av en tilordning er den samme. MERK: Det er lov både å lese og tilordne verdi til en formell parameter inne i prosedyren. Det må sjekkes at typen av uttrykket etter if og etter while er bool. Det må sjekkes at det uttrykket som kommer foran et punktum evaluerer til et objekt. Likeledes må det sjekkes at navnet som kommer etter et punktum er navnet på et attributt av klassetypen til det foran punktumet. 10.2 Short-circuit evaluation De logiske operatorene && og benytter såkalt short-circuit evaluation. Det betyr at om verdien til det logiske uttrykket kan bestemmes etter å ha eksekvert den første delen, blir ikke den resterende delen eksekvert. 11. Typer og implisitt typekonvertering Det er tillatt å tilordne uttrykk av typen int til variable av typen float. Det motsatte er ikke lov. Det finnes ingen cast-operator. Dersom en aritmetisk operasjon har minst en operand av typen float skal operasjonen evalueres med flyttallsaritmetikk. Svaret vil da ha typen float. Eksponensiering gjøres alltid med flyttallsaritmetikk, og svaret har typen float. 12. Prosedyrer I en prosedyre skal alle deklarasjonene komme før eksekverbare setninger (statements). Disse deklarasjonene kan inkludere alt som kan deklareres på ytterste nivå, altså variable, prosedyrer og klasser. Returverdien til en prosedyre kan kun være typer som er synlige i det skopet som prosedyre selv er definert i. Prosedyrer brukt i uttrykk må ha en definert returtype. Det må sjekkes at antall og typer på parametere stemmer overens mellom kallsted og deklarasjon. Return-setninger kan bare forekomme inne i prosedyre-deklarasjoner, og de angir at prosedyren skal terminere. Dersom prosedyren er deklarert uten returtype skal return-setningen ikke ha noe uttrykk, ellers skal den ha et uttrykk av prosedyrens type, og det skal enten være ref på begge eller ingen. Dersom prosedyren er deklarert med en retur-type må det sjekkes at prosedyren inneholder minst ett return-statement som vil nås uansett. 5

13. Generelt Det må ikke være dobbeltdeklarasjoner innen en blokk (og her regnes samme navn på prosedyre, klasse eller variabel som en dobbeltdeklarasjon). Navnet på en formell parameter må ikke kollidere med prosedyrens lokale deklarasjonsnavn. Det må sjekkes at alle navn som brukes er deklarerte. Ethvert program må ha en prosedyre som heter Main, og det er denne som kalles når programmet starter. Det må sjekkes at nøkkelordet ref på en parameter brukes både ved kall og i prosedyresignaturen, eller ingen av stedene. 6