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"