1 2 3 4
play

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


  1. 1

  2. 2 ∗ 3+4 2

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

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

  5. 5

  6. 6

  7. 7

  8. ⟨ ⟩ ⟨ ⟩ ⟨ ⟩ ⋯ ⟨ ⟩ ⟨ ⟩⟨ ⟩ ⟨ ⟩ ⟨ ⟩⟨ ⟩ ⋮ ⟨ ⟩ ⟨⟨ ⟩ ⟩⟨ ⟩ ⟨ ⟩ ⋯ 8

  9. ● ⟨ ⟩ ⟨ ⟩ ● ○ ⟨ ⟩⟨ ⟩ ○ ● 9

  10. ● ⟨ ⟩ ⟨ ⟩ ● ○ ⟨ ⟩⟨ ⟩ ○ ● 10

  11. symbolDot :: Parser Char :: String -> [(Char, String)] :: [Char] -> [(Char, [Char])] symbolDot (x:xs) | (x == ‘.’) = [(x, xs)] | otherwise = [] *Main> symbolDot “.com” [(‘.’, “com”)] 11

  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")] 12

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

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

  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")] 15

  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")] 16

  17. 17

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

  19. ● ● ← ● 19

  20. ● > parse p "abcdef" [((’a’,’c’),"def")] > parse p "ab" [] ● 20

  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")] 21

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

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

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

  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” [] 25

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

  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;")] 27

  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","")] 28

  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" [] 29

  30. 30

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

  32. → ฀ → ฀ → ฀ → ฀ … ฀ ฀ 32

  33. → ฀ ε → ฀ ε ε 33

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

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

  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 36

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend