6 import Control.Applicative
8 import Control.Monad.State
10 import Text.Parsers.Simple.Core
12 :: In a b = (:.) infix 0 a b
15 = Def (Gram -> In Gram Gram)
16 | Def2 ((Gram,Gram) -> In (Gram, Gram) Gram)
19 | (-.) infixr 2 Gram Gram
20 | (|.) infix 1 Gram Gram
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
33 //Start = runParser (parseFromGram gram) [".","."]
34 Start = parse (parseFromGram gram) ["5"]
38 |. Lit "(" -. expr -. Lit ")"
39 Def \fac = lit -. Lit "*" -. fac
40 |. lit -. Lit "/" -. fac
42 Def \expr= fac -. Lit "+" -. expr
43 |. fac -. Lit "-" -. expr