parse :: Gram -> Parse TREE
parse (Lit s) = LIT <$> ((==)s) ? next
-parse Idn = IDN <$> next
+parse Idn = IDN <$> (\s->isAlpha s.[0]) ? next
parse Int = INT o toInt <$> (\s->toString (toInt s) == s) ? next
parse (Seq gs) = SEQ <$> sequence (map parse gs)
parse (Alt as) = foldr (<|>) empty (map parse as)
parse (Def n g1 g2) = setGram n g1 *> parse g2
-parse (Var n) = join (parse <$> getGram n)
+parse (Var n) = getGram n >>= parse
parse _ = empty
run :: Gram [String] -> Maybe TREE
run g t = fst (runParse (parse g) {store='Map'.newMap,input=t})
-Start = (run listIntGram listIntInput, run arithGram arithInput)
+Start = (evalList <$> run listIntGram listIntInput, evalArith <$> run arithGram arithInput)
where
listIntInput = ["mylist","=","[","7",":","[","42",":","[]","]","]"]
arithInput = ["12","*","2","+","4","*","3","*","2","-","6"]
= Def "fac" (Alt [Seq [Int, Lit "*", Var "fac"], Int])
$ Def "exp" (Alt [Seq [Var "fac", Lit "+", Var "exp"], Var "fac"])
$ Var "exp"
+
+evalList :: TREE -> Maybe [Int]
+evalList (LIT "[]") = Just []
+evalList (SEQ [LIT "[", INT i, LIT ":", r, LIT "]"]) = evalList r >>= \r->pure [i:r]
+evalList (SEQ [IDN _, LIT "=", l]) = evalList l
+evalList _ = Nothing
+
+evalArith :: TREE -> Maybe Int
+evalArith (INT i) = Just i
+evalArith (SEQ [a, LIT op, b]) = toOp op <*> evalArith a <*> evalArith b
+where
+ toOp :: String -> Maybe (Int Int -> Int)
+ toOp "+" = Just (+)
+ toOp "*" = Just (*)
+ toOp _ = Nothing
+evalArith _ = Nothing