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

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

Hva er kompilering? Dagens tema. En kompilator En kompilator leser Minila koden og lager Flok koden.

Dagens tema: 12 gode råd for en kompilatorskriver

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

INF okt. 2004

Velkommen til INF2100

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

Hvordan skrive Flok og Flass kode? I mange tilfelle er det svært enkelt:

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

INF Enkel historikk over modul-utvikling. Ønsker til en god oppdeling. Program-arkitektur: Hvordan dele opp i moduler/komponenter?

Velkommen til INF2100 Jeg er Dag Langmyhr

Dagens tema: INF2100. Utvidelser av Minila array-er. tegn og tekster. Flass- og Flokkode. prosedyrer. Prosjektet struktur. feilhåndtering.

Hovedansvarlig. Symbolgenerator. Tregenerator. Litt mer kompliserte setninger med betingelser

INF april, 2015 Stein Krogdahl Ifi, UiO. Svar på oppgaver til kap. 8. Ble lagt ut 24. april

Råd nr 1: Start nå! Det tar typisk timer å programmere Del 1 om man ikke har gjort slikt før. Dagens tema:

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

Dagens tema: Sjekking

INF april, 2014 Stein Krogdahl Ifi, UiO. Svar på oppgaver til kap. 8

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

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

Gjøre noe i hele treet = kalle på samme metode i alle objekten. Java datastruktur Klassestruktur

Eks 1: Binærtre Binærtretraversering Eks 2: Binærtre og stakk

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)

INF1000: Forelesning 7

INF Noen oppgaver til kap. 8

INF Noen oppgaver til kap. 8

Konstruktører. Bruk av konstruktører når vi opererer med "enkle" klasser er ganske ukomplisert. Når vi skriver. skjer følgende:

INF3110 Programmeringsspråk. Dagens tema. Typer (Kapittel 3 frem til ) Innføring i ML (Kapittel & ML-kompendiet.) 1/19

Typer. 1 Type: boolean. 2 Verdimengde: {true, false} 3 Operatorer: NOT, AND, OR... 1/19. Forelesning Forelesning

Anatomien til en kompilator - I

INF1000: Forelesning 7. Konstruktører Static

INF1010, 22. mai Prøveeksamen (Eksamen 12. juni 2012) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

Kodegenerering del 3: Tilleggsnotat fra AHU Samt litt om class-filer og byte-kode INF5110 V2007. Stein Krogdahl, Ifi UiO

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

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

Oppsummering. Kort gjennomgang av klasser etc ved å løse halvparten av eksamen Klasser. Datastrukturer. Interface Subklasser Klasseparametre

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

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

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

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

Oversikt Kompilering Syntaksanalyse Java Feilsjekking Oppsummering

INF1010 Rekursive metoder, binære søketrær. Algoritmer: Mer om rekursive kall mellom objekter Ny datastruktur: binært tre

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

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

INF1010 våren 2008 Uke 4, 22. januar Arv og subklasser

Semantisk Analyse del III

Datatyper og typesjekking

UNIVERSITETET I OSLO

Løse reelle problemer

"behrozm" Oppsummering - programskisse for traversering av en graf (dybde først) Forelesning i INF februar 2009

UNIVERSITETET I OSLO

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

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen

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

Skal bindes opp til en deklarasjon av samme navn

Rekursjon. Binærsøk. Hanois tårn.

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

Skal bindes opp til en deklarasjon av samme navn

2 Om statiske variable/konstanter og statiske metoder.

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

Syntaksanalyse. Skanner (repetisjon) Parsering top-down bottom-up LL(1)-parsering Recursive descent Forutsetninger. IN 211 Programmeringsspråk

UNIVERSITETET I OSLO

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

Datatyper og typesjekking

Obligatorisk oppgave 1 INF1020 h2005

Datatyper og typesjekking

INF1000: noen avsluttende ord

TDT Øvingsforelesning 1. Tuesday, August 28, 12

Runtime-omgivelser Kap 7 - I

UNIVERSITETET I OSLO

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

Runtimesystemer Kap 7 - I

Litt om Javas class-filer og byte-kode

INF Notater. Veronika Heimsbakk 10. juni 2012

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

MER OM ARRAYER. INF1000: Forelesning 4. Anta at vi ønsker å lagre en liste med navnene på alle INF1000-studentene:

INF1000: Forelesning 4. Mer om arrayer Metoder

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen Oppsummering

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Klasser, objekter, pekere og UML. INF gruppe 13

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

INF2810: Funksjonell Programmering

INF1010 siste begreper før oblig 2

INF januar 2015 Stein Michael Storleer (michael) Lenkelister

INF2810: Funksjonell Programmering

Ark 1 av 18. programmeringsspråkenes. Velkommen til IN 211. verden. IN 211 Programmeringsspråk

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

INF2810: Funksjonell Programmering. Lokale variabler. Og trær.

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

UNIVERSITETET I OSLO

Datatyper og typesjekking

INF Oblig 2 semantikksjekk og kodegenerering

INF1010 Binære søketrær ++

Programmering i C++ Løsningsforslag Eksamen høsten 2005

Mer kodegenerering: Tilleggsnotat fra AHU Om Javas Byte-kode INF april 2009

Løse reelle problemer

Transkript:

Dagens tema: INF 2100 8. september 2004 Mer om strukturen i treet og hvordan bygge det Testing av at navn er deklarert og brukt riktig Arbeid i gruppene neste uke: Oppgaver relevant for dette stadiet i Del-1 Forelesning neste uke: Del-1: Antakeligvis avslutning om Del-1 Kanskje noe om uttesting av programmer m.m. Eventuelle ekstrakrav til Del-1 legges ut senest fredag 10. sept. 1 Repetisjon: Hvordan bygge treet og analysere? Ha en klasse til hvert syntaksdiagram La hver klasse ha sin metode `analyse La den virke som en vanlig syntaksanalyse-metode class Setn SS; void analyse( ) < sjekk at while kommer >; B = new Betingelse( ); B.analyse ( ); < sjekk at do kommer >; SS = new ( ); SS.analyse( ); < sjekk at endwhile kommer >; De problematiske syntaks-diagrammene Typisk situasjon SETNSEKV: SETN: ; SETN TILORDNING. WHILESETN. class / / Logisk: Setn[ ] setninger = new Setn[??]; / / Praktisk: Vi lager en liste: Setn forstesetn; ning callsetn Ifsetn class Setn... bl.a. nestesetn... class ning extends Setn iabel V; Uttrykk U; class Setn extends Setn SS; fd Proc fs B SS abstract class Setn / / Skal ikke lage objekter av denne Setn nestesetn; abstract void analyse( ) ; / / Angir at denne vil være (konkret) definert i alle subklasser / / Kan like greit legges til en felles ytterste klasse: MinilaTreNode class Setn extends Setn SS; void analyse( ) som skissert tidligere / / Konkret utgave for Setn

Klassen Testutskrifter i Del-1: A- og P-testutskrift class Setn forstesetn; void analyse( ) Setn sistesetn, S; ning callsetn Ifsetn Dekl Prosedyre If while (< cursymb er et navn, while, if, call, outint eller outline > ) if ( curisnavn( ) ) S = new ning( ); else if ( curis( while ) ) S = new Setn( ); else if ( curis( if ) ) S = new IfSetn( ); else S.analyse( ); / / Riktig versjon blir valgt. / / Krever abstract -deklarasjonen i Setn (eller i MinilaTreNode) < Heng S inn bakerst i lista (bak sistesetn, eller først dersom tom) >; Bet A-testutskrift: Skriver ut en linje hver gang: Man starter en analyse-metode Man avslutter en analyse-metode Lages med passelige innrykk, for lett å kunne se kallstrukturen P-testutskrift: Etter at hele treet er generert, for å sjekke at treet er riktig: Skriver ut hele treet, som et Minila-program Gjerne i litt pent format, med innrykk etc. Startes ved å levere treet (ved roten) til Listing-ansvarlig, som selv gjør eventuell P-testutskrift ved hjelp av metoder i tre-nodene (tilsvarende analyse-metodene). Skisse til A-testutskrift Det store bildet: Modulene som skal bruke treet class Setn extends Setn Betingelse B SS; I Listing-ansvarlig, f.eks.: int innrykka; void analyse( ) < kall metode i Listing-ansv.: testain( while ) >; < sjekk at while kommer >; B:- new Betingelse( ); B.analyse ( ); < sjekk at do kommer >; SS:- new ( ): SS.analyse ( ); < sjekk at endwhile kommer >; < kall metode i Listing-ansv.: testaout( while ) >; void testain(string konstr) void testaout(string konstr) Hovedansv. Symbolgen. Listingansv. Dekl Kodegenerator var Prosedyre If Tregenerator Dødt tre?: Data som beskriver programmet, og kan leveres til interesserte Ikke helt dødt: Nodene har metoder til analyse og P-testutskrift (og kodegen) Disse kan sees som utplasserte fra hver sin modul. Greit fordi: De får grei tilgang til data i nodene, som de trenger Vi får automatisk riktig versjon av metodene, ut fra nodens type. Men ulempe: Metodene får ikke tilgang til dataene i moder-modulen Setn Dekl setn Bet Setn F.eks. pekere til andre moduler

Oppgradering av treet til en fullverdig modul med lokale variable, startopp-metode etc. abstract class MinilaTreNode / / Superklasse til alle tre-node-klassene static MainResponsible mainresp; static ListingResponsible listresp; static SymbolGenerator symbgen; Synlig fra alle noder i treet (siden de er objekter av subklasser av MinilaTreNode) iabel Uttrykk X := 5 + Y[3] * inint / X ning Uttrykk fledd static void startopp( mresp, lresp, sgen) mainresp = mresp;.. / / this.mainresp går ikke i statiske metoder / / Også en avslutnings-metode? op: null Konstant Verdi: 5 op: + iabel Navn: Y Indeks: 3 op: * Inint op: / iabel Navn: X Indeks: - abstract void analyse( ); abstract void testpout( ); < Senere også en til kodegenerering. >; Disse må få sin konkrete deklarasjon i alle subklasser av MinilaTreNode (som det skal lages objeketer av) / / Gjør at f.eks. følgende virker, og gir kall på analyse-metoden i IfSetn: / / MinilaTreNode N = new IfSetn(); N.analyse( ); Dette er helt spesielt for de svært enkle uttrykk i Minila. (Mer generelle uttrykk kan greiest sees som trær, men i Minila er de rene sekvenser av ledd) Vi kan lage listen etter samme mønster som f.eks. setnings-sekvens Hvert ledd inneholder operatoren foran seg (behagelig for kode-generering) Navn må bindes til tilsvarende deklarasjons-objekt (og bruken sjekkes) Uttrykks-klassene class Uttrykk // Skal også være subklasse av MinilaTreNode, direkte eller indirekte Ledd forsteledd; Et ferdig tre kan typisk se slik ut: void analyse( ) <konkret utgave, ikke ulik den for setning-sekvens> abstract class Ledd // Skal også være subklasse av MinilaTreNode, direkte eller indirekte Ledd nesteledd; String operator; // Kan passelig være null i første ledd? fd fs abstract void analyse( ); // Kan passelig flyttes ut til klassen MinilaTreNode Subklasser av Ledd, f.eks.: Konstant: Med plass til å holde selve verdien av konstanten DS Proc SS B SS. iabel: Med nok plass til å holde all informasjon om en enkel eller indeksert variabel. Og for hvert navn: Plass til peker til tilsvarende deklarasjon. Inint: Noe plass i det hele tatt? OG: Alle disse må ha egne konkrete utgaver av void analyse( ) (og av testpout, ikke markert over)

Deklarasjonene i treet For det første: var a, xx[5], z2; var u; Behandles som: var a; var xx[5]; var z2; var U; Men: Dette kompliserer analyse-metoden noe. Se kapittel 9.6 Representasjon etter samme prinsipp som for Uttrykk og : Dekl: navn: U navn: Q navn: P Dekl navn: Y ProcDekl navn: V Binding av navn i Minila Deklarasjons-forekomst og bruks-forekomst av navn: Typiske deklarasjons-forekomster var V; var A[20]; proc P in X out Y; Typiske bruks-forekomster: if V <= X + 1 then X:= V + 28 / Y; call P with A[B] + 2 into V; endif; Navnebindings-algoritmen for en bruks-forekomst av navn: Start der navnet er brukt Gå ett og ett hakk utover til omsluttende prosedyre/program Sjekk på hvert sted om navnet finnes i deklarasjonslisten der Stopp første gang navnet finnes deklarert: Da er dette den riktige betydningen (deklarasjonen) av navnet Om det aldri finnes deklarert på veien utover: Navnet er da udeklarert (gi feilmelding) Binding av navn i Minila prog var X, V[30]; proc P; var U, Y; proc Q; Holder på her var X, Z; begproc X := V[5] + 123 * Y; endproc; var V; Er ikke kommet i lista ennå begproc V := Y + 2; call Q; endproc; begprog X:= V[X]+1; call P; endprog Bruk av lokal-peker, m.m. navn: U navn: Y navn: V navn: Z null navn: Q navn: P IfSetn fsetn Setn void analyse( lokal) lokal : Angir -objektet til nærmeste prog/proc Brukes til å lete etter hvor et navn er deklarert Hvert -objekt må også ha en omsl, slik at vi eventuelt kan lete videre X Foreløpig ikke opprettet Foreløpig ikke opprettet V[5] fledd + 123 * Y

Behandling av parameteren lokal class X void analyse( lokal) // Hvilken parameter skal gies til nye kall på analyse( ) : y= new Y( ); y.analyse(??); class omsl; /* Peker til -objektet for omsluttende prosedyre/program. Er `null' i program-objektet sitt -objekt */ Dekl forstedekl; / / Første dekl-objekt i deklarasjons-lista Dekl finnlokaldekl(string navn) /* Hjelpe-metode som leter gjennom den lokale deklarasjons-lista (fra `forstedekl') etter en deklarasjon med dette navn. Returnerer peker til denne, eller `null' */ Det normale: Lever videre den du selv fikk som parameter! Spesielle tilfelle, som må tenkes over: I klassen X= eller ProcDecl, der man kaller analyse i Y= SetningsSekvens. I klassen X=DeklarasjonsSekvens, der man kaller analyse i en underliggende deklarasjon (spesielt viktig for Y=ProcDecl). 17 Dekl fin(string navn) /* Leter, med metoden `finnlokaldekl', først lokalt, så i `omsl', så i `omsl.omsl', osv. Stopper og leverer så fort den finnes, ellers levers `null' */ void analyse( lokal) / / Testutskrtift etc. omsl = lokal; < Osv., med vanlig analyse... >; d = new ProcDecl ( ); d.analyse(?? ); 18 Hva skal sjekkes i forbindelse med navn i Minila? Sjekk at det ikke i noen deklarasjons-liste er to deklarasjoner med samme navn I denne forbindelse regnes in/out-parametere med til prosedyrens deklarasjoner (Dette blir lett å gjøre med noen hjelpe-metoder i -klassen) Sjekk at alle bruksforekomster av navn faktisk er deklarert Og at de i så fall er brukt riktig (dette blir mye mer omfattende i reelle språk): Navn brukt som enkel variabel er deklarert som enkel variabel Navn brukt som array er deklarert som array Navn brukt etter call er deklarert som prosedyre I kall: At bruk av with og into stemmer med in og out i proc-deklarasjonen At en prosedyre ikke blir kalt rekursivt (bare ett kall i gang av gangen) Sjekk at man ikke er inni den prosedyren som kalles (i ett eller flere lag) Alternativt: Ikke sett prosedyrer inn i sin dekl.-liste før ved endproc (Dette ser vi på i en oppgave neste uke) 19