8 import Control.Applicative
10 import Control.Monad.State
12 import Text.Parsers.Simple.Core
14 :: In a b = (:.) infix 0 a b
17 // = Def (Gram -> In Gram Gram)
18 // | Def2 ((Gram,Gram) -> In (Gram, Gram) Gram)
21 | (-.) infixr 2 Gram Gram
22 | (|.) infixl 1 Gram Gram
30 parseFromGram :: Gram -> Parser String Gast
31 parseFromGram Int = INT o toInt <$> pSatisfy (\s->toString (toInt s) == s)
32 parseFromGram (Lit i) = LIT <$> pSatisfy ((==)i)
33 parseFromGram (*! g) = MANY <$> many (parseFromGram g)
34 parseFromGram (a -. b) = BIN <$> parseFromGram a <*> parseFromGram b
35 parseFromGram (a |. b) = parseFromGram a <|> parseFromGram b
37 //Start = runParser (parseFromGram gram) [".","."]
38 Start = printeval <$> parse (parseFromGram gram) ["4","-","2","-","1"]
41 let lit = Lit "(" -. expr -. Lit ")"
43 pow = lit -. Lit "^" -. pow
45 fac = pow -. *! (Lit "*" -. pow)
47 expr = fac -. *! (Lit "-" -. fac)
51 printeval a = (eval a, print a)
53 eval :: Gast -> Maybe Int
54 eval (BIN (LIT "(") (BIN e (LIT ")"))) = eval e
56 eval (LIT _) = Nothing
57 //Right associative operators
58 eval (BIN l (BIN (LIT op) r)) = op2op op <*> eval l <*> eval r
59 //Left associative operators
60 eval (BIN l (MANY [])) = eval l
61 eval (BIN l (MANY [BIN (LIT op) r:rest]))
62 = eval (BIN (BIN l (BIN (LIT op) r)) (MANY rest))
63 eval e = abort ("eval: " +++ printToString e +++ "\n")
65 print :: Gast -> String
66 print (BIN (LIT "(") (BIN e (LIT ")"))) = "(" +++ print e +++ ")"
67 print (INT i) = toString i
69 //Right associative operators
70 print (BIN l (BIN (LIT op) r)) = "(" +++ print l +++ op +++ print r +++ ")"
71 //Left associative operators
72 print (BIN l (MANY [])) = print l
73 print (BIN l (MANY [BIN (LIT op) r:rest]))
74 = print (BIN (BIN l (BIN (LIT op) r)) (MANY rest))
75 print e = printToString e +++ "\n"
84 derive gPrint Gast, Maybe