36
1

2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char digit = sat isDigit letter = sat isAlpha alphanum = sat isAlphaNum lower, upper

  • Upload
    others

  • View
    7

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char digit = sat isDigit letter = sat isAlpha alphanum = sat isAlphaNum lower, upper

1

Page 2: 2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char digit = sat isDigit letter = sat isAlpha alphanum = sat isAlphaNum lower, upper

2

2∗3+4

Page 3: 2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char digit = sat isDigit letter = sat isAlpha alphanum = sat isAlphaNum lower, upper

3

type Parser = String → Tree

type Parser = String → (Tree,String)

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

Page 4: 2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char digit = sat isDigit letter = sat isAlpha alphanum = sat isAlphaNum lower, upper

4

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

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

Page 5: 2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char digit = sat isDigit letter = sat isAlpha alphanum = sat isAlphaNum lower, upper

5

Page 6: 2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char digit = sat isDigit letter = sat isAlpha alphanum = sat isAlphaNum lower, upper

6

Page 7: 2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char digit = sat isDigit letter = sat isAlpha alphanum = sat isAlphaNum lower, upper

7

Page 8: 2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char digit = sat isDigit letter = sat isAlpha alphanum = sat isAlphaNum lower, upper

8

⟨ ⟩⟨ ⟩ ⋯⟨ ⟩ ⟨ ⟩⟨ ⟩⟨ ⟩ ⟨⟨ ⟩ ⟩⟨ ⟩⟨ ⟩ ⋯

⟨ ⟩⟨ ⟩ ⟨ ⟩⟨ ⟩⋮

Page 9: 2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char digit = sat isDigit letter = sat isAlpha alphanum = sat isAlphaNum lower, upper

9

⟨ ⟩ ⟨ ⟩

⟨ ⟩⟨ ⟩

Page 10: 2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char digit = sat isDigit letter = sat isAlpha alphanum = sat isAlphaNum lower, upper

10

⟨ ⟩ ⟨ ⟩

⟨ ⟩⟨ ⟩

Page 11: 2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char digit = sat isDigit letter = sat isAlpha alphanum = sat isAlphaNum lower, upper

11

symbolDot :: Parser Char

:: String -> [(Char, String)]

:: [Char] -> [(Char, [Char])]

symbolDot (x:xs) | (x == ‘.’) = [(x, xs)]

| otherwise = []

*Main> symbolDot “.com”

[(‘.’, “com”)]

Page 12: 2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char digit = sat isDigit letter = sat isAlpha alphanum = sat isAlphaNum lower, upper

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

Page 13: 2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char digit = sat isDigit letter = sat isAlpha alphanum = sat isAlphaNum lower, upper

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"

[]

Page 14: 2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char digit = sat isDigit letter = sat isAlpha alphanum = sat isAlphaNum lower, upper

14

parse :: Parser a → String → [(a,String)]

parse p inp = p inp –- essentially id function

*Main> parse item "parse this"

[('p',"arse this")]

Page 15: 2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char digit = sat isDigit letter = sat isAlpha alphanum = sat isAlphaNum lower, upper

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

Page 16: 2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char digit = sat isDigit letter = sat isAlpha alphanum = sat isAlphaNum lower, upper

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

Page 17: 2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char digit = sat isDigit letter = sat isAlpha alphanum = sat isAlphaNum lower, upper

17

Page 18: 2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char digit = sat isDigit letter = sat isAlpha alphanum = sat isAlphaNum lower, upper

18

⟨ ⟩ if (⟨ ⟩) then ⟨ ⟩ if ( ⟨ ⟩ …

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

Page 19: 2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char digit = sat isDigit letter = sat isAlpha alphanum = sat isAlphaNum lower, upper

19

Page 20: 2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char digit = sat isDigit letter = sat isAlpha alphanum = sat isAlphaNum lower, upper

20

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

> parse p "ab"[]

Page 21: 2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char digit = sat isDigit letter = sat isAlpha alphanum = sat isAlphaNum lower, upper

21

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

p >>= f

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

[('b',"c")]

Page 22: 2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char digit = sat isDigit letter = sat isAlpha alphanum = sat isAlphaNum lower, upper

22

p1 >>= \v1 ->p2 >>= \v2 ->. . .pn >>= \vn ->return (f v1 v2 . . . vn)

do v1 <- p1 v2 <- p2. . . vn <- pnreturn (f v1 v2 . . . vn)

vi vi <- pi

pi >>= \_ -> ...

Page 23: 2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char digit = sat isDigit letter = sat isAlpha alphanum = sat isAlphaNum lower, upper

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

Page 24: 2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char digit = sat isDigit letter = sat isAlpha alphanum = sat isAlphaNum lower, upper

24

parse (item >>= (\x ->

item >>= (\y ->

return (y:[x])))) “ab”

[(“ba”,””)]

Page 25: 2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char digit = sat isDigit letter = sat isAlpha alphanum = sat isAlphaNum lower, upper

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”

[]

Page 26: 2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char digit = sat isDigit letter = sat isAlpha alphanum = sat isAlphaNum lower, upper

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

Page 27: 2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char digit = sat isDigit letter = sat isAlpha alphanum = sat isAlphaNum lower, upper

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

Page 28: 2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char digit = sat isDigit letter = sat isAlpha alphanum = sat isAlphaNum lower, upper

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

Page 29: 2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char digit = sat isDigit letter = sat isAlpha alphanum = sat isAlphaNum lower, upper

29

p :: Parser Stringp = 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"[]

Page 30: 2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char digit = sat isDigit letter = sat isAlpha alphanum = sat isAlphaNum lower, upper

30

Page 31: 2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char digit = sat isDigit letter = sat isAlpha alphanum = sat isAlphaNum lower, upper

31

space :: Parser ()space = many (sat isSpace) >> return ()

token :: Parser a -> Parser atoken p = space >> p >>= \v -> space >> return v

identifier :: Parser Stringidentifier = token ident

ident :: Parser Stringident = sat isLower >>= \x -> many (sat isAlphaNum) >>= \xs -> return (x:xs)

Page 32: 2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char digit = sat isDigit letter = sat isAlpha alphanum = sat isAlphaNum lower, upper

32

→ �→ �→ �→ � �…�

Page 33: 2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char digit = sat isDigit letter = sat isAlpha alphanum = sat isAlphaNum lower, upper

33

→ � ε→ � ε

ε

Page 34: 2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char digit = sat isDigit letter = sat isAlpha alphanum = sat isAlphaNum lower, upper

34

expr :: Parser Int

expr = do t ← term

do char '+'

e ← expr

return (t + e)

+++ return t

Page 35: 2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char digit = sat isDigit letter = sat isAlpha alphanum = sat isAlphaNum lower, upper

35

factor :: Parser Intfactor = do d ← digit return (digitToInt d) +++ do char '(' e ← expr char ')' return e

term :: Parser Intterm = do f ← factor do char '*' t ← term return (f * t) +++ return f

Page 36: 2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char digit = sat isDigit letter = sat isAlpha alphanum = sat isAlphaNum lower, upper

36

eval :: String → Inteval 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