Dagens tema Grundig repetisjon og utdyping: Syntaks kontra semantikk

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

Dagens tema: Regulære språk og uttrykk

INF3110 Programmeringsspråk

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

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

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

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

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

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

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

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

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

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

Anatomien til en kompilator - I

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

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

Anatomien til en kompilator - I

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

Dagens Tema: Grammatikker

UNIVERSITETET I OSLO

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

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

Dagens Tema: Grammatikker

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

Programmeringsspråket C

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

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.

UNIVERSITETET I OSLO

INF 5110, 3. februar Dette foilheftet: Kapittel 3

Skanning del I INF /01/15 1

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

Dagens tema: 12 gode råd for en kompilatorskriver

INF2820 Datalingvistikk V2012. Jan Tore Lønning

Skanning del I. Kapittel 2 INF 3110/ INF

UNIVERSITETET I OSLO

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

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

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

Kontekstfrie grammatikker og syntaksanalyse (parsering)

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

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

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

INF2820 Datalingvistikk V2011. Jan Tore Lønning & Stephan Oepen

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

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

INF januar Forelesninger fremover:

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

INF2100. Oppgaver uke 40 og

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

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

INF2820 Datalingvistikk V forelesning, 30.1 Jan Tore Lønning

Oversikt Kompilering Syntaksanalyse Java Feilsjekking Oppsummering

INF1010 våren januar. Objektorientering i Java

INF2820 Datalingvistikk V2016. Jan Tore Lønning

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

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

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

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

INF2100. Oppgaver 9. oktober 2012 C 100 X 10

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

MAT1030 Forelesning 22

UNIVERSITETET I OSLO

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

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

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

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

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

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

INF2100. Oppgaver 26. september til 1. oktober 2007

1/31/2011 SAMMENHENGER FSA OG REGULÆRE UTTRYKK. Regulære språk. Fra FSA til RE. Fra regulært uttrykk til NFA REGULÆRE UTTRYKK I DATALINGVISTIKK DEL 2

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

INF2820 Datalingvistikk V2017 Forelesning 1.2 Jan Tore Lønning

MAT1030 Forelesning 22

Kombinatorikk. MAT1030 Diskret Matematikk. Oppsummering av regneprinsipper

MAT1030 Diskret Matematikk

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

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

INF2820 Datalingvistikk V2015. Jan Tore Lønning

Forelesning inf Java 1

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

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

INF2820 Datalingvistikk V2014. Jan Tore Lønning

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Dagens tema: Kjøresystemer II

Velkommen til INF2100 Jeg er Dag Langmyhr

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

Kontekstfrie grammatikker og syntaksanalyse (parsering)

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

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

Transkript:

Dagens tema Grundig repetisjon og utdyping: Syntaks kontra semantikk Regulære uttrykk og automataer Ulike typer språk Ulike representasjoner av regulære språk Endelige tilstandsmaskiner (FSM-er) Deterministiske FSM-er Ikke-deterministiske FSM-er Dag Langmyhr,Ifi,UiO: Forelesning 8. november 24 Ark av 28

Hva er syntaks? En overskrift i en norsk avis: Fanger krabber så lenge de orker Er det i C lov å skrive for (;;) {... } while () {... } for å få en evig løkke? I C, betyr *p++ (*p)++ eller *(p++)? Hvilke av disse er lovlige flyt-tall i Java: 3 3.4 6.28e 8. 22.D e3.2e+2. Syntaksen (dvs grammatikken) gir svaret. Dag Langmyhr,Ifi,UiO: Forelesning 8. november 24 Ark 2 av 28

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: integer a, b; boolean c; a:=b+c; Semantikken forteller oss Hvordan skjer navnebinding? Hva er «meningen» med et program (mao hva er resultatet av å kjøre det)? Dessverre finnes intet enkelt språk (à la BNF) for å beskrive et språks semantikk, men les om Denotational semantics i avsnitt 4.3 i læereboken. Dag Langmyhr,Ifi,UiO: Forelesning 8. november 24 Ark 3 av 28

Ietveldesignetspråkerdetgodtsamsvar mellom semantikken og brukerens intuitive oppfatning. Ingen spåk er imidlertid perfekte. På nynorsk har vi 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);. I Java har vi class ClassA { int n; void print (ClassA x) { System.out.println("n="+n+" og x.n="+x.n); } } public static void main (String arg[]) { ClassA a = new ClassB(), b = new ClassB(); a.n = ; b.n = 2; a.print(b); } class ClassB extends ClassA { int n2; } void print (ClassB x) { System.out.println(n==x.n? "Like" : "Ulike"); } Dag Langmyhr,Ifi,UiO: Forelesning 8. november 24 Ark 4 av 28

Javas definisjon av flyt-tall Dette er fra The Java Language Specification: FloatingPointLiteral Digits. Digits. Digits ExponentPart ExponentPart FloatTypeSuffix FloatTypeSuffix Digits ExponentPart FloatTypeSuffix Digits Digits ExponentPart Digit FloatTypeSuffix Dag Langmyhr,Ifi,UiO: Forelesning 8. november 24 Ark 5 av 28

Digit 2 3 4 5 6 7 8 9 ExponentPart e + E - Digits FloatTypeSuffix f F d D 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 definertetannetsted. Produksjoner er definisjoner av metasymboler. Takket være metasymbolene kan vi forenkle diagrammet, spare kode ved gjentagelse, og lage rekursive definisjoner. Dag Langmyhr,Ifi,UiO: Forelesning 8. november 24 Ark 7 av 28

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 X-pakken rail. Dag Langmyhr,Ifi,UiO: Forelesning 8. november 24 Ark 8 av 28

BNF «Backus Normal Form» (eller «Backus-Naur form») ble laget til Algol-6 og er den vanligste notasjonen for syntaks. 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 Dag Langmyhr,Ifi,UiO: Forelesning 8. november 24 Ark 9 av 28

Følgende gjelder for denne formen for BNF: 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. BNF uten «?»,, «+» og metaparenteser kalles gjerne klassisk BNF. Dag Langmyhr,Ifi,UiO: Forelesning 8. november 24 Ark av 28

Ulike type språk Språk som kan beskrives med en BNF, deles inn i følgende grupper: 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. binary number binary number binary number Slike språk brukes til søk i Bash, Perl, Emacs, egrep,... Hvorfor brukes regulære språk til søking? ❶ Det er enkelt å angi et ganske kraftig søkekriterium. ❷ Det er lett å lage en meget rask automat som sjekker lovlige uttrykk. Dessverre har alle sin variant av regulære uttrykk. Dag Langmyhr,Ifi,UiO: Forelesning 8. november 24 Ark av 28

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. Ble 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. Uttrykk på formen { a n b n n } kan ikke uttrykkes med en regulær grammatikk. a*(3+i) Uttrykk à la { wcw w (a b) } kan ikke uttrykkes med en kontekstfri grammatikk. int a_min; if (a_min < )... Dag Langmyhr,Ifi,UiO: Forelesning 8. november 24 Ark 3 av 28

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... Imidlertid er det ikke lov med ledende -er eller binærpunktum uten foregående eller etterfølgende sifre, så følgende er ikke tillatt:.. Representasjon : Klassisk BNF 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 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 fp. ep Dag Langmyhr,Ifi,UiO: Forelesning 8. november 24 Ark 5 av 28

Representasjon 2: Utvidet BNF I «utvidet BNF» 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 [ [ ] ] [. [ ] + ]? 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 6 av 28

Representasjon 3: Jernbanediagram Siden jernbanediagram bare er en mer visuell form for utvidet BNF, kan vi angi en regulær grammatikk med et diagram hvor det ikke finnes metasymboler. tall. Dag Langmyhr,Ifi,UiO: Forelesning 8. november 24 Ark 7 av 28

Hvordan sjekke regulære uttrykk? Det er ikke alltid enkelt: #! /store/bin/perl -w while (<>) { chomp; if (/^\s*[]+b\s*$/) { $kind = "binært"; } elsif (/^\s*[-7]+o\s*$/) { $kind = "oktalt"; } elsif (/^\s*\d+d\s*$/) { $kind = "desimalt"; } elsif (/^\s*(\d [abcdefabcdef])+h\s*$/) { $kind = "heksadesimalt"; }else{ $kind = "feilaktig"; } 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 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. B X X.. X Tilstanden merket «B» er starttilstanden, men de med «X» er lovlig slutttilstander. Dag Langmyhr,Ifi,UiO: Forelesning 8. november 24 Ark 9 av 28

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 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. Bruk søkeløkken over til å sjekke data mot det regulære uttrykket. Dag Langmyhr,Ifi,UiO: Forelesning 8. november 24 Ark 2 av 28

Hvordan lage en deterministisk FSM? Det finnes en enkelt algoritme for å lage en deterministisk FSM. Først lages en ikke-deterministiske FSM: B ε. ε ε ε X 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. ❷ Hvert sluttsymbol blir en merket kant. Noen får et tomt symbol (ɛ). ❸ Merk nodene hvor man skal begynne og slutte. B ε X ε. ε ε Dag Langmyhr,Ifi,UiO: Forelesning 8. november 24 Ark 23 av 28

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. Det er vanskelig å gjette når man skal følge en kant med tomt symbol (ɛ). Imidlertid kan man lage en deterministisk FSM utifra en ikke-deterministisk. 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.) 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

Fra hver tilstand følg kantene med ulike terminalsymboler (og tomme kanter). Utvid den deterministiske FSM-en med disse. Dag Langmyhr,Ifi,UiO: Forelesning 8. november 24 Ark 26 av 28

Fortsett med dette... Dag Langmyhr,Ifi,UiO: Forelesning 8. november 24 Ark 27 av 28

Til slutt har man den ferdige deterministiske FSM-en... Vi ser at den er ekvivalent med den vi hadde på ark 9: B X. X. X Dag Langmyhr,Ifi,UiO: Forelesning 8. november 24 Ark 28 av 28