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

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

Föreläsning 7: Syntaxanalys

Föreläsning 7: Syntaxanalys

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

Kompilatorteknik. Görel Hedin Datavetenskap Lunds Tekniska Högskola. Temaföreläsning, Datorer i system, 2009

Grammatik. BNF-grammatik

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

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

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

Föreläsning 9: Turingmaskiner och oavgörbarhet. Turingmaskinen. Den maximalt förenklade modell för beräkning vi kommer använda är turingmaskinen.

Turingmaskiner och oavgörbarhet. Turingmaskinen. Den maximalt förenklade modell för beräkning vi kommer använda är turingmaskinen.

Alfabeten, strängar och språk. String

Kompilatorteknik. Görel Hedin Datavetenskap Lunds Tekniska Högskola. Temaföreläsning, Datorer i system, 2011

Kompilatorteknik. Görel Hedin Datavetenskap Lunds Tekniska Högskola. Temaföreläsning, Datorer i system, 2010

Inlämningsuppgift MiniPlotter

Kontextfria grammatiker

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

Parsning. TDP007 Konstruktion av datorspråk Föreläsning 6. Peter Dalenius Institutionen för datavetenskap

12. Relationer och funktioner

Lite mer psykologi. L2: Automater, Sökstrategier. Top-down. Kimballs sju principer

TENTAMEN I PROGRAMSPRÅK -- DVG C kl. 08:15-13:15

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

Linjärt minne. Sammanhängande minne är ej flexibelt. Effektivt

Kompilatorteknik. Görel Hedin Datavetenskap Lunds Tekniska Högskola. Temaföreläsning, Datorer i system, 2014

12. Relationer och funktioner

Övningsexempel i Artificiella språk och syntaxanalys 2D1373

Bakgrund och motivation. Definition av algoritmer Beskrivningssätt Algoritmanalys. Algoritmer. Lars Larsson VT Lars Larsson Algoritmer 1

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

MÄLARDALENS HÖGSKOLA. CD5560 Formella språk, automater och beräkningsteori. Användarmanual. för simulatorn JFLAP

Sätt att skriva ut binärträd

OMTENTAMEN I PROGRAMSPRÅK -- DVG C kl. 08:15-13: 15

Datorspråk Breddgivande föreläsning

kind spelling Scanning

Konstruktion av datorspråk

Föreläsning 3. Stack

Tommy Färnqvist, IDA, Linköpings universitet. 2 Rekursion i C Implementation av rekursion Svansrekursion En till övning...

Tentamen i Algoritmer & Datastrukturer i Java

Kungl. Tekn. Högskolan Förel 1, bild 1 Föreläsning 1: Introduktion ffl Kursinnehåll ffl Javarepetition ffl Referenser ffl Nyckelordet static ffl Klass

Föreläsning 3. Stack

Föreläsning 2. Operativsystem och programmering

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

DAB760: Språk och logik

Deklarativ programmering

11. Reguljära uttryck och grammatiker

Fredag 10 juni 2016 kl 8 12

b) S Ø aa, A Ø aa» bb, B Ø aa» bc, C Ø ac» bc» 2. Låt L vara språket över 8a< som nedanstående NFA accepterar.

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

DD1361 Programmeringsparadigm Föreläsning 1: Intro

Algoritmer och datastrukturer H I HÅKAN S T R Ö M B E R G N I C K L A S B R A N D E F E L T

DD1361 Programmeringsparadigm Föreläsning 1: Intro

Grundläggande datalogi - Övning 9

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

Två fall: q Tom sekvens: () q Sekvens av element: (a b c) ; (sum-rec '(2 4 6)) = 12. q Första elementet uppfyller vissa villkor: (2 a b c)

Föreläsning Datastrukturer (DAT036)

Datastrukturer och algoritmer

11. Reguljära uttryck och grammatiker

10. Mängder och språk

Deklarativ programmering

Inledning. Vad är ett datorprogram, egentligen? Olika språk. Problemlösning och algoritmer. 1DV433 Strukturerad programmering med C Mats Loock

Kompilatorer och interpretatorer

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.

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

Inlämningsuppgiften. Föreläsning 9 Innehåll. Träd. Datastrukturer i kursen

Trädstrukturer och grafer

Föreläsning 2 Programmeringsteknik och C DD1316. Programmering. Programspråk

Obligatorisk uppgift 5

Sökning och sortering

Implementering av en Lua-parser. Oskar Schöldström

DD1361 Programmeringsparadigm. Carina Edlund

Introduktion C-programmering

Föreläsning 2 Datastrukturer (DAT037)

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 5 Jonas Lindgren, Institutionen för Datavetenskap, LiU

TDDC30. Kursledning Kursledare: Jonas Lindgren. Labassistent: Jonas Lindgren Labassistent: Niklas Holma Labassistent: Erik Nilsson

Repetition C-programmering

Algoritmer, datastrukturer och komplexitet

Föreläsning 13. Träd

Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6

F11 - Rekursion. ID1004 Objektorienterad programmering Fredrik Kilander

Extra övningar på SDD:er/SDT:er

Tentamen, Algoritmer och datastrukturer

Klassdeklaration. Metoddeklaration. Parameteröverföring

Program & programmering

F4. programmeringsteknik och Matlab

Översikt. Stegvis förfining. Stegvis förfining. Dekomposition. Algoritmer. Metod för att skapa ett program från ett analyserat problem

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

Övning 2. (Länkade) Listor, noder

2D1372 Artificiella språk och syntaxanalys

Föreläsning 10 Datalogi 1 DA2001. Utskrift på skärmen. Syntax. print( Hej ) Hur är det? Hej. print( Hej,end= ) print( Hur är det? ) HejHur är det?

Föreläsning 1 Datastrukturer (DAT037)

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

Datastrukturer och algoritmer. Föreläsning 4 Test, Stack och Kö

Föreläsning 2 Programmeringsteknik och Matlab DD1312. Programspråk. Utskrift på skärmen

Välkommen till. Datastrukturer, algoritmer och programkonstruktion. eller DOA

Tentamen Programmeringsteknik II för STS Skrivtid: Inga hjälpmedel.

TDDI16 Datastrukturer och algoritmer. Algoritmanalys

Rekursion. Koffman & Wolfgang kapitel 5

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

Tentamen Datastrukturer (DAT036)

2D1373 Artificiella språk och syntaxanalys

Dynamisk programmering

Transkript:

DD1361 Programmeringsparadigm Formella Språk & Syntaxanalys Föreläsning 4 Per Austrin 2015-11-20

Idag Rekursiv medåkning, fortsättning Olika klasser av språk och grammatiker Parsergeneratorer Sammanfattning / Inför KS

Idag Rekursiv medåkning, fortsättning Olika klasser av språk och grammatiker Parsergeneratorer Sammanfattning / Inför KS

Begränsningar för rekursiv medåkning Från förra föreläsningen: Den här grammatiken för aritmetiska uttryck kan inte parsas med rekursiv medåkning Expr Term Expr + Term Expr Term Term Factor Term Factor Term/Factor Factor Num (Expr)

Begränsningar för rekursiv medåkning Från förra föreläsningen: Den här grammatiken för aritmetiska uttryck kan inte parsas med rekursiv medåkning Expr Term Expr + Term Expr Term Term Factor Term Factor Term/Factor Factor Num (Expr) Det största problemet är vänster-rekursion: ett Expr kan börja med ett Expr

Grammatik-notation för listor Vi gör ytterligare ett försök, och formulerar en ny grammatik: Expr Term{PM Term} Term Factor{TD Factor} PM + TD / Factor Num (Expr) Expr Term Expr + Term Expr Term Term Factor Term Factor Term/Factor Factor Num (Expr)

Grammatik-notation för listor Vi gör ytterligare ett försök, och formulerar en ny grammatik: Expr Term{PM Term} Term Factor{TD Factor} PM + TD / Factor Num (Expr) Expr Term Expr + Term Expr Term Term Factor Term Factor Term/Factor Factor Num (Expr) Notationen {ole dole doff} betyder ole dole doff upprepat 0 eller fler gånger

Grammatik-notation för listor Vi gör ytterligare ett försök, och formulerar en ny grammatik: Expr Term{PM Term} Term Factor{TD Factor} PM + TD / Factor Num (Expr) Expr Term Expr + Term Expr Term Term Factor Term Factor Term/Factor Factor Num (Expr) Betyder alltså: Expr Term Term PM Term Term PM Term PM Term Term

Rekursiv medåkning för aritmetiska uttryck Expr Term{PM Term} Term Factor{TD Factor} PM + TD / Factor Num (Expr)

Rekursiv medåkning för aritmetiska uttryck Java-kod för att parsa ett Expr: Expr Term{PM Term} Term Factor{TD Factor} PM + TD / Factor Num (Expr) ParseTree Expr() { ParseTree result = Term(); while (peektoken() == PLUS or peektoken() == MINUS) { Token operator = nexttoken(); ParseTree next = Term(); result = new BinaryOperation(operator, result, next); } return result; }

Rekursiv medåkning för aritmetiska uttryck ParseTree Expr() { ParseTree result = Term(); while (peektoken() == PLUS or peektoken() == MINUS) { Token op = nexttoken(); ParseTree next = Term(); result = new BinOp(op, result, next); } return result; } ParseTree Term() { ParseTree result = Factor(); while (peektoken() == TIMES or peektoken() == DIVIDE) { Token op = nexttoken(); ParseTree next = Factor(); result = new BinOp(op, result, next); } return result; } ParseTree Factor() { Token t = nexttoken(); if (t == NUM) return new Number(t.value); else if (t == LPAREN) { ParseTree result = Expr(); if (nexttoken()!= RPAREN) throw new SyntaxError(); return result; } throw new SyntaxError(); }

Rekursiv medåkning för aritmetiska uttryck ParseTree Expr() { ParseTree result = Term(); while (peektoken() == PLUS or peektoken() == MINUS) { Token op = nexttoken(); ParseTree next = Term(); result = new BinOp(op, result, next); } return result; } ParseTree Term() { ParseTree result = Factor(); while (peektoken() == TIMES or peektoken() == DIVIDE) { Token op = nexttoken(); ParseTree next = Factor(); result = new BinOp(op, result, next); } return result; } ParseTree Factor() { Token t = nexttoken(); if (t == NUM) return new Number(t.value); else if (t == LPAREN) { ParseTree result = Expr(); if (nexttoken()!= RPAREN) throw new SyntaxError(); return result; } throw new SyntaxError(); } Exempel på tavlan: 5-2-3 (3+1)*7

Rekursiv medåkning för aritmetiska uttryck ParseTree Expr() { ParseTree result = Term(); while (peektoken() == PLUS or peektoken() == MINUS) { Token op = nexttoken(); ParseTree next = Term(); result = new BinOp(op, result, next); } return result; } ParseTree Term() { ParseTree result = Factor(); while (peektoken() == TIMES or peektoken() == DIVIDE) { Token op = nexttoken(); ParseTree next = Factor(); result = new BinOp(op, result, next); } return result; } ParseTree Factor() { Token t = nexttoken(); if (t == NUM) return new Number(t.value); else if (t == LPAREN) { ParseTree result = Expr(); if (nexttoken()!= RPAREN) throw new SyntaxError(); return result; } throw new SyntaxError(); } Exempel på tavlan: 5-2-3 (3+1)*7 (Fullständig Javaimplementation upplagd på kurshemsidan)

Idag Rekursiv medåkning, fortsättning Olika klasser av språk och grammatiker Parsergeneratorer Sammanfattning / Inför KS

Olika kraftfulla grammatiker De grammatiker vi använt oss av är vad som kallas för kontextfria grammatiker (Det finns mer generella grammatiker som kallas för kontextkänsliga)

Olika kraftfulla grammatiker De grammatiker vi använt oss av är vad som kallas för kontextfria grammatiker (Det finns mer generella grammatiker som kallas för kontextkänsliga) Vi har sett två verktyg för att parsa kontextfria grammatiker: Stackautomater (föreläsning 2) Rekursiv medåkning (föreläsning 3 och nyss)

Olika kraftfulla grammatiker De grammatiker vi använt oss av är vad som kallas för kontextfria grammatiker (Det finns mer generella grammatiker som kallas för kontextkänsliga) Vi har sett två verktyg för att parsa kontextfria grammatiker: Stackautomater (föreläsning 2) Rekursiv medåkning (föreläsning 3 och nyss) Inget av dem är tillräckligt kraftfullt för att kunna hantera alla kontextfria grammatiker, men de är tillräckliga för att hantera de flesta språk man faktiskt vill skriva en parser för.

Olika kraftfulla grammatiker De grammatiker vi använt oss av är vad som kallas för kontextfria grammatiker (Det finns mer generella grammatiker som kallas för kontextkänsliga) Vi har sett två verktyg för att parsa kontextfria grammatiker: Stackautomater (föreläsning 2) Deterministiska kontextfria grammatiker Deterministiska kontextfria språk Rekursiv medåkning (föreläsning 3 och nyss) LL-grammatiker LL-språk Inget av dem är tillräckligt kraftfullt för att kunna hantera alla kontextfria grammatiker, men de är tillräckliga för att hantera de flesta språk man faktiskt vill skriva en parser för.

Perspektiv Reguljära språk

Perspektiv T.ex. giltiga e-post-adresser Reguljära språk

Perspektiv OBS: varje prick här är ett språk, dvs en mängd strängar T.ex. giltiga e-post-adresser Reguljära språk

Perspektiv LL-språk (kan parsas med rekursiv medåkning) Reguljära språk

Perspektiv T.ex. balanserade parentesuttryck LL-språk (kan parsas med rekursiv medåkning) Reguljära språk

Perspektiv Deterministiska kontextfria språk (kan parsas med stackautomat, PDA) LL-språk (kan parsas med rekursiv medåkning) Reguljära språk

Perspektiv Deterministiska kontextfria språk (kan parsas med stackautomat, PDA) LL-språk (kan parsas med rekursiv medåkning) Reguljära språk T.ex. språket {a n b m n > m}

Perspektiv Deterministiska kontextfria språk (kan parsas med stackautomat, PDA) Kontextfria språk (kan beskrivas med kontextfri grammatik) LL-språk (kan parsas med rekursiv medåkning) Reguljära språk

Perspektiv T.ex. palindrom över {a, b} Kontextfria språk Deterministiska kontextfria språk (kan parsas med stackautomat, PDA) (kan beskrivas med kontextfri grammatik) LL-språk (kan parsas med rekursiv medåkning) Reguljära språk

Perspektiv Kontextkänsliga språk (kan beskrivas med kontextkänslig grammatik) Kontextfria språk (kan beskrivas med kontextfri grammatik) Deterministiska kontextfria språk (kan parsas med stackautomat, PDA) LL-språk (kan parsas med rekursiv medåkning) Reguljära språk

Perspektiv T.ex. {a n b n c n n 1} Kontextkänsliga språk (kan beskrivas med kontextkänslig grammatik) Kontextfria språk (kan beskrivas med kontextfri grammatik) Deterministiska kontextfria språk (kan parsas med stackautomat, PDA) LL-språk (kan parsas med rekursiv medåkning) Reguljära språk

Perspektiv Avgörbara språk (existerar algoritm för att känna igen dem) Kontextkänsliga språk (kan beskrivas med kontextkänslig grammatik) Kontextfria språk (kan beskrivas med kontextfri grammatik) Deterministiska kontextfria språk (kan parsas med stackautomat, PDA) LL-språk (kan parsas med rekursiv medåkning) Reguljära språk

Perspektiv Alla språk Avgörbara språk (existerar algoritm för att känna igen dem) Kontextkänsliga språk (kan beskrivas med kontextkänslig grammatik) Kontextfria språk (kan beskrivas med kontextfri grammatik) Deterministiska kontextfria språk (kan parsas med stackautomat, PDA) LL-språk (kan parsas med rekursiv medåkning) Reguljära språk

Perspektiv Alla språk Avgörbara språk (existerar algoritm för att känna igen dem) Kontextkänsliga språk (kan beskrivas med kontextkänslig grammatik) Kontextfria språk (kan beskrivas med kontextfri grammatik) Deterministiska kontextfria språk (kan parsas med stackautomat, PDA) LL-språk (kan parsas med rekursiv medåkning) Reguljära språk T.ex. alla Java-program med en oändlig loop

Idag Rekursiv medåkning, fortsättning Olika klasser av språk och grammatiker Parsergeneratorer Sammanfattning / Inför KS

Parsergeneratorer De flesta vill nog inte sätta sig ner och skriva en parser för ett helt programmeringsspråk för hand.

Parsergeneratorer De flesta vill nog inte sätta sig ner och skriva en parser för ett helt programmeringsspråk för hand. Ofta ganska mekaniskt men många smådetaljer man lätt kan göra fel på perfekt lämpat för en dator att göra istället!

Parsergeneratorer De flesta vill nog inte sätta sig ner och skriva en parser för ett helt programmeringsspråk för hand. Ofta ganska mekaniskt men många smådetaljer man lätt kan göra fel på perfekt lämpat för en dator att göra istället! Det finns många verktyg som automatiskt genererar en lexer och en parser från en språkspecifikation. Språkspecifikation lexikal specifikation kontextfri grammatik Lexer-generator Parser-generator Färdig kod lexer parser

Exempel på parsergeneratorer Lex/Flex och Yacc/Bison, klassiska unix-verktyg, producerar C/C++-kod (hanterar de flesta deterministiska kontextfria grammatiker specifikt, en delmängd som kallas LALR-grammatiker) JFlex och Cup, Java-versioner av Flex och Yacc DCG i Prolog, inbyggt i språket (hanterar alla kontextfria grammatiker, men använder backtracking i Prolog så kan vara långsamt) ANTLR, kan generera LL-parser i många olika språk (C/C++, C#, Java, JavaScript, Python...) Parsec i Haskell

Exempel på parsergeneratorer Lex/Flex och Yacc/Bison, klassiska unix-verktyg, producerar C/C++-kod (hanterar de flesta deterministiska kontextfria grammatiker specifikt, en delmängd som kallas LALR-grammatiker) JFlex och Cup, Java-versioner av Flex och Yacc DCG i Prolog, inbyggt i språket (hanterar alla kontextfria grammatiker, men använder backtracking i Prolog så kan vara långsamt) ANTLR, kan generera LL-parser i många olika språk (C/C++, C#, Java, JavaScript, Python...) Parsec i Haskell

Binära träd igen Förra veckan skrev vi en rekursiv medåknings-parser för binära träd, definierade enligt följande grammatik. BinTree Leaf LParen Number RParen Branch LParen BinTree Comma BinTree RParen Slutsymboler: Leaf: strängen leaf Branch: strängen branch Number: [0-9]+ LParen, RParen, Comma: parenteser och kommatecken

Fil Parser.cup: import java_cup.runtime.*; Binära träd i Cup // Deklarera slut-symboler terminal BRANCH; terminal LEAF; terminal LPAREN; terminal RPAREN; terminal COMMA; terminal Integer NUM; // Ett tal har data av typen Integer // Deklarera icke-slutsymboler, bara en i det här fallet non terminal ParseTree BinTree; // Har data av typen ParseTree BinTree ::= LEAF LPAREN NUM:t RPAREN {: RESULT = new LeafNode(t); :} BRANCH LPAREN BinTree:left COMMA BinTree:right RPAREN {: RESULT = new BranchNode(left, right); :} ;

Fil Parser.cup: import java_cup.runtime.*; Binära träd i Cup // Deklarera slut-symboler terminal BRANCH; terminal LEAF; terminal LPAREN; terminal RPAREN; terminal COMMA; terminal Integer NUM; // Ett tal har data av typen Integer // Deklarera icke-slutsymboler, bara en i det här fallet non terminal ParseTree BinTree; // Har data av typen ParseTree BinTree ::= LEAF LPAREN NUM:t RPAREN {: RESULT = new LeafNode(t); :} BRANCH LPAREN BinTree:left COMMA BinTree:right RPAREN {: RESULT = new BranchNode(left, right); :} ;

Fil Parser.cup: import java_cup.runtime.*; Binära träd i Cup // Deklarera slut-symboler terminal BRANCH; terminal LEAF; terminal LPAREN; terminal RPAREN; terminal COMMA; terminal Integer NUM; // Ett tal har data av typen Integer // Deklarera icke-slutsymboler, bara en i det här fallet non terminal ParseTree BinTree; // Har data av typen ParseTree BinTree ::= LEAF LPAREN NUM:t RPAREN {: RESULT = new LeafNode(t); :} BRANCH LPAREN BinTree:left COMMA BinTree:right RPAREN {: RESULT = new BranchNode(left, right); :} ;

Fil Parser.cup: import java_cup.runtime.*; Binära träd i Cup // Deklarera slut-symboler terminal BRANCH; terminal LEAF; terminal LPAREN; terminal RPAREN; terminal COMMA; terminal Integer NUM; // Ett tal har data av typen Integer // Deklarera icke-slutsymboler, bara en i det här fallet non terminal ParseTree BinTree; // Har data av typen ParseTree BinTree ::= LEAF LPAREN NUM:t RPAREN {: RESULT = new LeafNode(t); :} BRANCH LPAREN BinTree:left COMMA BinTree:right RPAREN {: RESULT = new BranchNode(left, right); :} ;

Fil Parser.cup: import java_cup.runtime.*; Binära träd i Cup // Deklarera slut-symboler terminal BRANCH; terminal LEAF; terminal LPAREN; terminal RPAREN; terminal COMMA; terminal Integer NUM; // Ett tal har data av typen Integer // Deklarera icke-slutsymboler, bara en i det här fallet non terminal ParseTree BinTree; // Har data av typen ParseTree BinTree ::= LEAF LPAREN NUM:t RPAREN {: RESULT = new LeafNode(t); :} BRANCH LPAREN BinTree:left COMMA BinTree:right RPAREN {: RESULT = new BranchNode(left, right); :} ; Kör cup -parser Parser Parser.cup, genererar Parser.java och sym.java

Fil Lexer.lex: Lexikal analys för binära träd i JFlex import java.lang.system; import java_cup.runtime.symbol; %% %cup %class Lexer %% branch { return new Symbol(sym.BRANCH); } leaf { return new Symbol(sym.LEAF); } "(" { return new Symbol(sym.LPAREN); } ")" { return new Symbol(sym.RPAREN); }, { return new Symbol(sym.COMMA); } [0-9]+ { return new Symbol(sym.NUM, Integer.parseInt(yytext())); } [ \t\n] { }

Fil Lexer.lex: Lexikal analys för binära träd i JFlex import java.lang.system; import java_cup.runtime.symbol; %% %cup %class Lexer %% branch { return new Symbol(sym.BRANCH); } leaf { return new Symbol(sym.LEAF); } "(" { return new Symbol(sym.LPAREN); } ")" { return new Symbol(sym.RPAREN); }, { return new Symbol(sym.COMMA); } [0-9]+ { return new Symbol(sym.NUM, Integer.parseInt(yytext())); } [ \t\n] { }

Fil Lexer.lex: Lexikal analys för binära träd i JFlex import java.lang.system; import java_cup.runtime.symbol; %% %cup %class Lexer Slutsymbolsnamnen från Parser.cup %% branch { return new Symbol(sym.BRANCH); } leaf { return new Symbol(sym.LEAF); } "(" { return new Symbol(sym.LPAREN); } ")" { return new Symbol(sym.RPAREN); }, { return new Symbol(sym.COMMA); } [0-9]+ { return new Symbol(sym.NUM, Integer.parseInt(yytext())); } [ \t\n] { }

Fil Lexer.lex: Lexikal analys för binära träd i JFlex import java.lang.system; import java_cup.runtime.symbol; %% %cup %class Lexer Slutsymbolsnamnen från Parser.cup %% branch { return new Symbol(sym.BRANCH); } leaf { return new Symbol(sym.LEAF); } "(" { return new Symbol(sym.LPAREN); } ")" { return new Symbol(sym.RPAREN); }, { return new Symbol(sym.COMMA); } [0-9]+ { return new Symbol(sym.NUM, Integer.parseInt(yytext())); } [ \t\n] { } Kör jflex Lexer.lex, genererar Lexer.java

Fil Lexer.lex: Lexikal analys för binära träd i JFlex import java.lang.system; import java_cup.runtime.symbol; %% %cup %class Lexer Slutsymbolsnamnen från Parser.cup %% branch { return new Symbol(sym.BRANCH); } leaf { return new Symbol(sym.LEAF); } "(" { return new Symbol(sym.LPAREN); } ")" { return new Symbol(sym.RPAREN); }, { return new Symbol(sym.COMMA); } [0-9]+ { return new Symbol(sym.NUM, Integer.parseInt(yytext())); } [ \t\n] { } Kör jflex Lexer.lex, genererar Lexer.java Fullständigt exempel med Main-klass upplagt på kurshemsidan

Idag Rekursiv medåkning, fortsättning Olika klasser av språk och grammatiker Parsergeneratorer Sammanfattning / Inför KS

Sammanfattning Formella språk Språkklasser (ex. reguljära språk) Informella språkbeskrivningar (ex. alla e-post-adresser ) Formella språkbeskrivningar/algoritmer (ex. automater, reguljära uttryck) Reguljära språk Reguljära uttryck och DFA Skillnad mellan reguljära språk och regex Begränsningar (språk som inte är reguljära) Kontextfria språk Kontextfria grammatiker Stackautomater, PDA Härledningar/syntaxträd Tvetydighet Lexikal analys Rekursiv medåkning

Förkortningar DFA Deterministic Finite Automaton, ändlig automat. Den enklaste typen av automat, lika uttrycksfull som reguljära uttryck. PDA Push-Down Automaton, stackautomat. Som DFA fast med oändligt stort minne i form av en stack. LL Left-to-right Leftmost-derivation. LL-parser: läser strängen vänster till höger och expanderar icke-slutsymboler från vänster till höger. LL-grammatik: grammatik som kan parsas av LL-parser

Perspektiv igen Alla språk Avgörbara språk (existerar algoritm för att känna igen dem) Kontextkänsliga språk (kan beskrivas med kontextkänslig grammatik) Kontextfria språk (kan beskrivas med kontextfri grammatik) Deterministiska kontextfria språk (kan parsas med stackautomat, PDA) LL-språk (kan parsas med rekursiv medåkning) Reguljära språk

Perspektiv igen Alla språk Avgörbara språk (existerar algoritm för att känna igen dem) Kontextkänsliga språk (kan beskrivas med kontextkänslig grammatik) Kontextfria språk (kan beskrivas med kontextfri grammatik) Deterministiska kontextfria språk (kan parsas med stackautomat, PDA) LL-språk (kan parsas med rekursiv medåkning) Reguljära språk Vad vi har pratat om / Vad som ingår i kursavsnittet

Vad plugga på? KS/Tenta kommer inte ta upp något som jag inte pratat om på någon av föreläsningarna. KS samt tentorna från förra året är någorlunda representativa. Jag har under Kursmaterial på hemsidan lagt upp länkar till föreläsningsvideos från en del liknande kurser, samt lite annat material, som man kan titta på.

Typiska KS-uppgifter Grundläggande relationer mellan olika saker, vilka sätt att beskriva språk som är mer eller mindre kraftfulla, etc

Typiska KS-uppgifter Grundläggande relationer mellan olika saker, vilka sätt att beskriva språk som är mer eller mindre kraftfulla, etc Givet en DFA/PDA och en sträng förklara vad automaten gör med strängen som indata

Typiska KS-uppgifter Grundläggande relationer mellan olika saker, vilka sätt att beskriva språk som är mer eller mindre kraftfulla, etc Givet en DFA/PDA och en sträng förklara vad automaten gör med strängen som indata Givet en grammatik och en sträng, konstruera ett syntaxträd / avgör om det finns flera syntaxträd / etc

Typiska KS-uppgifter Grundläggande relationer mellan olika saker, vilka sätt att beskriva språk som är mer eller mindre kraftfulla, etc Givet en DFA/PDA och en sträng förklara vad automaten gör med strängen som indata Givet en grammatik och en sträng, konstruera ett syntaxträd / avgör om det finns flera syntaxträd / etc Skriv ett reguljärt uttryck/kontextfri grammatik eller konstruera en DFA för ett givet språk

Fortsättningskurser DD1352 Algoritmer, datastrukturer och komplexitet Mer om de högre nivåerna i språkhierarkin DD2372 Automater och språk Mer på djupet om automater och formella språk. DD2488 Kompilatorkonstruktion Skriv en hel kompilator! DD2418 Språkteknologi Naturlig språkbehandling, inriktad mot text. ID2202 Kompilatorer och exekveringsmiljöer Tekniker för implementation av programspråk. (Ges i Kista)

För den som vill läsa mer Aho, Sethi, Ullman: Compilers: Principles, Techniqes and Tools

Lycka till på kontrollskrivningen!