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

Like dokumenter
Beskrivelse av programmeringsspråket Simpila INF Kompilatorteknikk Våren 2012

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

Oversikt. INF5110 Obligatorisk Oppgave 1. Andreas Svendsen SINTEF

Obligatorisk Oppgave 1

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

Obligatorisk Oppgave 1

INF5110. Oblig 2 presentasjon

INF Oblig 2 semantikksjekk og kodegenerering

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.

UNIVERSITETET I OSLO

Anatomien til en kompilator - I

UNIVERSITETET I OSLO

Anatomien til en kompilator - I

Kapittel 1 En oversikt over C-språket

Del 1 En oversikt over C-programmering

UNIVERSITETET I OSLO

Dagens tema: Sjekking

UNIVERSITETET I OSLO

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

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

2 Om statiske variable/konstanter og statiske metoder.

Semantisk Analyse del I

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

Diverse eksamensgaver

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

INF 1000 høsten 2011 Uke september

INF1000 undervisningen INF 1000 høsten 2011 Uke september

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

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

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

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

MED SVARFORSLAG UNIVERSITETET I OSLO. Det matematisk-naturvitenskapelige fakultet

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)

Dagens tema: 12 gode råd for en kompilatorskriver

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

Oppgaver til INF 5110, kapittel 4, med svarforslag Gjennomgås tirsdag 21. febr. 2012

2 Om statiske variable/konstanter og statiske metoder.

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

Blokker og metoder INF1000 (Uke 6) Metoder

Med Svarforslag UNIVERSITETET I OSLO. Det matematisk-naturvitenskapelige fakultet. 3 sider (side 6, 7 og 8, rives ut, fylles ut og leveres)

UNIVERSITETET I OSLO

INF1000 : Forelesning 4

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

Plan: Parameter-overføring Alias Typer (Ghezzi&Jazayeri kap.3 frem til 3.3.1) IN 211 Programmeringsspråk

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

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

MED SVARFORSLAG UNIVERSITETET I OSLO

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

Hjemmeeksamen 2 i INF3110/4110

Del 3: Evaluere uttrykk

Forelesning inf Java 5

Forelesning inf Java 5

class Book { String title; } class Dictionary extends Book { int wordcount; } class CartoonAlbum extends Book { int stripcount; }

MAT1030 Plenumsregning 1

Plenumsregning 1. Kapittel 1. Roger Antonsen januar Velkommen til plenumsregning for MAT1030. Repetisjon: Algoritmer og pseudokode

Skal bindes opp til en deklarasjon av samme navn

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:

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

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

Arv. Book book1 = new Book(); book1. title = "Sofies verden" class Book { String title; } class Dictiona ry extends Book {

MAT1030 Diskret Matematikk

Skal bindes opp til en deklarasjon av samme navn

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

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

Programmeringsspråket C

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

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

Skanning del I INF /01/15 1

Forklaring til programmet AbstraktKontoTest.java med tilhørende filer Konto.java, KredittKonto.java, SpareKonto.java

Velkommen til plenumsregning for MAT1030. MAT1030 Diskret matematikk. Repetisjon: Algoritmer og pseudokode. Eksempel fra boka. Eksempel

INF1000: Forelesning 7

Scanning - I Kap. 2. Hva scanneren gjør

Plenumsregning 1. MAT1030 Diskret Matematikk. Repetisjon: Algoritmer og pseudokode. Velkommen til plenumsregning for MAT1030

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

Dagens Tema: Grammatikker

OPPGAVE 1 OBLIGATORISKE OPPGAVER (OBLIG 1) (1) Uten å selv implementere og kjøre koden under, hva skriver koden ut til konsollen?

Runtime-omgivelser Kap 7 - I

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Runtimesystemer Kap 7 - I

Dagens tema: Mer av det dere trenger til del 1

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

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

Typisk: Kan det være både nøkkelord og navn, så skal det ansees som nøkkelord

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

INF april, 2013 Kap. 8 Noen oppgaver som er meget relevante for Oblig 2

Typisk: Kan det være både nøkkelord og navn, så skal det ansees som nøkkelord

Transkript:

Beskrivelse av programmeringsspråket Compila15 INF5110 - Kompilatorteknikk Våren 2015 Her beskrives syntaksen og den statiske semantikken (hva som skal sjekkes av kompilatoren) til språket Compila15. 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 inni kan være med eller ikke. Alt annet, som er skrevet som tette sekvenser, er terminalsymboler, og de med bare 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 STRING_LITERAL 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 Compila15 har en enkel form for klasser. Klasser kan kun inneholde variable og har ingen arv. Altså, ingen metoder, konstruktører eller subklasser. Klasser i Compila15 slekter ellers veldig på klasser i Java. Dermed kan variable av en klassetype enten peke på et objekt av klassen eller ha den spesielle verdien NULL. 4. Parametere For presist å kunne snakke om parametere brukes følgende spesifiseringer i denne teksten: Aktuell parameter - Uttrykket eller variabelen gitt ved prosedyrekall. Formell parameter - En del av prosedyredefinisjonen. Parametere i Compila15 kan overføres på to forskjellige måter: Pass-by-value: Den formelle parameteren er en lokal variabel i prosedyren og verdien av den aktuelle parameteren vil bli kopiert til den formelle parameteren. For denne typen parameteroverføring angis ingen «modifikator» (i motsetning til for «pass-by-reference», se under). Pass-by-reference: Den formelle parameteren vil her motta adressen til den aktuelle parameteren, som må være en variabel av riktig type. En tilordning til den formelle parameteren vil dermed forandre verdien til den aktuelle variabelen. Pass-by-reference markeres i Compila15 med nøkkelordet ref, og dette må også brukes foran den tilsvarende aktuelle parameteren i et kall på prosedyren. Et eksempel: program { proc swap(ref a : int, ref b : int){ var tmp : int ; tmp := a ; a := b ; b := tmp ; } } proc Main( ){ var x : int; var y : int ; 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. 2

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. proc string readline() Leser en tekstlinje fra standard inn. proc printint( i:int ) Skriver en int til standard ut. proc printfloat( f:float) Skriver en float til standard ut. proc printstr( s:string ) Skriver en string til standard ut. proc printline( s:string ) Skriver en string til standard ut fulgt av et linjeskift. 6. Kommentarer Kommentarer i Compila15 starter med // og fortsetter linjen ut (som i C++/Java). 7. Grammatikk PROGRAM -> "program" "{" { DECL } "}" DECL -> VAR_DECL PROC_DECL CLASS_DECL VAR_DECL -> "var" NAME ":" TYPE ";" PROC_DECL -> "proc" NAME [ ":" TYPE ] "(" [ PARAM_DECL { "," PARAM_DECL } ] ")" "{" { DECL } { STMT } "}" CLASS_DECL -> "class" NAME "{" { VAR_DECL } "}" PARAM_DECL EXP VAR -> [ "ref" ] NAME ":" TYPE -> 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 -> "<" "<=" ">" ">=" "=" "<>" 3

ARIT_OP -> "+" "-" "*" "/" "#" LITERAL -> FLOAT_LITERAL INT_LITERAL STRING_LITERAL "true" "false" "null" STMT -> ASSIGN_STMT ";" IF_STMT WHILE_STMT RETURN_STMT ";" 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 objektvariable) 9. Assosiativitet De binære operasjonene, &&, +, -, *, / og. er venstre-assosiative, mens # er høyre-assosiativ Relasjonoperatorene er ikke-assosiative (altså er f.eks. a<b+c<d ulovlig). Det er altså lov å skrive not not not b, og det betyr: not( not( not b))). 10. Semantikk (ikke viktig i Oblig 1) Bruksforekomster 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. 4

Bruksforekomster av navn med punktum foran (altså: EXP. NAME) bindes ved å se på typen til EXP (som må være av en klasse-type) og lete opp variabelen med navnet NAME i denne klassen. Om EXP ikke er av en klasse-type eller det ikke finnes noen variabel med navn NAME i klassen er programmet galt. 10.1 Uttrykk Det må sjekkes at uttrykk er typeriktig formet, på den opplagte måten. Hele uttrykket blir derved også tilordnet en type. 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, og dette gjelder for både de som er overført "by ref" og andre (men tilordning vil ha svært forskjellig virkning i de to tilfellene) 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 er av en klassetype. Likeledes må det sjekkes at navnet som kommer etter et punktum er navnet på et attributt i (klasse-)typen 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 operator for type-kast. 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). Man kan her bruke de samme type-deklarasjoner som man kan på ytterste program-nivå, altså variable, prosedyrer og klasser. Prosedyrer kalt i et uttrykk må ha en definert returtype, og denne må også passe inn i uttrykket. Antall og typer på parametere må stemme overens mellom kallsted og deklarasjon, også m.h.t. overføringsmåte ("by ref" eller ikke). Return-setninger kan bare forekomme inne i prosedyre-deklarasjoner, og de angir at prosedyren skal terminere, og eventuelt levere en verdi tilbake. 5

Dersom en prosedyre er deklarert uten returtype behøver ikke prosedyren ha noen return-setning i det hele tatt. Om utførelsen går ut gjennom siste setning vil prosedyren returnere på vanlig måte, som om det stod en returnsetning bakerst. Dersom en prosedyre har en returtype må det være en return-setningen (med et uttrykk) som siste setning i prosedyren. 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 navn på lokale deklarasjoner inne i prosedyren. 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. 6