5eb04d63cad902b621e7b385429e6f6aedf2b9f2
[clean-tests.git] / parserParser / test.icl
1 module test
2
3 import StdEnv
4
5 import Data.Functor
6 import Control.Applicative
7 import Control.Monad
8 import Control.Monad.State
9
10 import Text.Parsers.Simple.Core
11
12 :: In a b = (:.) infix 0 a b
13
14 :: Gram
15 = Def (Gram -> In Gram Gram)
16 | Def2 ((Gram,Gram) -> In (Gram, Gram) Gram)
17 | Lit String
18 | Int
19 | (-.) infixr 2 Gram Gram
20 | (|.) infix 1 Gram Gram
21 :: Gast
22 = INT Int
23 | LIT String
24 | BIN Gast Gast
25
26 parseFromGram :: Gram -> Parser String Gast
27 parseFromGram (Def g) = let (body :. gram) = g body in parseFromGram gram
28 parseFromGram Int = INT o toInt <$> pSatisfy (\s->toString (toInt s) == s)
29 parseFromGram (Lit i) = LIT <$> pSatisfy ((==)i)
30 parseFromGram (a -. b) = BIN <$> parseFromGram a <*> parseFromGram b
31 parseFromGram (a |. b) = parseFromGram a <|> parseFromGram b
32
33 //Start = runParser (parseFromGram gram) [".","."]
34 Start = parse (parseFromGram gram) ["5"]
35 where
36 gram =
37 Def \lit = Int
38 |. Lit "(" -. expr -. Lit ")"
39 Def \fac = lit -. Lit "*" -. fac
40 |. lit -. Lit "/" -. fac
41 |. lit :.
42 Def \expr= fac -. Lit "+" -. expr
43 |. fac -. Lit "-" -. expr
44 |. fac :.
45 expr