Obligatorisk Oppgave 1

Like dokumenter
Obligatorisk Oppgave 1

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

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

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

Obligatorisk Innlevering 2

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

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

INF Oblig 2 semantikksjekk og kodegenerering

Spørsmål og svar rundt oblig 1 og verktøy

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

INF5110. Oblig 2 presentasjon

Hjemmeeksamen 2 i INF3110/4110

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

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

Kap. 4: Ovenfra-ned (top-down) parsering

INF5110, onsdag 19. februar, Dagens tema: Parsering ovenfra-ned (top-down)

Statisk semantisk analyse - Kap. 6 Foiler ved Birger Møller-Pedersen (Forelest 10/3 og 12/ av Stein Krogdahl)

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

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

Viktig. Rettet i koden. Obligatorisk oppgave 2 Litt flere detaljer om semantikksjekk og kodegenerering. Semantikksjekk

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

Kap.4 del I Top Down Parsering INF5110 v2005. Arne Maus Ifi, UiO

Dagens tema. Hva er kompilering? Anta at vi lager dette lille programmet doble.rusc (kalt kildekoden): Hva er kompilering?

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

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

Hovedstoffet i kap 4: 16. Februar Ifi, UiO

Kap.4, del 2: Top Down Parsering Kap. 5, del 1: Bottom Up Parsing INF5110, 7/ Legger ut en oppgave til kap. 4 (se beskjed).

Semantisk Analyse del I

UNIVERSITETET I OSLO

Statisk semantisk analyse - Kap. 6

Dagens Tema: Grammatikker

Kap. 4 del I Top Down Parsering INF5110 v2006. Stein Krogdahl Ifi, UiO

UNIVERSITETET I OSLO

Dagens tema: 12 gode råd for en kompilatorskriver

Statisk semantisk analyse - Kap. 6

Dagens Tema: Grammatikker

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

INF 5110, 3. februar Dette foilheftet: Kapittel 3

INF /2, 2015 Kap. 5, Del 2 Stein Krogdahl, Ifi, UiO

Oversikt Kompilering Syntaksanalyse Java Feilsjekking Oppsummering

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

INF januar Forelesninger fremover:

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

Velkommen til INF Kompilatorteknikk

INF 2820 V2015: Obligatorisk innleveringsoppgave 3

Anatomien til en kompilator - I

Kap. 5, Del 3: INF5110, fra 1/3-2011

INF / Kap. 5, Del 2 Stein Krogdahl, Ifi, UiO

Kap. 5, del 1: Parsering nedenfra-opp (Bottom up parsing) INF5110. Stein Krogdahl Ifi, UiO

INF5110 V2013 Stoff som i boka står i kap 4, men som er generelt stoff om grammatikker

MED SVARFORSLAG UNIVERSITETET I OSLO. Det matematisk-naturvitenskapelige fakultet

INF5110 V2012 Kapittel 4: Parsering ovenfra-ned

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

Syntax/semantics - I INF 3110/ /29/2005 1

Kontekstfrie grammatikker og syntaksanalyse (parsering)

Med rettelser til oppgave 5.18, gjort 3/3

Hovedstoffet i kap 4:

Velkommen til INF5110 Kompilatorteknikk

Dagens tema. Hva er kompilering? Anta at vi lager dette lille programmet (kalt kildekoden): Hva er kompilering?

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

Kap. 4, del I: Top Down Parsering Pluss oppgave til kapittel 3 INF5110 V2008

Kap. 5, Del 2: INF / (og 2/3 og 3/3)

Velkommen til INF Kompilatorteknikk

UNIVERSITETET I OSLO

Kap. 5, del 2 LR(1)- og LALR(1)-grammatikker INF5110 V2008

INF5110, tirsdag 5. februar, Dagens temaer: - Oppgaver til kap. 3 Svar ligger på slutten av foilene, men forsøk deg først selv!!

INF 2820 V2016: Obligatorisk innleveringsoppgave 3

Administrivia INF 3110/ INF /02/2005 1

Kap. 5, del 1: Parsering nedenfra-opp (Bottom-up parsering) INF / Stein Krogdahl Ifi, UiO

Generiske mekanismer i statisk typede programmeringsspråk

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

Dagens tema: Mer av det dere trenger til del 1

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

INF Innleveringsoppgave 6

Hjemmeeksamen 1 i INF3110/4110

UNIVERSITETET I OSLO

INF3110 Programmeringsspråk

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

Bottom up parsering (nedenfra-og-opp) Kap. 5 del 1 Intro til parsering nedenfra-og-opp samt LR(0) og SLR(1) grammatikker INF5110 v2006

Anatomien til en kompilator - I

Velkommen til INF Kompilatorteknikk

Kap. 5, Del 2: SLR(1), LR(1)- og LALR(1)-grammatikker INF /2-2011

Kap. 5, Del 2: SLR(1), LR(1)- og LALR(1)-grammatikker INF5110 V2009

Velkommen til INF Kompilatorteknikk

Del 3: Evaluere uttrykk

Kap. 5 del 2: LR(1)- og LALR(1)-grammatikker INF5110 V2005. Stein Krogdahl, Ifi, UiO

Dagens tema: Sjekking

Obligatorisk oppgave 1 i INF 4130, høsten 2009

Litt om Javas class-filer og byte-kode

Bakgrunnen for INF2100. Velkommen til INF2100. Prosjektet. Hva gjør en kompilator?

NOTAT (pensum!) Javas klasse-filer, byte-kode og utførelse

Velkommen til INF2100 Jeg er Dag Langmyhr

INF Obligatorisk innlevering 7

Velkommen til INF2100

Obligatorisk oppgave 1 i INF 4130, høsten 2008

Obligatorisk oppgave 2 i INF 4130, høsten 2009

Transkript:

Obligatorisk Oppgave 1 INF5110 - Kompilatorteknikk Våren 2016 Frist: 20. mars 23:59 Hensikten med Oppgaven Tanken bak denne oppgaven er at man skal få litt praktisk erfaring med følgende: Bruke skannings- og parseringsverktøy, i dette tilfellet JFlex og CUP. Omarbeide en grammatikk fra én form (utvidet BNF til en annen (BNF som passer verktøyet. Kunne kontrollere presedens og assosiativitet på to måter: 1. Ved å lage en entydig grammatikk som gir riktig presedens/assosiativitet 2. Gi en flertydig grammatikk og styre presedens og assosiativitet ved passelige kommandoer i CUP. Definere nodeklasser til et abstrakt syntaks-tre og bruke parserverktøyet til å bygge trær som representerer innleste programmer. I oblig 1 skal vi bygge opp det abstrakte syntakstreet og deretter skrive det ut med en entydig parentetisk form som angir presedens og assosiativitet. Verktøy Dere skal implementere kompilatoren i Java, ved hjelp av skannergeneratoren JFlex og parsergeneratoren CUP. Dere skal bruke bruke Ant til bygging av kildekoden slik at hele innleveringen kan bygges og testes med noen få kommandoer. Den utleverte kildekoden har et oppsett dere kan utvide. Oppgaven Oppgaven går ut på å lage et program, ved hjelp av JFlex og CUP, som skal sjekke at programmer i språket Compila16 er syntaktisk korrekte. Språket er definert i et eget notat. Merk at det i oblig 1 ikke er nødvendig å sjekke at programmer er semantisk korrekte. Man kan trygt ignorere alt som står i notatet om Compila16 vedrørende sjekking av semantikk og kjøretidsforhold. Det blir først relevant for oblig 2.

Syntakstre Under parseringen av språket skal det bygges opp et abstrakt syntakstre. Node-klasser må defineres for dette treet med en passelig subklasse-struktur. Treet bygges under parseringen ved hjelp av aksjonskode og returverdier fra produksjoner i en CUP-grammatikk. De fleste ikketerminaler i grammatikken trenger tilsvarende klasser i nodehierarkiet (de som trengs for å bygge opp abstakte synkstrær. Objektorienterte språk egner seg godt til bygging av abstrakte parseringstrær. Det gir naturlige forhold mellom hierarkiet av noder. For eksempel vil et if-statement typisk være en subklasse av et generelt statement, som igjen typisk vil være en subtype av en generell nodeklasse. Metoder i klassene kan da brukes ved traversering og bruk av treet. Legg merke til at bare det abstrakte syntaks-treet skal lages og skrives ut. For produksjoner av typen stmt -> if_stmt skal det altså ikke lages noen ny node. Utskrift av Syntakstre Når man har bygget opp et abstrakt syntaks-tre, skal dette skrives ut i prefiksform. Hver node i det abstrakte treet skal representeres med ett par parenteser, og hvert "barn" av denne noden skal inngå i mellom disse parentesene. Rett etter første parentes kommer navnet på noden (som angitt i grammatikken, fulgt av attributtene (barna til noden. Eksempelfiler: Compila.cmp - input til kompilatoren (eksempel gitt lenger ned. Compila.ast - output fra kompilatoren (eksempel gitt lenger ned. Formatering er valgfritt i utskriften, men det kreves en viss ryddighet og struktur. To Grammatikker Oppgaven skal løses med to forskjellige grammatikker: 1. Den første grammatikken for Compila16 skal ha en entydig syntaks uttrykt med BNF alene. Presedens og assosiativitet skal være innebygget i grammatikken. 2. Den andre skal være flertydig og skal ikke ha innebygget presedens og prioritet. Den resulterende grammatikken vil da trenge egne presedens- og assosiativitetsregler definert i CUP for å håndtere konfliktene som oppstår. Dette vil vanligvis gjøre grammatikken kortere. 2

Sammenlikne de to parserne Undersøk og karakteriser konfliktene i den opprinnelige grammatikken og forklar hvordan du løste dem. Undersøk også hvor mange tilstander CUP-automaten får for de to grammatikkene. Diskutér også om valg av grammatikk har noe å si for hvor greit det er å definere nodene og bygge syntakstreet. Merk: Det er tilstrekkelig å bygge og skrive ut syntakstreet fra én av grammatikkfilene. Den andre grammatikken trenger derfor ingen aksjonskode, bare CUP-grammatikk som kan generere et program som sjekker om et Compila16-program er syntaktisk riktig. Leksikalsk Analyse Leksikalsk analyse skal utføres med JFlex, som leverer ett og ett token til parseren ved kall på metoden next_token(. Hovedoppgavene til skanneren blir å gjenkjenne identifikatorer og konstanter, samt å hoppe over kommentarer, linjeskift og blanke tegn. Hvordan man benytter JFlex og CUP sammen er beskrevet under emnet Working together - JFlex and CUP i manualen til JFlex. Det vesentlige ved integrasjonen er interfacet java_cup.runtime.scanner som må implementeres av scanneren. JFlex implementerer dette interfacet automatisk når man bruker %cup-switchen i JFlex. Ved levering av et token fra skanneren vil det være av typen Symbol og metoden Symbol.value benyttes for å levere tekster eller andre objekter fra scanneren til parseren. Feilhåndtering Dersom det oppdages en syntaktisk feil i programmet skal man bare stoppe analysen av Compila16-programmet, og melde at det er funnet en feil. Det er ikke krav om noen spesielt intelligent feilmelding (men det er morsomt om man kan få til noe her. Frist Fristen for levering er satt til 20 mars kl. 23:59. (F.eks. vil 21. mars 00:01 regnes som ikke levert. Det er ikke mulighet til å få utsettelse av fristen for innlevering eller levere på nytt etter fristen. Ved sykdom må dispensasjon fås fra administrasjonen, samt at den foreløpige versjonen av innleveringen må leveres hvis sykdomsperioden overskrider fristen. Se forøvrig: http://www.mn.uio.no/ifi/studier/admin/obliger/oblig-retningslinjer.html Krav for å få bestått: - Klassen og tre av fire prosedyrer i testprogrammet (se seksjonen Testprogram parses 100% riktig. - Treet som blir skrevet ut for testprogrammet er korrekt, dvs. treet gjenspeiler en riktig parsing. Noe avvik fra formateringen av utskriften er greit. - Alle punktene under seksjonen Gjennomføring og Levering er tatt hensyn til. - Løsningen kompilerer og kjører på en UiO-maskin (test dette!. 3

Gjennomføring og Levering Man kan arbeide alene eller parvis. Man kan etter søknad jobbe i grupper av tre, men sannsynligheten for å bli valgt ut for en gjennomgang og presentasjon av innleveringen økes da betraktelig (en gruppe blir garantert valgt ut. Det som skal leveres er: En forside med navn og brukernavn til de som leverer besvarelsen. En kort rapport om gjennomføringen: forklaring av designet (syntakstre, osv og konfliktene i grammatikken og løsningene i de to grammatikkvariantene. Se beskrivelsen ovenfor. All kode som trengs for å bygge og kjøre parserne, herunder: JFlex-koden for skanneren CUP-koden for de to syntaksvariantene Java-klassene for syntakstreet Byggeskript: build.xml Instruksjoner for bygging og kjøring Utskrift fra kjøring med Compila.cmp som input Levering Besvarelsen sendes til: eyvinda@ifi.uio.no. Husk å legg alle data i en egen mappe før pakking som.zip. Start tittel på epost med [INF5110-2016]. Spørsmål angående oppgaven kan sendes til samme epostadresse. Ressurser Det viktigste her er det som står i læreboka i kap 2.6 og 5.5 (men der refereres det til de tilsvarende verktøyene Lex og Yacc. JFlex- og Cup- dokumentasjon JFlex hovedsiden1 JFlex - User's Manual2: Det nyttigste er kapitlet Lexical Specifications. CUP hovedsiden3 CUP - User's Manual4: Det nyttigste er kapittel 2 Specification Syntax, men man får kanskje mest ut av eksemplene. 1 http://jflex.de/ 2 http://jflex.de/manual.html 3 http://www2.cs.tum.edu/projects/cup/ 4 http://www.cs.princeton.edu/~appel/modern/java/cup/manual.html 4

Testprogram Fil: Compila.cmp program ComplexAddition class Complex var Real : float; var Imag : float; proc Swap(ref a : int, ref b : int var tmp : int; tmp := a; a := b; b := tmp; proc Add (a : Complex, b : Complex : Complex var retval : Complex; retval := new Complex; retval.real := a.real + b.real; retval.imag := a.imag + b.imag; return retval; proc Max (a : int, b : int : int if a > b then return a; return b; proc Main( proc Square (val : float : float return val # 2.0; var num : float; num := 6.480740; print_float( num ; print_str( " squared is " ; print_float( Square( num ; return; 5

Testutskrift av Abstrakt Syntakstre Fil: Compila.ast (PROGRAM (NAME ComplexAddition (CLASS_DECL (NAME Complex (VAR_DECL (TYPE float (NAME Real (VAR_DECL (TYPE float (NAME Imag (PROC_DECL (TYPE void (NAME Swap (PARAM_DECL ref (TYPE int (NAME a (PARAM_DECL ref (TYPE int (NAME b (VAR_DECL (TYPE int (NAME tmp (NAME tmp (NAME a (NAME a (NAME b (NAME b (NAME tmp (PROC_DECL (TYPE Complex (NAME Add (PARAM_DECL (TYPE Complex (NAME a (PARAM_DECL (TYPE Complex (NAME b (VAR_DECL (TYPE Complex (NAME retval (NAME retval (NEW (TYPE Complex (. (NAME retval (NAME Real (ARIT_OP + (. (NAME a (NAME Real (. (NAME b (NAME Real (. (NAME retval (NAME Imag (ARIT_OP + (. (NAME a (NAME Imag (. (NAME b (NAME Imag (RETURN_STMT (NAME retval (PROC_DECL (TYPE int (NAME Max (PARAM_DECL (TYPE int (NAME a (PARAM_DECL (TYPE int (NAME b (IF_STMT (REL_OP > (NAME a (NAME b ( (RETURN_STMT (NAME a 6

(RETURN_STMT (NAME b (PROC_DECL (TYPE void (NAME Main (PROC_DECL (TYPE float (NAME Square (PARAM_DECL (TYPE float (NAME val (RETURN_STMT (ARIT_OP # (NAME val (FLOAT_LITERAL 2.0 (VAR_DECL (TYPE float (NAME num (NAME num (FLOAT_LITERAL 6.480740 (CALL_STMT (NAME print_float (ACTUAL_PARAM (NAME num (CALL_STMT (NAME print_str (ACTUAL_PARAM (STRING_LITERAL " squared is " (CALL_STMT (NAME print_float (ACTUAL_PARAM (CALL_STMT (NAME Square (ACTUAL_PARAM (NAME num (RETURN_STMT 7