Samenvatting hst. 3 sec. 1-3 ( ) :: Parser a b  Parser a b  Parser a b ( ) :: Parser a (b  c)  Parser a b  Parser a c ( ) :: (b  c)  Parser a b.

Slides:



Advertisements
Verwante presentaties

Advertisements

PHP & MYSQL LES 03 PHP & DATABASES. PHP & MYSQL 01 PHP BASICS 02 PHP & FORMULIEREN 03 PHP & DATABASES 04 CMS: BEST PRACTICE.
Lijsten in de -calculus Een lijst [E 1, E 2,..., E n ] kan in de -calculus voorgesteld worden als z.((z E 1 ) z.((z E 2 )... z.((z E n ) nil)...) met nil.
Uitwerking tentamen Functioneel Programmeren 29 januari 2009.
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - -
PROS2 Les 11 Programmeren en Software Engineering 2.
Het selecteren van data uit meerdere gekoppelde tabellen
Hogere-ordefuncties nEen lijst langs lopen en met elk element iets doen nEen lijst langs lopen en sommige elementen selecteren map filter.
Reductiemachine Functionele talen en dus de -calculus, worden vaak geïmplementeerd door een reductiemachine. De elementaire stap is een reductie, en de.
‘Inleiding programmeren in Java’ SWI cursus: ‘Inleiding programmeren in Java’ 4e college Woe 19 januari 2000 drs. F. de Vries.

Polymorf zoeken zoek :: (a  a  Bool)  [ (a, b) ]  a  b zoek eq [ ] x = ??? zoek eq ((a,b):ts) x | eq a x = b | otherwise = zoek eq ts x MayBe b No.
Elke 7 seconden een nieuw getal
Grammatica’s en Ontleden
Hogere-orde functies: herhaald patroon? Parametrizeer! product :: [Int]  Int product [ ]= product (x:xs)= 1 product xs x * and :: [Bool]  Bool and [
Functies op Proposities evalueer:: Bedeling  Prop  Bool tautologie:: Prop  Bool contradictie:: Prop  Bool equivalentie:: Prop  Prop  Bool vervulbaar::
Hoger-ordefuncties op lijsten nDoorloop een lijst en... map :: (a  b)  [a]  [b] filter :: (a  Bool)  [a]  [a] foldr :: (a  a  a)  a  [a]  a.
Tijd en aspect in DRT: een eerste set regels
Download en installeer de gereedschappen
Hogeschool van Amsterdam - Interactieve Media – Internet Development – Jochem Meuwese - -
Opdrachten Snelheid.
Opdrachten Snelheid.
AI91  Het Probleem  Grammatica’s  Transitie netwerken Leeswijzer: Hoofdstuk AI Kaleidoscoop College 9: Natuurlijke taal.
Functies als Getallen Jan Martin Jansen.
Numerieke Natuurkunde
-calculus.
MICPRG Les 11 Microcontroller Programmeren in C. 112 Datastructuren in C Werkgeheugen (PC en microcontroller): Statische datastructuren (vaste grootte):
Functies definiëren nDoor combinatie van standaardfuncties fac :: Int  Int fac n = product [1..n] oneven :: Int  Bool oneven n = not (even n) negatief.
Char en String nCharéén letter uord ::Char  Int uchr ::Int  Char nString[Char] uwords :: String  [String] uunwords :: [String]  String ”hoi” ”CKI”
Hogere-ordefuncties nVoeg de elementen van een lijst samen nCombineer twee functies foldr :: (a  b  b)  b  [a]  b [a] (.) :: (b  c)  (a  b)  a.
Reguliere talen nReguliere grammatica: versimpelde Contextvrije grammatica nFinite-state Automaton: andere manier om een taal te beschrijven nReguliere.
Imperatief programmeren nProgramma bestaat uit nRunnen is opdrachten gegroepeerd in methoden één voor één uitvoeren te beginnen met main.
Zelfgemaakt datatype voor bomen nMet functies data Tree a = Bin (Tree a) (Tree a) | Leaf a foldTree :: Tree a  b foldTree (b,lf) (Bin le ri) = b (foldTree.
Hoofdstuk Strings en arrays. Primitieve types nint gehele getallen-17, -5, 0, 3, 178 ndouble reëele getallen3.141, 2.0, -1.5E8 nbool waarheidswaarden.
Ontleden nNon-deterministisch m.b.v. Parser-combinators nDeterministisch m.b.v. Stack-machine type Parser a b = [a]  [ (b, [a]) ] type Parser a b = [a]
Functioneel Programmeren Daan Leijen. Wat gaan we doen? 3 fundamentele principes van computatie Equationeel redeneren IO-monad GUI's in Haskell (wxHaskell)
CONTROLESTRUCTUREN (DEEL 1)
Algoritmiek Object-georiënteerd Programmeren
Algoritmiek Dataweergave en bewerking Hoorcollege 2 - Ma. 11 sept L.M. Bosveld-de Smet.
Hoofdstuk 3: Inleiding tot Java Applets
ANother Tool for Language Recognition
Vergelijkingen oplossen.
Hoofdstuk 9 havo KWADRATEN EN LETTERS
Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 3: Werken met numerieke gegevens.
Taal nEen Alfabet is… een eindige verzameling symbolen nEen Taal is… een deelverzameling van T* bij een bepaald alfabet T nEen Zin is… een element van.
Sparkle een bewijssysteem voor Clean Maarten de Mol Katholieke Universiteit Nijmegen 11 januari 2002.
Reguliere talen nReguliere grammatica: versimpelde Contextvrije grammatica nFinite-state Automaton: andere manier om een taal te beschrijven nReguliere.
SQL ( SERVER ) Les #02: T-SQL. A GENDA Herhaling les 4 Views SELECT…INTO Beheren van tabellen: CREATE ALTER DROP Opdracht voor de volgende les.
Tircms03-p les 7 Standaardfuncties. In header opnemen bijv: using namespace std // C++ // oude C.
DU2PRES1 : C vervolg Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 1 Arrays en pointers lichtkrant op het ARM bordje.
Tentamen vraag 1 Als L en M talen zijn, dan nL  M is gelijk aan { s  t | s  L, t  M } nL M is gelijk aan { s t | s  L, t  M } nL n is gelijk aan.
Parsing 1. Situering Contextvrije grammatica’s Predictive (of recursive-descent) parsing LR-parsing Parser generator: Yacc Error recovery 2.
tircms02-p les 1 Operating Systems practicum
PROGRAMMEREN LOGISCH en FUNCTIONEEL Ik zeg wat ik denk!
Functioneel programmeren Een snelle herhaling…. Functie-definitie static int kwad (int x) { return x*x ; } kwad x = x * x Haskell kwad :: Int  Int.
Definitie LL(1) Een grammatica is LL(1) nAls je op grond van het eerstvolgende input-symbool kunt kiezen uit alternatieven Formeel: nAls de lookahead-sets.
Vervolg C Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 1 Onderwerpen voor vandaag top-down decompositie Opdrachten:
Instructie Programmeren Task 3 5JJ70. Task 3.1: MIPS Rating Volg de beschrijving in de opdracht om het aantal assembly instructies in de loop uit te vinden.
Definitie Taal van een grammatica nZij grammatica G = ( T, N, R, S ) nde taal van G is { z  T* | S  * z } L(G)
Tentamen vraag 1 nElke reguliere zin is ook contextvrij nElke reguliere taal is ook contextvrij nElke contextvrije grammatica is ook regulier nonsens “regulier”
eval (Add x y) = add (eval x) (eval y)
Recursie in de wiskunde
Hoofdstuk 9.2 Strings.
Gameprogrammeren: Expressies
Tinpro015b-les 1 C++ voor C-kenners Voor Technische Informatica.
Gehele getallen optellen en aftrekken
Natuurlijke, gehele en rationale getallen
Software Development fundamentals
Gameprogrammeren: Arrays
Transcript van de presentatie:

Samenvatting hst. 3 sec. 1-3 ( ) :: Parser a b  Parser a b  Parser a b ( ) :: Parser a (b  c)  Parser a b  Parser a c ( ) :: (b  c)  Parser a b  Parser a c (p q) xs = p xs ++ q xs (p q) xs = [(f b,zs) | (f,ys)  p xs, (b,zs)  q ys] (f p) xs = [(f b,ys) | (b,ys)  p xs] infixl 6 infixl 7 infixr 4

Toepassing: geneste haakjes nGrammatican Abstracte syntax { H  , H  ( H ) H } data H =Leeg |Paar H H haakjes :: Parser Char H nParser haakjes = epsilon open haakjes sluit haakjes where open = symbol ’(’ sluit = symbol ’)’ (\x  Leeg) (\a b c d  Paar b d)

Samenvatting hst. 3 sec. 4 nParser combinators voor EBNF nNog wat extra utilities many :: Parser a b  Parser a [b] many1 :: Parser a b  Parser a [b] option :: Parser a b  b  Parser a b pack :: Parser a o  Parser a b  Parser a s  Parser a b sequence :: [ Parser a b ]  Parser a [b] choice :: [ Parser a b ]  Parser a b listOf :: Parser a b  Parser a s  Parser a [b] chainr :: Parser a b  Parser a (b  b  b)  Parser a b

Abstracte syntax voor Expressies data Expr =ConInt |VarString |FunString [Expr] |Expr :+: Expr |Expr :–: Expr |Expr :*: Expr |Expr :/: Expr

Parser voor Expressies (met prioriteiten) expr= chainr term (symbol ‘+’) term= chainr fact (symbol ‘*’) fact= getal gehaakt expr (\o  (:+:)) (\o  (:*:)) Con ( (\o  (:–:)) (symbol ‘–’) ) ( (\o  (:/:)) (symbol ‘/’) ) Var naam Fun naam gehaakt (listOf expr (symbol ‘,’) ) chainl is nu beter

Parser voor Expressies (principe) expr= chainr term(… (:+:)…‘+’ … … (:–:)…‘–’ … ) term= chainr fact(… (:*:)…‘*’ … … (:/:)…‘/’ … ) fact= basis gehaakt expr gen ops next = chainr next ( choice …ops… )

Parser voor Expressies (veel prioriteiten) expr= gen ops1 term1 term1= gen ops2 term2 term2= gen ops3 term3 term3= gen ops4 term4 term4= gen ops5 fact fact= basis gehaakt expr expr = foldr gen fact [ops1,ops2,ops3,ops4,ops5] gen ops next = chainr next ( choice …ops… )

Gebruik van parsers nType van parsers nParser voor expressies nOpstarten van de parser type Parser a b = [a]  [ (b, [a]) ] expr :: Parser Char Expr geefExpr :: String  Expr expr :: String  [ (Expr, String) ] geefExpr =exprfilter (null.snd).head.fst.

Gebruik van parsers nGeneralisatie geefExpr :: String  Expr geefExpr =exprfilter (null.snd).head. start :: Parser a b  [a]  b start p =pfilter (null.snd).head. fst.

Ontwerp van een parser nObserveer de taal nBedenk een grammatica uevt. transformeren nMaak datatype voor de ontleedboom nMaak parse-functie uevt. met preprocessor nVoeg semantiek toe uof: als functie op ontleedboom uof: direct tijdens het parsen

Parser-ontwerp (1/5) Observeer de taal nVoorbeeld: reisschema’s Groningen 8:37 9:44 Zwolle 9:49 10:15 Utrecht 10:21 11:05 Rotterdam Utrecht 9:17 9:42 Amsterdam vertrekaankomst Almelo

Parser-ontwerp (2a/5) Bedenk een grammatica Groningen 8:37 9:44 Zwolle 9:49 10:15 Utrecht 10:21 11:05 Rotterdam Schema  Schema Tijd Tijd Schema | Stad Tijd  Getal : Getal Getal  Cijfer + Stad  Letter +

Parser-ontwerp (2b/5) Bedenk een grammatica Groningen 8:37 9:44 Zwolle 9:49 10:15 Utrecht 10:21 11:05 Rotterdam Schema  Stad Tijd Overstap* Tijd Stad | Stad Overstap  Tijd Stad Tijd

Parser-ontwerp (2c/5) Bedenk een grammatica Groningen 8:37 9:44 Zwolle 9:49 10:15 Utrecht 10:21 11:05 Rotterdam Schema  Stad Rit* Rit  Tijd Tijd Stad

Parser-ontwerp (2d/5) Bedenk een grammatica Groningen 8:37 9:44 Zwolle 9:49 10:15 Utrecht 10:21 11:05 Rotterdam Schema  Rit’* Stad Rit’  Stad Tijd Tijd

Parser-ontwerp (3b/5) Maak datatype ontleedboom Schema  Stad Tijd Overstap* Tijd Stad | Stad Overstap  Tijd Stad Tijd data Schema = Met Stad Tijd [Overstap] Tijd Stad | Zonder Stad type Overstap = ( Tijd, Stad, Tijd )

Parser-ontwerp (3d/5) Maak datatype ontleedboom Schema  Rit* Stad Rit  Stad Tijd Tijd type Schema’ = ( [Rit], Stad) type Rit = ( Stad, Tijd, Tijd ) type Tijd = ( Int, Int ) type Stad = String

Parser-ontwerp (4b/5) Maak parse-functie Schema  Stad Tijd Overstap* Tijd Stad | Stad Overstap  Tijd Stad Tijd schema = stad tijd many overstap tijd stad stad overstap = tijd stad tijd tijd = getal symbol ‘:’ getal Met Zonder (\t1 s t2  (t1,s,t2)) (\n1 d n2  (n1,n2))

Parser-ontwerp (4d/5) Maak parse-functie Schema  Rit* Stad Rit  Stad Tijd Tijd schema’ = many rit stad rit = stad tijd tijd (\rs s  (rs,s)) (\s t1 t2  (s,t1,t2))

Parser-ontwerp (5/5) Voeg semantiek toe nBijvoorbeeld: uWachttijd uTotale reistijd uLijst van stations min :: Tijd  Int min (u,m) = 60*u + m wachttijd, reistijd :: Schema  Int stations :: Schema  [String]

Semantische functies data Schema = Met Stad Tijd [Overstap] Tijd Stad | Zonder Stad type Overstap = ( Tijd, Stad, Tijd ) wacht (Zonder _) = 0 wacht (Met _ _ os _ _) = sum (map f os) where f (t1,_,t2) = min t2 – min t1 stats (Zonder s) = [s] stats (Met s1 _ os _ s2) = s1 : map f os ++ [s2] where f (_,s,_) = s reis = … Oei… lastig!

Alternatieve Semantische functies type Schema’ = ( [Rit], Stad) type Rit = ( Stad, Tijd, Tijd ) reis’ (rs,_) = sum (map f rs) where f (s,t1,t2) = min t2 – min t1 stats’ (rs,s) = map f rs ++ [s] where f (s,_,_) = s wacht’ = … Oei… lastig!

Ontleedboom bepalen tijdens het ontleden schema’ :: Parser String Schema’ schema’ = many rit stad rit :: Parser String Rit rit = stad tijd tijd (\rs s  (rs,s)) (\s t1 t2  (s,t1,t2))

Semantiek bepalen tijdens het ontleden schemaReis’ :: Parser String Int schemaReis’ = many ritReis stad ritReis :: Parser String Int ritReis = stad tijd tijd (\ns s  sum ns) (\s t1 t2  min t2 – min t1)

Ontwerp van een parser nObserveer de taal nBedenk een grammatica uevt. transformeren nMaak datatype voor de ontleedboom nMaak parse-functie uevt. met preprocessor nVoeg semantiek toe uof: als functie op ontleedboom uof: direct tijdes het parsen

De basis-parsers many1 :: Parser a b  Parser a [b] naam :: Parser Char String naam = many1 (satisfy isAlpha) getal :: Parser Char Int getal = many (satisfy isDigit) foldl f 0 where f n c = 10*n + ord c – ord ‘0’

Publieksvraag nObserveer de taal van floating-point getallen in standaard programmeertalen 3.141e6-5F E23 float :: Parser Char Float float =

Uitwerking cijfer :: Parser Char Int cijfer = satisfy isDigit (\c  ord c–ord’0’) natuurlijk :: Parser Char Int natuurlijk = many cijfer (foldl (\n d  10*n+d) 0) fractie :: Parser Char Float fractie = many cijfer (foldr (\d n  (n+d)/10) 0) geheel :: Parser Char Int geheel = option ( symbol ‘–’) natuurlijk (\c  neg) id apply eigenlijk moet fromIntegral :: Int  Float nog worden gebruikt

Uitwerking (vervolg) fixed :: Parser Char Float fixed = geheel option( symbol ‘.’ fractie ) (\p x  x) 0 (+) float :: Parser Char Float float = fixed option( symbol ‘E’ geheel ) (\p x  x) 0 f where f gr ex = gr * pow 10 ex fromIntegral