1 2 3+4 2 type Parser = String Tree type Parser = String ( Tree, - - PowerPoint PPT Presentation

1 2 3 4
SMART_READER_LITE
LIVE PREVIEW

1 2 3+4 2 type Parser = String Tree type Parser = String ( Tree, - - PowerPoint PPT Presentation

1 2 3+4 2 type Parser = String Tree type Parser = String ( Tree, String) type Parser = String [ (Tree,String) ] 3 type Parser res = String [(res,String)] type TokenParser symb res = [symb] [(res,[symb])] 4 5 6 7


slide-1
SLIDE 1

1

slide-2
SLIDE 2

2

2∗3+4

slide-3
SLIDE 3

3

type Parser = String → Tree type Parser = String → (Tree,String) type Parser = String → [(Tree,String)]

slide-4
SLIDE 4

4

type Parser res = String → [(res,String)] type TokenParser symb res = [symb] → [(res,[symb])]

slide-5
SLIDE 5

5

slide-6
SLIDE 6

6

slide-7
SLIDE 7

7

slide-8
SLIDE 8

8

⟨ ⟩ ⟨ ⟩ ⋯ ⟨ ⟩ ⟨ ⟩⟨ ⟩ ⟨ ⟩ ⟨⟨ ⟩ ⟩⟨ ⟩ ⟨ ⟩ ⋯ ⟨ ⟩ ⟨ ⟩ ⟨ ⟩⟨ ⟩ ⋮

slide-9
SLIDE 9

9

⟩ ⟨ ⟩ ⟨ ⟩⟨ ⟩

slide-10
SLIDE 10

10

⟩ ⟨ ⟩ ⟨ ⟩⟨ ⟩

slide-11
SLIDE 11

11

symbolDot :: Parser Char :: String -> [(Char, String)] :: [Char] -> [(Char, [Char])] symbolDot (x:xs) | (x == ‘.’) = [(x, xs)] | otherwise = []

*Main> symbolDot “.com” [(‘.’, “com”)]

slide-12
SLIDE 12

12

item :: Parser Char :: String -> [(Char, String)] :: [Char] -> [(Char, [Char])] item = \inp -> case inp of [] -> [] (x:xs) -> [(x,xs)]

*Main> item "parse this" [('p',"arse this")]

slide-13
SLIDE 13

13

failure :: Parser a failure = \inp -> [] return :: a -> Parser a return v = \inp -> [(v,inp)] *Main> Main.return 7 "parse this" [(7,"parse this")] *Main> failure "parse this" []

slide-14
SLIDE 14

14

parse :: Parser a → String → [(a,String)] parse p inp = p inp –- essentially id function *Main> parse item "parse this" [('p',"arse this")]

slide-15
SLIDE 15

15

(+++) :: Parser a -> Parser a -> Parser a p +++ q = \inp -> case p inp of [] -> parse q inp [(v,out)] -> [(v,out)] *Main> parse failure "abc" [] *Main> parse (failure +++ item) "abc" [('a',"bc")]

slide-16
SLIDE 16

16

> parse item "" [] > parse item "abc" [('a',"bc")] > parse failure "abc" [] > parse (return 1) "abc" [(1,"abc")] > parse (item +++ return 'd') "abc" [('a',"bc")] > parse (failure +++ return 'd') "abc" [('d',"abc")]

slide-17
SLIDE 17

17

slide-18
SLIDE 18

18

⟨ ⟩

if (⟨

⟩) then ⟨ ⟩

if (

⟨ ⟩ … p :: Parser (Char,Char) p = do x ← item item y ← item return (x,y)

slide-19
SLIDE 19

19

slide-20
SLIDE 20

20

  • > parse p "abcdef"

[((’a’,’c’),"def")] > parse p "ab" []

slide-21
SLIDE 21

21

(>>=) :: Parser a -> (a -> Parser b) -> Parser b p >>= f = \inp -> case parse p inp of [] -> [] [(v, out)] -> parse (f v) out p >>= f

  • > parse ((failure +++ item) >>= (\_ -> item)) "abc"

[('b',"c")]

slide-22
SLIDE 22

22

p1 >>= \v1 -> p2 >>= \v2 -> . . . pn >>= \vn -> return (f v1 v2 . . . vn) do v1 <- p1 v2 <- p2 . . . vn <- pn return (f v1 v2 . . . vn) vi vi <- pi pi >>= \_ -> ...

slide-23
SLIDE 23

23

rev3 = do v1 <- item v2 <- item item v3 <- item return $ reverse (v1:v2:v3:[]) rev3 = item >>= \v1 -> item >>= \v2 -> item >>= \_ -> item >>= \v3 -> return $ reverse (v1:v2:v3:[]) > rev3 “abcdef” [(“dba”,”ef”)] > (rev3 >>= (\_ -> item)) “abcde” [(‘e’,””)] > (rev3 >>= (\_ -> item)) “abcd” []

slide-24
SLIDE 24

24

parse (item >>= (\x -> item >>= (\y -> return (y:[x])))) “ab” [(“ba”,””)]

slide-25
SLIDE 25

25

sat :: (Char -> Bool) -> Parser Char sat p = do x <- item if p x then return x else failure > parse (sat (==‘a’)) “abc” [(‘a’,”bc”)] > parse (sat (==‘b’)) “abc” [] > parse (sat isLower) “abc” [(‘a’,”bc”)] > parse (sat isUpper) “abc” []

slide-26
SLIDE 26

26

digit, letter, alphanum :: Parser Char digit = sat isDigit letter = sat isAlpha alphanum = sat isAlphaNum lower, upper :: Parser Char lower = sat isLower upper = sat isUpper char :: Char → Parser Char char x = sat (== x)

sat

slide-27
SLIDE 27

27

string :: String -> Parser String string [] = return [] string (x:xs) = do char x string xs return (x:xs) > parse (string "if [") "if (a<b) return;" [] > parse (string "if (") "if (a<b) return;" [("if (","a<b) return;")]

slide-28
SLIDE 28

28

many :: Parser a -> Parser [a] many p = many1 p +++ return [] many1 :: Parser a -> Parser [a] many1 p = do v <- p vs <- many p return (v:vs) > parse (many digit) "123ab" [("123","ab")] > parse (many digit) "ab123ab" [("","ab123ab")] > parse (many alphanum) "ab123ab" [("ab123ab","")]

slide-29
SLIDE 29

29

p :: Parser String p = do char '[' d ← digit ds ← many (do char ',' digit) char ']' return (d:ds) > parse p "[1,2,3,4]" [("1234","")] > parse p "[1,2,3,4" []

slide-30
SLIDE 30

30

slide-31
SLIDE 31

31

space :: Parser () space = many (sat isSpace) >> return () token :: Parser a -> Parser a token p = space >> p >>= \v -> space >> return v identifier :: Parser String identifier = token ident ident :: Parser String ident = sat isLower >>= \x -> many (sat isAlphaNum) >>= \xs -> return (x:xs)

slide-32
SLIDE 32

32

→ ฀ → ฀ → ฀ → ฀ ฀ … ฀

slide-33
SLIDE 33

33

→ ฀ ε → ฀ ε ε

slide-34
SLIDE 34

34

expr :: Parser Int expr = do t ← term do char '+' e ← expr return (t + e) +++ return t

slide-35
SLIDE 35

35

factor :: Parser Int factor = do d ← digit return (digitToInt d) +++ do char '(' e ← expr char ')' return e term :: Parser Int term = do f ← factor do char '*' t ← term return (f * t) +++ return f

slide-36
SLIDE 36

36

eval :: String → Int eval xs = fst (head (parse expr xs)) > eval "2*3+4" 10 > eval "2*(3+4)" 14 > eval "2+5-" 7 > eval "+5-" *** Exception: Prelude.head: empty list