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

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

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

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

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

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

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

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

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

Oversikt Kompilering Syntaksanalyse Java Feilsjekking Oppsummering

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

Velkommen til INF2100

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

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

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

Velkommen til INF2100 Jeg er Dag Langmyhr

Dagens tema: 12 gode råd for en kompilatorskriver. Prosjektet. Modifikasjon av grammatikken. Utifra dette RusC programmet:

Dagens tema: 12 gode råd for en kompilatorskriver. Prosjektet. Koblingen mellom grammatikken og klasser. Utifra dette RusC-programmet:

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

Dagens tema: Resten av det dere trenger til del 1

Dagens tema: Resten av det dere trenger til del 1

Dagens tema: Sjekking

INF okt. 2004

Dagens tema: Mer av det dere trenger til del 1

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

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

Hva er syntaks? En overskrift i en norsk avis: Dagens tema Grundig repetisjon og utdyping:

Dagens tema Grundig repetisjon og utdyping: Syntaks kontra semantikk

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

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).

UNIVERSITETET I OSLO

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen Oppsummering

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

UNIVERSITETET I OSLO

Programmeringsspråket C

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

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

Hjemmeeksamen 2 i INF3110/4110

Repetisjon. 1 binærtall. INF3110 Programmeringsspråk. Sist så vi ulike notasjoner for syntaks: Jernbanediagrammer. BNF-grammatikker.

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

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

Dagens tema: Sjekking (obligatorisk oppgave 3)

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

INF3110 Programmeringsspråk

Forkurs INF1010. Dag 2. Andreas Færøvig Olsen Gard Inge Rosvold Institutt for Informatikk, 14.

INF 1010, vår 2005 Løsningsforslag uke 11

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen

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

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

Anatomien til en kompilator - I

Anatomien til en kompilator - I

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

INF1000: noen avsluttende ord

UNIVERSITETET I OSLO

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

Diverse eksamensgaver

Semantisk Analyse del III

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

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

Seminaroppgaver IN1010, uke 2

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

2 Om statiske variable/konstanter og statiske metoder.

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

UNIVERSITETET I OSLO

Obligatorisk Innlevering 2

Obligatorisk Oppgave 1

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

Dagens tema: Kjøresystemer II

Skal bindes opp til en deklarasjon av samme navn

Enkle generiske klasser i Java

Hovedstoffet i kap 4: 16. Februar Ifi, UiO

INF Uke 10. Ukesoppgaver oktober 2012

Obligatorisk Oppgave 1

IN 147 Program og maskinvare

INF2100. Oppgaver uke 40 og

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

2 Om statiske variable/konstanter og statiske metoder.

Datatyper og typesjekking

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

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

Obligatorisk oppgave 1 INF1020 h2005

UNIVERSITETET I OSLO

Semantisk Analyse del I

Programmeringsspråket C Del 3

Forkurs INF1010. Dag 2. Andreas Færøvig Olsen Tuva Kristine Thoresen

løsningsforslag-uke5.txt

UNIVERSITETET I OSLO

INF1000: noen avsluttende ord

Programmeringsspråket C Del 3

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

Dagens tema Kapittel 8: Objekter og klasser

INF1000: Forelesning 7

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

INF2100. Oppgaver 23. og 24. september 2010

Dagens tema INF1070. Vektorer (array er) Tekster (string er) Adresser og pekere. Dynamisk allokering

Transkript:

Dagens tema: Syntaksanalyse Hva annet gjør en kompilator? Sjekking av navnebruk Testutskrifter Dag Langmyhr,Ifi,UiO: Forelesning 4. oktober 2005 Ark 1 av 20

Syntaksanalyse På skolen hadde vi grammatikkanalyse: Fanger krabber så lenge de orker Syntaksanalyse er på samme måte å finne hvilke språkelementer vi har og bygge syntakstreet. Heldigvis Analyse av programmeringsspråk er enklere enn naturlige språk: Programmeringsspråk har en klarere definisjon. Programmeringsspråk er laget for å kunne analyseres rimelig enkelt. Dag Langmyhr,Ifi,UiO: Forelesning 4. oktober 2005 Ark 2 av 20

Program DeclSeqv SentSeqv Decl Sent Sent Sent Sent Sent prog var n; begprog outtext "Skriv et tall: "; n := inint; outtext "Det dobbelte er "; outint(1) 2*n; outline; endprog VarDecl OutTextSent AssignSent Expression ExprPart InIntPart OutTextSent OutIntSent OutLineSent Expression ExprPart ExprPart ConstPart VarPart Dag Langmyhr,Ifi,UiO: Forelesning 4. oktober 2005 Ark 3 av 20

Språkdiagrammene Jernbanediagrammene er et ypperlig utgangspunkt for å analysere et program: Program prog ; Deklarasjon begprog ; Setning endprog Utifra dette vet vi: Først kommer symbolet prog. Hvis neste symbol ikke er begprog, kommer det en Deklarasjon etterfulgt av et semikolon. Før eller siden kommer symbolet begprog. Hvis neste symbol ikke er endprog, kommer en Setning etterfulgt av et semikolon. Før eller siden kommer symbolet endprog. Dag Langmyhr,Ifi,UiO: Forelesning 4. oktober 2005 Ark 4 av 20

Utifra dette kan vi lage en skisse for en metode som analyserer et Minila program: void analyserprogram () { Sjekk at vi har lest prog while ( neste symbol ikke er begprog ) Analysér Deklarasjon og ; Sjekk at vi har lest begprog while ( neste symbol ikke er endprog ) Analysér Setning og ; Sjekk at vi har lest endprog } Stort sett gjør vi to ting: Symboler (i rundinger) sjekkes. Meta symboler (i firkanter) overlates til sine egne metoder for analysering. Dag Langmyhr,Ifi,UiO: Forelesning 4. oktober 2005 Ark 5 av 20

Er det så enkelt? Mange programmeringsspråk er designet slik at denne teknikken kalt «recursive descent» alltid fungerer. Et analyseprogram er aldri i tvil om hvilken vei gjennom programmet som er den rette. Setning Tekst Variabel := Uttrykk intext Navn outchar Uttrykk outint ( Tall ) Uttrykk outline outtext Navn Tekst If-setning While-setning call Navn with Uttrykk into Variabel Dette omfatter Minila og Pascal men ikke Java, C og C++. I fagterminologien er de LL(1) språk. Dag Langmyhr,Ifi,UiO: Forelesning 4. oktober 2005 Ark 6 av 20

Plassering av metodene Husk at målet med analysen er tofoldig: Vi skal sjekke at programmet er riktig. Vi skal bygge opp syntakstreet. Da er det naturlig å koble analysemetoden til den klassen som skal inngå i syntakstreet. Hvert meta symbol i diagrammet implementeres av en Java klasse. Hver av disse klassene får en metode void analyze () {... } som kan analysere «seg selv». Dag Langmyhr,Ifi,UiO: Forelesning 4. oktober 2005 Ark 7 av 20

Samarbeid med SymbolGenerator Hvordan sikrer vi at symbolstrømmen fra SymbolGenerator er i fase med vår analyse? Det beste er å vedta noen regler som alle analyze metodene må følge: ❶ Når man kaller analyze, skal første symbol være lest inn! ❷ Når man returnerer fra en analyze, skal første symbol etter konstruksjonen være lest. Dag Langmyhr,Ifi,UiO: Forelesning 4. oktober 2005 Ark 8 av 20

Modifikasjoner av diagrammene Selv om diagrammene kan fungere bra som de er, kan de noen ganger forbedres: Noen ganger forekommer samme gruppe flere ganger, for eksempel ; Deklarasjon Da kan det være lurt å definere dette som et nytt meta symbol. Dag Langmyhr,Ifi,UiO: Forelesning 4. oktober 2005 Ark 9 av 20

Noen ganger trenger man å lagre data om konstruksjonen, for deklarasjoner av variable og prosedyrer: Deklarasjon var Navn [ Tall ], proc Navn in Navn [ ] out Navn Deklarasjon ; begproc ; Setning endproc Da bør man ha egne meta symboler (som blir egne objekter) for alternativene. Hvis meta symbolet er komplisert, kan det også være nyttig å innføre nye meta symboler (men dette gjelder ikke Minila). Dag Langmyhr,Ifi,UiO: Forelesning 4. oktober 2005 Ark 10 av 20

Feilsjekking Sjekken på syntaksfeil er svært enkel: Hvis neste symbol ikke gir noen lovlig vei i diagrammet, er det en feil. Utfordringen er å gi en feilmelding brukeren har nytte av: Linjenummeret er en selvfølge. Det er lurt å fortelle hva analyze forventet og hva som er neste symbol. Eksempel Jeg synes dette er en god melding: if (! symbgen.curis("then")) mainresp.error("forventet then etter betingelse men fant " +symbgen.cursymbol()); Dag Langmyhr,Ifi,UiO: Forelesning 4. oktober 2005 Ark 11 av 20

Et eksempel Her er en skisse av IfSent og dens analyze: class IfSent { Condition cond; SentSeqv ss1, ss2; void analyze () { if (! symbgen.curis("if")) gi feilmelding ; symbgen.readsymbol(); cond = new Condition(); cond.analyze(); if (! symbgen.curis("then")) gi feilmelding ; symbgen.readsymbol(); ss1 = new SentSeqv(); ss1.analyze(); } } if (symbgen.curis("else")) { symbgen.readsymbol(); ss2 = new SentSeqv(); ss2.analyze(); } else { ss2 = null; } if (! symbgen.curis("endif")) gi feilmelding ; symbgen.readsymbol(); Dag Langmyhr,Ifi,UiO: Forelesning 4. oktober 2005 Ark 12 av 20

Sjekking av navn En kompilator må også sjekke riktig navnebruk. Dette omfatter: Det må ikke forekomme dobbeltdeklarasjoner. Alle navn må være deklarert. Navnet må brukes riktig (enkel variabel kontra array kontra prosedyre). Dag Langmyhr,Ifi,UiO: Forelesning 4. oktober 2005 Ark 13 av 20

Lagring av navn Det enkleste er å lagre navnene i deklarasjonsobjektet: class DeclSeqv { private Decl firstdecl, lastdecl;. } class Decl { private Decl next; protected String name; }. class VarDecl extends Decl { private boolean isarray, isparam; private int arraylength;. } class ProcDecl extends Decl { private VarDecl inpar, outpar; private DeclSeqv ds; private SentSeqv ss;. } Dag Langmyhr,Ifi,UiO: Forelesning 4. oktober 2005 Ark 14 av 20

Hvordan finner man et navn? I Minila programmet kan vi ha følgende setning: x := a[4] + 1; Hvilken x er det snakk om, og hvilken a? Lokale variable Det enkleste er å sjekke om variabelen er en lokal variabel proc p in a[]; var x; begproc. x := a[4] + 1;. endproc; La analyze få med en parameter som peker til den lokale deklarasjonslisten: void analyze (DeclSeqv localdeclseqv) {. } Dag Langmyhr,Ifi,UiO: Forelesning 4. oktober 2005 Ark 15 av 20

Global navn Navn kan imidlertid være deklarert «lenger ute»: prog var a; proc p1; var b; proc p2; var c; begproc... a... b... c... endproc;. Hvordan finner man dem? Det enkleste er å la hvert DeclSeqv objekt ha en peker til sin nærmeste omliggende deklarasjonsliste. Dag Langmyhr,Ifi,UiO: Forelesning 4. oktober 2005 Ark 16 av 20

Testutskrifter Det er lett å gjøre feil når man programmerer noe såpass komplisert som en kompilator. Det lureste er å godta dette og heller finne teknikker for å oppdage feilen. Er SymbolGenerator synkronisert? Til dette bruker man S utskriftene fra Del 0. A utskrifter Gjør man riktig valg i diagrammene. Det beste er å la hver analyze gi lyd fra seg. P utskrifter Ble analysetreet riktig? Det beste da er å skrive det ut etterpå. Dag Langmyhr,Ifi,UiO: Forelesning 4. oktober 2005 Ark 17 av 20

Testprogram Vi skal se på dette programmet: Et veldig enkelt Minila program. prog var x, z; proc read out a; begproc a := inint; endproc; proc write in a; begproc outint(4) a; outline; endproc; begprog call read into x; z := x; call write with z; endprog Dag Langmyhr,Ifi,UiO: Forelesning 4. oktober 2005 Ark 18 av 20

A utskrift A utskriften begynner slik: 1: Et veldig enkelt Minila program. 2: 3: prog A: INN Program 4: var x, z; A: INN DeclSeqv A: INN VarDecl A: UT VarDecl A: INN VarDecl 5: A: UT VarDecl 6: proc read out a; A: INN ProcDecl A: INN VarDecl A: UT VarDecl 7: begproc A: INN DeclSeqv A: UT DeclSeqv 8: a := inint; A: INN SentSeqv A: INN AssignSent A: INN AssignVar A: UT AssignVar A: INN Expression A: INN InIntPart A: UT InIntPart A: UT Expression A: UT AssignSent 9: endproc; A: UT SentSeqv 10: A: UT ProcDecl 11: proc write in a; A: INN ProcDecl A: INN VarDecl A: UT VarDecl 12: begproc 13: outint(4) a; outline; A: INN DeclSeqv A: UT DeclSeqv A: INN SentSeqv A: INN OutIntSent A: INN Expression A: INN VarPart A: UT VarPart A: UT Expression A: UT OutIntSent A: INN OutLineSent A: UT OutLineSent 14: endproc; Dag Langmyhr,Ifi,UiO: Forelesning 4. oktober 2005 Ark 19 av 20

P utskrift Slik ser P utskriften ut: P testutskrift: Skriver innholdet av treet. prog var x ; var z ; proc read out a ; begproc a := inint ; endproc ; proc write in a ; begproc outint( 4 ) a ; outline ; endproc ; begprog call read into x ; z := x ; call write with z ; endprog Dag Langmyhr,Ifi,UiO: Forelesning 4. oktober 2005 Ark 20 av 20