Reguljära uttryck Grammatiker Rekursiv nedåkning Allmänna kontextfria grammatiker. Syntaxanalys. Douglas Wikström KTH Stockholm

Relevanta dokument
Föreläsning 7: Syntaxanalys

Föreläsning 7: Syntaxanalys

Alfabeten, strängar och språk. String

DD1361 Programmeringsparadigm. Formella Språk & Syntaxanalys. Per Austrin

Inlämningsuppgift MiniPlotter

DD1361 Programmeringsparadigm. Formella Språk & Syntaxanalys. Per Austrin

Definition. Mängden av reguljära uttryck på alfabetet Σ definieras av. om α och β är reguljära uttryck så är (α β) ett reguljärt uttryck

i=1 c i = B och c i = a i eller c i = b i för 1 i n. Beskriv och analysera en algoritm som löser detta problem med hjälp av dynamisk programmering.

Grammatik. BNF-grammatik

kind spelling Scanning

Föreläsning 2 5/6/08. Reguljära uttryck 1. Reguljära uttryck. Konkatenering och Kleene star. Några operationer på språk

DD1361 Programmeringsparadigm. Formella Språk & Syntaxanalys. Per Austrin

Objektorienterad Programmering (TDDC77)

Kontextfria grammatiker

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Objektorienterad Programmering (TDDC77)

I Skapa Hej.java och skriv programmet. I Kompilera med javac Hej.java. I Rätta fel och repetera tills du lyckas kompilera ditt program

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Objektorienterad Programmering (TDDC77)

Grundläggande datalogi - Övning 9

Tentamen , Introduktion till Java, dtaa98, dtea53

Dynamisk programmering

11. Reguljära uttryck och grammatiker

Automatateori (2) Idag: Sammanhangsfria språk. Dessa kan uttryckas med Grammatik PDA

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

Idag: Reguljära språk Beskrivs av Reguljära uttryck DFA Grammatik

public static void mystery(int n) { if (n > 0){ mystery(n-1); System.out.print(n * 4); mystery(n-1); } }

11. Reguljära uttryck och grammatiker

Objektorienterad modellering och diskreta strukturer. 13. Problem. Sven Gestegård Robertz. Datavetenskap, LTH

Tänk på följande: Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

SMD 134 Objektorienterad programmering

Föreläsning 11: Rekursion

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Objektorienterad programmering E. Telefonboken, än en gång. Gränssnitt. Telefonboken med gränssnitt specificerat, del 1.

Tentamen OOP

Universitetet i Linköping Institutionen för datavetenskap Anders Haraldsson

Föreläsning 1, vecka 7: Rekursion

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

10. Mängder och språk

JAVAUTVECKLING LEKTION 4

F4. programmeringsteknik och Matlab

Föreläsning 8 - del 1: Objektorienterad programmering (forts.) - Exempel

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

Rekursion. Koffman & Wolfgang kapitel 5

Programmering för språkteknologer II. OH-serie: Ändliga automater. reguljära uttryck i Java. Deterministiska ändliga automater

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren att du har förstått dessa även om detaljer kan vara felaktiga.

Backcode. Jonathan Crusoe TDP019 Projekt: Datorspråk Linköpings universitet

FL 6: Definite Clause Grammars (kap. 7)

Exempel: Förel Rekursion III Nr 14. Uno Holmer, Chalmers,

OOP Objekt-orienterad programmering

Iteration while-satsen

Tentamen i Algoritmer & Datastrukturer i Java

lex källkod lex.l lexkompilator lex.yy.c C- kompilator lex.yy.c a.out sekvens av tokens a.out input specifikation av tokens mha reguljära uttryck

"if"-satsen. Inledande programmering med C# (1DV402)

Föreläsning 3. Iteration while-satsen

Föreläsning 7-8 Innehåll

Tentamen TEN1 HI

Dugga i Grundläggande programmering STS, åk

Lösningsförslag till tentamen för TDA540 Objektorienterad Programmering

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

DAI2 (TIDAL) + I2 (TKIEK)

Föreläsning 14. Filhantering

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

Outline. Objektorienterad Programmering (TDDC77) En frukt har ett namn. Man kan lägga en frukt i en korg... Hashing. Undantag. Ahmed Rezine.

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Objektorienterad Programmering (TDDC77)

Exempeltenta GruDat 2002/2003

Tentamen i Programmering

TDIU01 - Programmering i C++, grundkurs

Tentamen. Lösningsförslag

Tentamen ID1004 Objektorienterad programmering May 29, 2012

String [] argv. Dagens Agenda. Mer om arrayer. Mer om arrayer forts. String [] argv. argv är variabelnamnet. Arrayer och Strängar fortsättning

Länkade listor kan ingå som en del av språket, dock ej i C Länkade listor är ett alternativ till:

Syntaktisk parsning (Jurafsky & Martin kapitel 13)

Tentamen TEN1 HI

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Tentamen Programmeringsteknik II Skrivtid: Hjälpmedel: Java-bok (vilken som helst) Skriv läsligt! Använd inte rödpenna!

Objekt som argument. Föreläsning 7-8 Innehåll. Hur komma åt den andra kvadratens attribut? Anropa metod på objektet självt

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

DAT043 Objektorienterad Programmering

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

PROMETHEUS. Ett typat, objektorienterat programmeringsspråk av Tim Andersson.

Föreläsning 3-4 Innehåll

Klassen BST som definierar binära sökträd med tal som nycklar och enda data. Varje nyckel är unik dvs förekommer endast en

Dynamisk programmering

E02 "The Review" Föreläsning 2, HT2013 Grunderna, repetition. Johan Leitet. Kurs: 1dv403 Webbteknik I

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Mer källkod. Styrstrukturer Val Slingor Operatorer Källkodsexempel med minne. Erik Forslin. Rum 1445, plan 4 på Nada

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning

Giriga algoritmer och dynamisk programmering

Lite om reella tal. Programmering. I java. Om operatorers associativitet och prioritet

Tentamen i Objektorienterad programmering

Den som bara har en hammare tror att alla problem är spikar

1 Programmering i Java. Program element - Introduktion. Exempel. Exempel. Kapitel 3:

Datalogi I, grundkurs med Java 10p, 2D4112, Fiktiv tentamen, svar och lösningar och extra kommentarer till vissa uppgifter 1a) Dividera förs

Introduktion till Java

Detta dokument är ett exempel, cirka hälften av en tentamen för TDA545 Objektorienterad programvaruutveckling

Transkript:

Syntaxanalys Douglas Wikström KTH Stockholm popup-help@csc.kth.se

Reguljära uttryck Reguljära uttryck förutsätter att en mängd bokstäver är givna, ett så kallat alfabet, som oftast betecknas med Σ. Uttryck formas enligt: ǫ a Σ R 1 R 2 R 1 R 2 R tomma strängen bokstav konkatenering union (alternativ) Kleene-slutning (noll eller fler konkatenerade) Varje reguljärt uttryck definierar en mängd strängar, ett så kallat språk.

Reguljära uttryck Syntaktiskt socker: en eller fler konkatenerade R? noll eller en [abc] någon bokstav i mängden {a,b,c} [a z] någon bokstav i mängden {a,b,...,z} [ˆabc] någon bokstav i mängden Σ {a, b, c} R +

Reguljära uttryck i praktiken C Gnu C Library (saknas på Kattis och på tävlingar) C++ Boost regex (saknas på Kattis och på tävlingar) Java API, java.util.regex.* Finns på Kattis och normalt på tävlingar där Java används.

Exempel i Java import java. u t i l. regex. ; public class RegexpExample { public static void main( String [ ] args ) throws ParseException { Pattern pattern = Pattern. compile ( ( [A Z ] [ a z ]?) + (\ \() + (\ \)) + ([1 9][0 9] ) + (\\ $) ) ; Matcher m = pattern. matcher ( args [ 0 ] ) ; } } int pos = 0; while (m. find ( pos )) { System. out. p r i n t l n (m. group ( ) ) ; pos = m. end ( ) ; }

Utvidgad Backus-Naur form (EBNF) En grammatik är en tupel (Σ,N, start,r) där: Σ = {a 1,...,a s } alfabet av slutsymboler inklusive tomma strängen. N = {n 1,...,n t } mängd av icke-slutsymboler. start är en startsymbol. För varje icke-slutsymbol a innehåller R precis en regel a ::= β, där β ([a 1 a n ] [n 1 n t ]) + ( ([a 1 a n ] [n 1 n t ]) + ) Mängden strängar i språket skapas genom att stegvis ersätta varje icke-slutsymbol med något av de alternativ som separeras med i dess produktionsregel.

Exempel: molekylformler C12H22O11 (socker), C60 (Buckyboll) Slutsymboler: atom (en atomförkortning), num (ett positivt heltal), lpar (vänsterparentes), rpar (högerparentes). Produktionsregler: start ::= molecule $ molecule ::= part part molecule part ::= simple simple num simple ::= atom lpar molecule rpar

Rekursiv nedåkning Skriv en metod för varje icke-slutsymbol i grammatiken, och låt metoderna äta upp indata genom att anropa varandra. Bestäm vilken metod som skall anropas vid varje tillfälle genom att tjuvkika vad som kommer härnäst i indata (gör rekursiv sökning med backtracking i allmänhet). Förutsätter att endast begränsad sökning krävs för att avgöra vilket alternativ i en regel som skall tillämpas.

Exempel: lexikal analys Från bokstäver till slutsymboler Indata i vårt molekylexempel erhålls som en följd bokstäver, så innan vi börjar måste de först översättas till en följd av slutsymboler. Detta görs till exempel med reguljära uttryck. Vi lagrar vilken slutsymbol en delsträng svarar mot, och strängens värde, tex atomnummer eller positivt heltal

Exempel: reguljära uttryck för slutsymboler i Java Pattern pattern = Pattern. compile ( ( [A Z ] [ a z ]?) + (\\() + (\\)) + ([1 9][0 9] ) + (\\ $) ) ; Matcher m = pattern. matcher ( s t r ) ; Vi använder Javas escape-sekvens för att skicka ett enkelt \ till Pattern-klassen. Den förväntar sig i sin tur att vi använder en escape-sekvens för ( och $ eftersom dessa har särskild mening i reguljära uttryck.

Exempel: syntaktisk analys Input: Sträng s. Output: Syntaxträd. Parser(s) (1) t Tokenizer(s) (2) return start(t) start ::= molecule $ (regel att översätta) start(t) (1) m molecule(t) (2) d peek(t) (3) if d = $ (4) return Node(m,$) (5) else (6) error()

Exempel: syntaktisk analys molecule ::= part part molecule (regel att översätta) molecule(t) (1) p part(t) (2) d peek(t) (3) if d {atom,lpar} (4) return Node(p,molecule(t)) (5) else (6) return Node(p, )

Exempel: syntaktisk analys part ::= simple simple num (regel att översätta) part(t) (1) s simple(t) (2) d peek(t) (3) if d = num (4) next(t) (5) return Node(s,d) (6) else (7) return Node(s, )

Exempel: syntaktisk analys simple ::= atom lpar molecule rpar (regel att översätta) simple(t) (1) d peek(t) (2) if d = atom (3) next(t) (4) return Node(, d, ) (5) else if d = lpar (6) next(t) (7) m molecule(t) (8) d peek(t) (9) if d = rpar (10) next() (11) return Node(lpar, m, rpar)) (12) else (13) error() Popup(14) 2008 else 27 oktober 2008

Kontextfria grammatiker och Chomskys normalform En grammatik är kontextfri om varje produktionsregel kan tillämpas utan hänsyn till närliggande symboler. Om en grammatik är kontextfri kan den skrivas om Chomskys normalform, dvs alla regler är på någon av formerna: a ::= b c a ::= x där a är icke-slutsymboler b och x är en slutsymbol (det finns då flera produktionsregler med samma vänsterled).

Parsning av grammatik på Chomskys normalform (CYK-algoritmen) Vi skall svara på om x 0,...,x n 1 ligger i språket. Vi använder dynamisk programmering! Vi bygger en boolesk tabell (p j,i,k ). p j,i,k är sann omm a j kan generera x i,...,x i+(k 1). Vi har rekursivt samband: p j,i,k = true det finns en regel a j ::= a s a t och ett 1 r k 1 så att p s,i,r = true och p t,i+r,k r = true.

CYK-algoritmen CYK() (1) P[j,i,k] false i,j,k (2) if X i = b and regel a j ::=b (3) P[j,i,1] true (4) for k = 2 to n + 1 (5) for i = 0 to n 1 (6) for r = 1 to k 1 (7) if regel a j ::= a s a t så att P[s,i,r] and P[t,i + r,k r] (8) P[j,i,k] true (9) return P[0, 1, n]