parse failure abc parse return 1 abc 1
> parse failure "abc" [] > parse (return 1) "abc" [(1, "abc")] > parse (item +++ return 'd') "abc" [('a', "bc")] > parse (failure +++ return 'd') "abc" [('d', "abc")] 10
導出されたパーサーの部品 z 与えられた述語を満たす 1 文字を受理する: sat : : (Char Bool) Parser Char sat p = do x item if p x then return x else failure 16
z 数字 1 文字(digit)、指定された 1 文字(char)を 受理する: digit : : Parser Char digit char = sat is. Digit : : Char Parser Char char x = sat (x ==) z 指定された文字列を受理する: string : : String Parser String string [] = return [] string (x: xs) = do char x string xs return (x: xs) 17
term factor ('*' term ) term : : Parser Int term = do f factor do char '*' t term return (f * t) +++ return f factor digit '(' expr ')' factor : : Parser Int factor = do d digit return (digit. To. Int d) +++ do char '(' e expr char ')' return e 31
最後に、以下のように定義すると、 eval : : String Int eval xs = fst (head (parse expr xs)) 例を試すことができる: > eval "2*3+4" 10 > eval "2*(3+4)" 14 32
35
41
expr term + factor term expr + expr nat factor term 2 nat factor 3 nat 4
expr + expr digit expr * 2 digit 3 4 expr
- Slides: 44