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

Like dokumenter
Dagens tema Grundig repetisjon og utdyping: Syntaks kontra semantikk

Dagens tema: Regulære språk og uttrykk

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

INF3110 Programmeringsspråk

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

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

Språktyper og syntaksanalyseteknikker. Dagens temaer. Hvordan lage en deterministisk automat? Fra jernbanediagram til ID-automat

Syntax/semantics INF 3110/ /8/2004 1

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

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

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

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

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

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

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

Anatomien til en kompilator - I

Anatomien til en kompilator - I

Dagens tema: 12 gode råd for en kompilatorskriver

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

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

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

Programmeringsspråket C

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

Om oppgaveteksten på noe punkt er uklar eller upresis, kan du gjøre egne presiseringer. Formulér i så fall disse tydelig i oppgavebesvarelsen din.

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

INF110 Algoritmer og datastrukturer TRÆR. Vi skal i denne forelesningen se litt på ulike typer trær:

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

UNIVERSITETET I OSLO

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

INF INF1820. Arne Skjærholt. Terza lezione INF1820. Arne Skjærholt. Terza lezione

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

UNIVERSITETET I OSLO

Løsnings forslag i java In115, Våren 1996

Dagens Tema: Grammatikker

EKSAMEN. Dato: 18. mai 2017 Eksamenstid: 09:00 13:00

Løsningsforslag til eksamen i IN 211 høsten 2001

1/26/2012 LITT PYTHON. INF2820 Datalingvistikk V2012. Hvorfor Pyhton. Python syntaks. Python er objektorientert. Python datatyper.

Skanning del I INF /01/15 1

Dagens Tema: Grammatikker

INF2820 Datalingvistikk V2012. Jan Tore Lønning

Oversikt Kompilering Syntaksanalyse Java Feilsjekking Oppsummering

UNIVERSITETET I OSLO

INF1010 våren januar. Objektorientering i Java

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

Oppgave 3 a. Antagelser i oppgaveteksten. INF1020 Algoritmer og datastrukturer. Oppgave 3. Eksempelgraf

Skanning del I. Kapittel 2 INF 3110/ INF

UNIVERSITETET I OSLO

INF 5110, 3. februar Dette foilheftet: Kapittel 3

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

UNIVERSITETET I OSLO

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

INF2100. Oppgaver uke 40 og

MAT1030 Forelesning 22

UNIVERSITETET I OSLO

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

Introduksjon. MAT1030 Diskret Matematikk. Introduksjon. En graf. Forelesning 22: Grafteori. Roger Antonsen

Introduksjon. MAT1030 Diskret matematikk. Søkealgoritmer for grafer. En graf

MAT1030 Diskret matematikk

EKSAMEN. Dato: 9. mai 2016 Eksamenstid: 09:00 13:00

INF2100. Oppgaver 26. september til 1. oktober 2007

INF2820 Datalingvistikk V forelesning, 30.1 Jan Tore Lønning

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

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; }

Kontekstfrie grammatikker og syntaksanalyse (parsering)

INF2820 Datalingvistikk V2017 Forelesning 1.2 Jan Tore Lønning

MAT1030 Forelesning 22

Kombinatorikk. MAT1030 Diskret Matematikk. Oppsummering av regneprinsipper

MAT1030 Diskret Matematikk

INF2820 Datalingvistikk V2016. Jan Tore Lønning

INF2100. Oppgaver 9. oktober 2012 C 100 X 10

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

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

INF2100. Oppgaver 6. og 11. oktober 2011 C 100 X 10

INF2820 Datalingvistikk V2017 Forelesning 2, 23.1 Jan Tore Lønning

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

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

UNIVERSITETET I OSLO

Dagens tema: Kjøresystemer II

Oppgavesettet består av 7 sider, inkludert denne forsiden. Kontroll& at oppgaven er komplett før du begynner å besvare spørsmålene.

Velkommen til INF2100 Jeg er Dag Langmyhr

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

Dagens tema: Sjekking

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

Dagens tema: Mer av det dere trenger til del 1

INF januar Forelesninger fremover:

Alle hele tall g > 1 kan være grunntall i et tallsystem.

Del 3: Evaluere uttrykk

Tallsystemer. Tallene x, y, z og u er gitt ved x = 2, y = 2, z = 4 og u = 2. Dermed blir =

Mer om Perl INF3110/4110. Filer og bruk av disse. Lister. Tabeller. Søking og regulære uttrykk. Oppsummering

MAT1030 Plenumsregning 1

Tallsystemer. Tallene x, y, z og u er gitt ved x = 2, y = 2, z = 4 og u = 2. Dermed blir =

INF2220: Forelesning 1. Praktisk informasjon Analyse av algoritmer (kapittel 2) (Binær)trær (kapittel )

Læreboken på 45 minutter

INF2100. Oppgaver 23. og 24. september 2010

Forelesning inf Java 1

INF1010 Binære søketrær ++

IN1010 våren januar. Objektorientering i Java

PG4200 Algoritmer og datastrukturer forelesning 3. Lars Sydnes 29. oktober 2014

Transkript:

Hva er syntaks? En overskrift i en norsk avis: Fanger krabber så lenge de orker Dagens tema Grundig repetisjon og utdyping: Er det i C lov å skrive for (;;) { while () { Syntaks kontra semantikk for å få en evig løkke? Regulære uttrykk og automataer Ulike typer språk I C, betyr *p++ (*p)++ eller *(p++)? Ulike representasjoner av regulære språk Hvilke av disse er lovlige flyt-tall i Java: Endelige tilstandsmaskiner (FSM-er) Deterministiske FSM-er Ikke-deterministiske FSM-er 3 34 628e 8 22D e3 2e+2 Syntaksen (dvs grammatikken) gir svaret Dag Langmyhr,Ifi,UiO: Forelesning 8 november 24 Ark av 28 Dag Langmyhr,Ifi,UiO: Forelesning 8 november 24 Ark 2 av 28 Ietveldesignetspråkerdetgodtsamsvar mellom semantikken og brukerens intuitive oppfatning Ingen spåk er imidlertid perfekte På nynorsk har vi Semantikk Syntaks forteller ikke alt om et språk: Per gikk bort til Anne og løftet ham opp Tilsvarende har vi i programmeringsspråk: Jentungen møtte løva, og ho åt han I C har vi at c = 2; f(c, c++); gir enten f(2,2); eller f(3,2); integer a, b; boolean c; I Java har vi a:=b+c; class ClassA { int n; Semantikken forteller oss Hvordan skjer navnebinding? void print (ClassA x) { Systemoutprintln("n="+n+" og xn="+xn); Hva er «meningen» med et program (mao hva er resultatet av å kjøre det)? Dessverre finnes intet enkelt språk (à la NF) for å beskrive et språks semantikk, men les om Denotational semantics i avsnitt 43 i læereboken public static void main (String arg[]) { ClassA a = new Class(), b = new Class(); an = ; bn = 2; aprint(b); class Class extends ClassA { int n2; void print (Class x) { Systemoutprintln(n==xn? "Like" : "Ulike"); Dag Langmyhr,Ifi,UiO: Forelesning 8 november 24 Ark 3 av 28 Dag Langmyhr,Ifi,UiO: Forelesning 8 november 24 Ark 4 av 28

Dag Langmyhr,Ifi,UiO: Forelesning 8 november 24 Ark 5 av 28 Digit Digits Digits ExponentPart FloatTypeSuffix Digits ExponentPart FloatTypeSuffix Digits ExponentPart FloatTypeSuffix Digits Digits ExponentPart FloatTypeSuffix FloatingPointLiteral Javas definisjon av flyt-tall Dette er fra The Java Language Specification: Digit 2 3 4 5 6 7 8 9 ExponentPart e + E - FloatTypeSuffix f F d D Digits Dag Langmyhr,Ifi,UiO: Forelesning 8 november 24 Ark 6 av 28 I slike jernbanediagrammer har vi: Terminalsymboler (også kalt grunnsymboler) i runde bokser er symboler som forekommer i brukerens tekst Metasymboler i firkantede bokser blir definert et annet sted Produksjoner er definisjoner av metasymboler Takket være metasymbolene kan vi forenkle diagrammet, Jernbanediagrammer er lette å lese, men de har noen ulemper: De tar stor plass De kan ikke uttrykkes som vanlig tekst De må enten håndtegnes eller lages av spesiell programvare Mine diagrammer er laget med L AT E -pakken rail spare kode ved gjentagelse, og lage rekursive definisjoner Dag Langmyhr,Ifi,UiO: Forelesning 8 november 24 Ark 7 av 28 Dag Langmyhr,Ifi,UiO: Forelesning 8 november 24 Ark 8 av 28

Dag Langmyhr,Ifi,UiO: Forelesning 8 november 24 Ark 9 av 28 FloatingPointLiteral Digits Digits? ExponentPart? FloatTypeSuffix? FloatingPointLiteral Digits ExponentPart? FloatTypeSuffix? FloatingPointLiteral Digits ExponentPart FloatTypeSuffix? FloatingPointLiteral Digits ExponentPart? FloatTypeSuffix Digits Digit + Digit 2 3 4 5 6 7 8 9 ExponentPart [ e E ] [ + - ]? Digits FloatTypeSuffix f F d D NF «ackus Normal Form» (eller «ackus-naur form») ble laget til Algol-6 og er den vanligste notasjonen for syntaks Følgende gjelder for denne formen for NF: Metasymboler skrives slik: Digit Terminalsymboler skrives slik: begin Det kan være flere definisjoner for hvert metasymbol Følgende spesialsymboler brukes: skiller alternativer? angir at noe kan forekomme eller gang angir at noe kan forekomme eller flere ganger + angir at noe kan forekomme eller flere ganger Man kan bruke metaparenteser for å gruppere symboler: [] Det finnes (dessverre) mange variasjoner NF uten «?»,, «+» og metaparenteser kalles gjerne klassisk NF Dag Langmyhr,Ifi,UiO: Forelesning 8 november 24 Ark av 28 Dag Langmyhr,Ifi,UiO: Forelesning 8 november 24 Ark av 28 Dessverre har alle sin variant av regulære uttrykk ❷ Det er lett å lage en meget rask automat som sjekker lovlige uttrykk Hvorfor brukes regulære språk til søking? ❶ Det er enkelt å angi et ganske kraftig søkekriterium Slike språk brukes til søk i ash, Perl, Emacs, egrep, binary number binary number binary number Type 3-språk («regulære språk») har ett metasymbol på venstresiden og kun terminalsymboler på høyresiden, eventuelt med et metasymbol til sist Ulike type språk Språk som kan beskrives med en NF, deles inn i følgende grupper: Type 2-språk («kontekst-frie») har bare et metasymbol på venstresiden Omtrent alle programmeringsspråk benytter en kontekst-fri grammatikk til å definere språkets syntaks Det gir en klar men lettlest definisjon av syntaksen Det er en basis for å skrive en syntakstolker («parser») Type -språk («kontekst-sensitive») krever at høyresiden er minst like lang som venstresiden Dette gjør det mulig å sjekke navnebindinger og finne typefeil le brukt til Algol-68 men lite siden Type -språk har ingen restriksjoner Disse har bare teoretisk interesse Dag Langmyhr,Ifi,UiO: Forelesning 8 november 24 Ark 2 av 28

Praktiske konsekvenser Type -språk er «sterkere» enn type--språk osv i det at de kan uttrykke mer Ulike representasjon av regulære språk La oss som eksempel se på et regulært språk for binære tall med binærer Lovlige ord er Uttrykk på formen { a n b n n kan ikke uttrykkes med en regulær grammatikk a*(3+i) Imidlertid er det ikke lov med ledende -er eller binærpunktum uten foregående eller etterfølgende sifre, så følgende er ikke tillatt: Uttrykk à la { wcw w (a b) kan ikke uttrykkes med en kontekstfri grammatikk int a_min; if (a_min < ) Representasjon : Klassisk NF tall fp ifp ifp ifp ifp fp fp ɛ ep ep ep ep (Symbolet «ɛ» betegner et tomt alternativ) Dag Langmyhr,Ifi,UiO: Forelesning 8 november 24 Ark 3 av 28 Dag Langmyhr,Ifi,UiO: Forelesning 8 november 24 Ark 4 av 28 Parseringstrær Vi sjekker om et uttrykk er lovlig i følge grammatikken ved å se om det lar seg gjøre å lage et parseringstre: tall ifp ifp Representasjon 2: Utvidet NF I «utvidet NF» krever vi for et regulært språk at det ikke er metasymboler i høyresiden Denne høyresiden kalles da et regulært uttrykk Definisjonen av tall som regulært uttrykk blir tall [ [ ] ] [ [ ] + ]? fp ep Notasjon Selv om essensen er den samme, kan notasjonen for regulære uttrykk variere fra ett program til et annet I Perl skriver vi if (/^( ( )*)(\( )+)?$/) { print "OK: "; else{ print "Feil: "; Dag Langmyhr,Ifi,UiO: Forelesning 8 november 24 Ark 5 av 28 Dag Langmyhr,Ifi,UiO: Forelesning 8 november 24 Ark 6 av 28

Hvordan sjekke regulære uttrykk? Det er ikke alltid enkelt: #! /store/bin/perl -w Representasjon 3: Jernbanediagram Siden jernbanediagram bare er en mer visuell form for utvidet NF, kan vi angi en regulær grammatikk med et diagram hvor det ikke finnes metasymboler while (<>) { chomp; if (/^\s*[]+\s*$/) { $kind = "binært"; elsif (/^\s*[-7]+o\s*$/) { $kind = "oktalt"; elsif (/^\s*\d+d\s*$/) { $kind = "desimalt"; elsif (/^\s*(\d [abcdefacdef])+h\s*$/) { $kind = "heksadesimalt"; else{ $kind = "feilaktig"; tall print "Et $kind tall: $_\n"; exit ; Eksempel: 7O Et oktalt tall: 7O 23423423499999c999D Et feilaktig tall: 23423423499999c999D 23423423499999c999H Et heksadesimalt tall: 23423423499999c999H Vi kan benytte en parser til sjekkingen, men det finnes en bedre mulighet: FSM («finite state machine» = endelig tilstandsmaskin) Dag Langmyhr,Ifi,UiO: Forelesning 8 november 24 Ark 7 av 28 Dag Langmyhr,Ifi,UiO: Forelesning 8 november 24 Ark 8 av 28 Representasjon 4: Deterministisk FSM Her definerer vi en FSM (ofte kalt automat) hvor tegnene fører oss fra én tilstand til neste Tilstanden merket er starttilstanden, men de med er lovlig slutttilstander Hvorfor er FSM-er så nyttige? En FSM kan lett representeres av en matrise som angir neste tilstand Tilstand Slutt 2 3 F 2 F F 4 Ja 3 3 3 4 Ja 4 5 5 F 5 5 5 F Ja F F F F Det er vanlig å innføre en ekstra tilstand «F» for feil Dag Langmyhr,Ifi,UiO: Forelesning 8 november 24 Ark 9 av 28 Dag Langmyhr,Ifi,UiO: Forelesning 8 november 24 Ark 2 av 28

Søkealgoritme for FSM Det finnes en enkel og meget rask søkealgoritme for en FSM lagret i matrisen re: stat := ; while flere tegn igjen do begin c:= neste tegn ; stat := re(stat,c); end while; if slutt(stat) then match funnet else ingen match ; Dette skjer altså i raske søkeprogrammer: Lag en FSM utifra det regulære uttrykket ruk søkeløkken over til å sjekke data mot det regulære uttrykket Hvordan lage en deterministisk FSM? Det finnes en enkelt algoritme for å lage en deterministisk FSM Først lages en ikke-deterministiske FSM: Dag Langmyhr,Ifi,UiO: Forelesning 8 november 24 Ark 2 av 28 Dag Langmyhr,Ifi,UiO: Forelesning 8 november 24 Ark 22 av 28 Hvordan lage en ikke-deterministisk FSM? Ta utgangspunkt i jernbanediagrammet: tall ❶ Hver «pens» blir til en node i den ikke-deterministiske FSM-en Hvordan bruke en ikke-deterministisk FSM? En ikke-deterministisk FSM er dårlig egnet til å sjekke tekst Det kan gå flere kanter med samme merke fra en node ❷ Hvert sluttsymbol blir en merket kant Noen får et tomt symbol (ɛ) Det er vanskelig å gjette når man skal følge en kant med tomt symbol (ɛ) ❸ Merk nodene hvor man skal begynne og slutte Imidlertid kan man lage en deterministisk FSM utifra en ikke-deterministisk Dag Langmyhr,Ifi,UiO: Forelesning 8 november 24 Ark 23 av 28 Dag Langmyhr,Ifi,UiO: Forelesning 8 november 24 Ark 24 av 28

Hvordan lage en deterministiske FSM-er Start med startnodene (Dette er startnoden samt de man kan komme til langs kanter med tomt symbol) Fra hver tilstand følg kantene med ulike terminalsymboler (og tomme kanter) Utvid den deterministiske FSM-en med disse Lag en tilstand for disse nodene (Teknikken er basert på å lage tilstander som representerer et utvalg av noder i den ikke-deterministiske FSM-en De utvalgte nodene er sorte) Dag Langmyhr,Ifi,UiO: Forelesning 8 november 24 Ark 25 av 28 Dag Langmyhr,Ifi,UiO: Forelesning 8 november 24 Ark 26 av 28 Til slutt har man den ferdige deterministiske FSM-en Fortsett med dette Vi ser at den er ekvivalent med den vi hadde på ark 9: Dag Langmyhr,Ifi,UiO: Forelesning 8 november 24 Ark 27 av 28 Dag Langmyhr,Ifi,UiO: Forelesning 8 november 24 Ark 28 av 28