--- /dev/null
+module main
+
+import StdEnv
+import System.CommandLine
+import Data.Func
+
+import ast
+import parse
+import infer
+
+readFile :: *File -> ([Char], *File)
+readFile f
+# (ok, c, f) = freadc f
+| not ok = ([], f)
+# (rest, f) = readFile f
+= ([c:rest], f)
+
+Start w
+# (io, w) = stdio w
+# ([argv0:argv], w) = getCommandLine w
+# (chars, io) = readFile io
+= parse zero
+ $ lex chars
(until) infix 5 :: (Parser a) (Parser b) -> Parser ([a], b)
(until) p grd = (tuple [] <$> grd) <|> (appFst o 'SS'._cons <$> p <*> p until grd)
-parse :: [Token] ParseState -> Either [String] AST
-parse ts st = runStateT parseAST {st & tokens=ts} >>= uncurry parse2
+parse :: ParseState [Token] -> Either [String] AST
+parse st ts = runStateT parseAST {st & tokens=ts} >>= uncurry parse2
parse2 :: AST ParseState -> Either [String] AST
parse2 (AST fs) ps = AST <$> mapM pfun fs
parseInt :: Parser Int
parseInt = (\(IntToken i)->i) <$> token (IntToken 0)
-
-Start =
- toString <$> parse (
- lex $
- ['id x = x;'] ++
- ['const x y = x;'] ++
- ['flip x y z = x z y;'] ++
- ['twice f = f . f;'] ++
- ['fix f x = let x = f x in x;'] ++
- ['. infixr 9 f g x = f $ g x;'] ++
- ['$ infixr 0 = id;'] ++
- ['& infixr 0 = flip $;'] ++
- ['+ infixr 6 = code add;'] ++
- ['- infixr 6 = code sub;'] ++
- ['* infixr 7 = code mul;'] ++
- ['/ infixr 7 = code div;'] ++
- ['&& infixl 3 = code and;'] ++
- ['|| infixl 2 = code or;'] ++
- ['ap = (1 +);'] ++
- ['ap = (+ 1);']
- ) zero