2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char...
Transcript of 2 3+4robotics.cs.tamu.edu/dshell/cs314/slides/lec6.pdf · 26 digit, letter, alphanum :: Parser Char...
![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](https://reader035.fdocument.pub/reader035/viewer/2022062606/5fe6c11a091092656c5919c3/html5/thumbnails/1.jpg)
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](https://reader035.fdocument.pub/reader035/viewer/2022062606/5fe6c11a091092656c5919c3/html5/thumbnails/2.jpg)
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](https://reader035.fdocument.pub/reader035/viewer/2022062606/5fe6c11a091092656c5919c3/html5/thumbnails/3.jpg)
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](https://reader035.fdocument.pub/reader035/viewer/2022062606/5fe6c11a091092656c5919c3/html5/thumbnails/4.jpg)
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](https://reader035.fdocument.pub/reader035/viewer/2022062606/5fe6c11a091092656c5919c3/html5/thumbnails/5.jpg)
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](https://reader035.fdocument.pub/reader035/viewer/2022062606/5fe6c11a091092656c5919c3/html5/thumbnails/6.jpg)
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](https://reader035.fdocument.pub/reader035/viewer/2022062606/5fe6c11a091092656c5919c3/html5/thumbnails/7.jpg)
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](https://reader035.fdocument.pub/reader035/viewer/2022062606/5fe6c11a091092656c5919c3/html5/thumbnails/8.jpg)
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](https://reader035.fdocument.pub/reader035/viewer/2022062606/5fe6c11a091092656c5919c3/html5/thumbnails/9.jpg)
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](https://reader035.fdocument.pub/reader035/viewer/2022062606/5fe6c11a091092656c5919c3/html5/thumbnails/10.jpg)
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](https://reader035.fdocument.pub/reader035/viewer/2022062606/5fe6c11a091092656c5919c3/html5/thumbnails/11.jpg)
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](https://reader035.fdocument.pub/reader035/viewer/2022062606/5fe6c11a091092656c5919c3/html5/thumbnails/12.jpg)
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](https://reader035.fdocument.pub/reader035/viewer/2022062606/5fe6c11a091092656c5919c3/html5/thumbnails/13.jpg)
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](https://reader035.fdocument.pub/reader035/viewer/2022062606/5fe6c11a091092656c5919c3/html5/thumbnails/14.jpg)
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](https://reader035.fdocument.pub/reader035/viewer/2022062606/5fe6c11a091092656c5919c3/html5/thumbnails/15.jpg)
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](https://reader035.fdocument.pub/reader035/viewer/2022062606/5fe6c11a091092656c5919c3/html5/thumbnails/16.jpg)
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](https://reader035.fdocument.pub/reader035/viewer/2022062606/5fe6c11a091092656c5919c3/html5/thumbnails/17.jpg)
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](https://reader035.fdocument.pub/reader035/viewer/2022062606/5fe6c11a091092656c5919c3/html5/thumbnails/18.jpg)
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](https://reader035.fdocument.pub/reader035/viewer/2022062606/5fe6c11a091092656c5919c3/html5/thumbnails/19.jpg)
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](https://reader035.fdocument.pub/reader035/viewer/2022062606/5fe6c11a091092656c5919c3/html5/thumbnails/20.jpg)
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](https://reader035.fdocument.pub/reader035/viewer/2022062606/5fe6c11a091092656c5919c3/html5/thumbnails/21.jpg)
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](https://reader035.fdocument.pub/reader035/viewer/2022062606/5fe6c11a091092656c5919c3/html5/thumbnails/22.jpg)
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](https://reader035.fdocument.pub/reader035/viewer/2022062606/5fe6c11a091092656c5919c3/html5/thumbnails/23.jpg)
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](https://reader035.fdocument.pub/reader035/viewer/2022062606/5fe6c11a091092656c5919c3/html5/thumbnails/24.jpg)
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](https://reader035.fdocument.pub/reader035/viewer/2022062606/5fe6c11a091092656c5919c3/html5/thumbnails/25.jpg)
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](https://reader035.fdocument.pub/reader035/viewer/2022062606/5fe6c11a091092656c5919c3/html5/thumbnails/26.jpg)
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](https://reader035.fdocument.pub/reader035/viewer/2022062606/5fe6c11a091092656c5919c3/html5/thumbnails/27.jpg)
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](https://reader035.fdocument.pub/reader035/viewer/2022062606/5fe6c11a091092656c5919c3/html5/thumbnails/28.jpg)
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](https://reader035.fdocument.pub/reader035/viewer/2022062606/5fe6c11a091092656c5919c3/html5/thumbnails/29.jpg)
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](https://reader035.fdocument.pub/reader035/viewer/2022062606/5fe6c11a091092656c5919c3/html5/thumbnails/30.jpg)
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](https://reader035.fdocument.pub/reader035/viewer/2022062606/5fe6c11a091092656c5919c3/html5/thumbnails/31.jpg)
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](https://reader035.fdocument.pub/reader035/viewer/2022062606/5fe6c11a091092656c5919c3/html5/thumbnails/32.jpg)
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](https://reader035.fdocument.pub/reader035/viewer/2022062606/5fe6c11a091092656c5919c3/html5/thumbnails/33.jpg)
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](https://reader035.fdocument.pub/reader035/viewer/2022062606/5fe6c11a091092656c5919c3/html5/thumbnails/34.jpg)
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](https://reader035.fdocument.pub/reader035/viewer/2022062606/5fe6c11a091092656c5919c3/html5/thumbnails/35.jpg)
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](https://reader035.fdocument.pub/reader035/viewer/2022062606/5fe6c11a091092656c5919c3/html5/thumbnails/36.jpg)
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