Rename the combinator.
Chris Pressey
2 years ago
1 | 1 |
|
2 | 2 |
import ParcSt2St
|
3 | 3 |
|
4 | |
transform :: (ParseState a -> ParseState b) -> (a -> b -> c) -> ParseState a -> ParseState c
|
5 | |
transform c f =
|
|
4 |
merge :: (ParseState a -> ParseState b) -> (a -> b -> c) -> ParseState a -> ParseState c
|
|
5 |
merge c f =
|
6 | 6 |
(\st ->
|
7 | 7 |
case st of
|
8 | 8 |
Failure -> Failure
|
11 | 11 |
|
12 | 12 |
-- Grammar
|
13 | 13 |
|
14 | |
expr0 = seq (expr1) (many (transform (seq (char '+') expr1) (\v0 v1 -> v0 + v1)))
|
15 | |
expr1 = seq (expr2) (many (transform (seq (char '*') expr2) (\v0 v1 -> v0 * v1)))
|
|
14 |
expr0 = seq (expr1) (many (merge (seq (char '+') expr1) (\v0 v1 -> v0 + v1)))
|
|
15 |
expr1 = seq (expr2) (many (merge (seq (char '*') expr2) (\v0 v1 -> v0 * v1)))
|
16 | 16 |
expr2 = alt number parenthesized
|
17 | 17 |
parenthesized = seq (char '(') (seq expr0 (char ')'))
|
18 | 18 |
|
|
29 | 29 |
'9' -> Just 9
|
30 | 30 |
_ -> Nothing)
|
31 | 31 |
|
32 | |
accDigit = transform digit (\v0 v1 -> v0 * 10 + v1)
|
|
32 |
accDigit = merge digit (\v0 v1 -> v0 * 10 + v1)
|
33 | 33 |
|
34 | 34 |
number = seq (update $ \v -> 0) (many1 accDigit)
|
35 | 35 |
|