Mercurial > 12ws.info2
comparison exercises/src/AdditionParser2.hs @ 30:8bf7ca2663d2
Advanced AdditionParser
author | Markus Kaiser <markus.kaiser@in.tum.de> |
---|---|
date | Sat, 12 Jan 2013 14:36:43 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
29:53732b9605c7 | 30:8bf7ca2663d2 |
---|---|
1 module AdditionParser2 where | |
2 | |
3 import Data.Char | |
4 import Parser | |
5 | |
6 data Token = Num Int | Plus | Times | LeftPar | RightPar deriving (Show, Eq) | |
7 | |
8 -- Scanner (Lexer) | |
9 digitS :: Parser Char Int | |
10 digitS = one isDigit >>> digitToInt | |
11 | |
12 numberS :: Parser Char Int | |
13 numberS = list1 (one isDigit) >>> (\n -> read n :: Int) | |
14 | |
15 additionS :: Parser Char [Token] | |
16 additionS = list (spaces *** token >>> snd) *** spaces >>> fst | |
17 where | |
18 spaces = list $ item ' ' | |
19 token = item '(' >>> const LeftPar ||| | |
20 item ')' >>> const RightPar ||| | |
21 item '+' >>> const Plus ||| | |
22 item '*' >>> const Times ||| | |
23 numberS >>> Num | |
24 | |
25 -- Parser | |
26 additionP :: Parser Token Int | |
27 additionP = additionP1 *** optional (item Plus *** additionP >>> snd) >>> ints | |
28 where | |
29 ints (x, Just y) = x + y | |
30 ints (x, _) = x | |
31 | |
32 additionP1 :: Parser Token Int | |
33 additionP1 = additionP2 *** optional (item Times *** additionP1 >>> snd) >>> ints | |
34 where | |
35 ints (x, Just y) = x * y | |
36 ints (x, _) = x | |
37 | |
38 additionP2 :: Parser Token Int | |
39 additionP2 = | |
40 one isNum >>> int ||| | |
41 enclose LeftPar RightPar additionP | |
42 where | |
43 isNum (Num _) = True | |
44 isNum (_) = False | |
45 int (Num n) = n | |
46 | |
47 -- Composition | |
48 additionSP :: String -> Maybe (Int, [Token]) | |
49 additionSP xs = case additionS xs of | |
50 Just (ys, []) -> additionP ys | |
51 _ -> Nothing | |
52 | |
53 test = additionSP "2*4+10+(2+2)*2" |