@@ -1,4 +1,4 @@
1−module Parse.Parser (parseProgram, parseDependencies, parseInfix) where
1+module Parse.Parser (parseProgram) where
3import SourceSyntax.Module
3import SourceSyntax.Module
4import Control.Applicative ((<$>), (<*>))
4import Control.Applicative ((<$>), (<*>))
@@ -6,6 +6,7 @@ import Control.Monad
6import Data.Char (isSymbol, isDigit)
6import Data.Char (isSymbol, isDigit)
7import Data.List (foldl',intercalate)
7import Data.List (foldl',intercalate)
8import Text.Parsec hiding (newline,spaces)
8import Text.Parsec hiding (newline,spaces)
9+import qualified Text.PrettyPrint as P
10import Parse.Helpers
11import Parse.Helpers
11import Parse.Binop (infixStmt, OpTable)
12import Parse.Binop (infixStmt, OpTable)
@@ -30,26 +31,11 @@ program = do
30 optional freshLine ; optional spaces ; eof
31 optional freshLine ; optional spaces ; eof
31 return $ Module names exports is declarations
32 return $ Module names exports is declarations
34+parseProgram :: String -> Either [P.Doc] (Module t v)
33parseProgram = setupParser program
35parseProgram = setupParser program
35−parseDependencies :: String -> Either String (String, [String])
37− setupParser $ do
37+setupParser :: IParser a -> String -> Either [P.Doc] a
39− (,) <$> option "Main" moduleName <*> option [] imprts
41− skip = try (manyTill anyChar (try (string "/**")))
42− imprts = fmap (map fst) imports `followedBy` freshLine
43− getName = intercalate "." . fst
44− moduleName = do optional freshLine
45− getName <$> moduleDef `followedBy` freshLine
47−parseInfix :: String -> Either String OpTable
48−parseInfix = setupParser . many $ do
49− manyTill ((whitespace >> return ' ') <|> anyChar) freshLine
52setupParser p source =
38setupParser p source =
53 case iParse p "" source of
39 case iParse p "" source of
54 Right result -> Right result
40 Right result -> Right result
55− Left err -> Left $ "Parse error at " ++ show err
41+ Left err -> Left [ P.sep . map P.text . words $ "Parse error at " ++ show err ]