@@ -4,13 +4,12 @@ import Control.Applicative ((<$>), (<*>))
4import Control.Monad
4import Control.Monad
5import Data.Char (isSymbol, isDigit)
5import Data.Char (isSymbol, isDigit)
6import Data.List (foldl',intercalate)
6import Data.List (foldl',intercalate)
7−import qualified Data.Map as Map
8import Text.Parsec hiding (newline,spaces)
7import Text.Parsec hiding (newline,spaces)
9import qualified Text.PrettyPrint as P
8import qualified Text.PrettyPrint as P
11import qualified SourceSyntax.Module as S
10import qualified SourceSyntax.Module as S
12import Parse.Helpers
11import Parse.Helpers
13−import Parse.Binop (infixStmt, OpTable, preludeTable)
12+import Parse.Binop (infixStmt, OpTable)
14import Parse.Expression
13import Parse.Expression
15import Parse.Type
14import Parse.Type
16import Parse.Module
15import Parse.Module
@@ -23,8 +22,8 @@ freshDef = commitIf (freshLine >> (letter <|> char '_')) $ do
23decls = do d <- Decl.declaration <?> "at least one datatype or variable definition"
22decls = do d <- Decl.declaration <?> "at least one datatype or variable definition"
24 (d:) <$> many freshDef
23 (d:) <$> many freshDef
26−program :: OpTable -> String -> Either [P.Doc] (S.Module t v)
25+program :: String -> Either [P.Doc] (S.Module t v)
27−program table = setupParserWithTable table $ do
26+program = setupParser $ do
28 optional freshLine
27 optional freshLine
29 (names,exports) <- option (["Main"],[]) (moduleDef `followedBy` freshLine)
28 (names,exports) <- option (["Main"],[]) (moduleDef `followedBy` freshLine)
30 is <- (do try (lookAhead $ reserved "import")
29 is <- (do try (lookAhead $ reserved "import")
@@ -41,43 +40,8 @@ dependencies =
41 (,) <$> option "Main" (getName <$> moduleDef `followedBy` freshLine)
40 (,) <$> option "Main" (getName <$> moduleDef `followedBy` freshLine)
42 <*> option [] (map fst <$> imports `followedBy` freshLine)
41 <*> option [] (map fst <$> imports `followedBy` freshLine)
44−setupParserWithTable :: OpTable -> IParser a -> String -> Either [P.Doc] a
45−setupParserWithTable table p source =
46− do let initialTable = Map.union preludeTable table
47− localTable <- setupParser parseFixities source
48− case Map.intersection initialTable localTable of
49− overlap | not (Map.null overlap) -> Left [ msg overlap ]
51− flip setupParser source $ do
52− putState preludeTable --(Map.union initialTable localTable)
56− P.vcat [ P.text "Parse error:"
57− , P.text $ "Overlapping definitions for infix operators: " ++
58− intercalate " " (Map.keys overlap)
61−parseFixities = infixes []
63− nil p = const () <$> p
64− manyTil p end = end <|> (p >> manyTil p end)
66− eatLine = manyTil (nil multiComment <|> nil anyChar)
67− (const False <$> simpleNewline <|> const True <$> eof)
70− next <- Left <$> infixStmt <|> Right <$> eatLine
72− Left stmt -> infixes (stmt:stmts)
73− Right True -> return $ format stmts
74− Right False -> infixes stmts
76− format = Map.fromList . map (\(lvl,assoc,op) -> (op, (lvl,assoc)))
79setupParser :: IParser a -> String -> Either [P.Doc] a
43setupParser :: IParser a -> String -> Either [P.Doc] a
80setupParser p source =
44setupParser p source =
81− case iParse p source of
45+ case iParse p "" source of
82 Right result -> Right result
46 Right result -> Right result
83 Left err -> Left [ P.text $ "Parse error at " ++ show err ]
47 Left err -> Left [ P.text $ "Parse error at " ++ show err ]