on master help sign in
Make "combineAnnotations" a part of parsing a program
98f7be3Evan Czaplicki
compiler/Parse/Parse.hs+18−10
@@ -8,8 +8,9 @@ import qualified Data.Map as Map
8import Text.Parsec hiding (newline,spaces)
8import Text.Parsec hiding (newline,spaces)
9import qualified Text.PrettyPrint as P
9import qualified Text.PrettyPrint as P
10
10
11−import qualified SourceSyntax.Module as S
11+import qualified SourceSyntax.Expression as E
12import qualified SourceSyntax.Declaration as D
12import qualified SourceSyntax.Declaration as D
13+import qualified SourceSyntax.Module as M
13import Parse.Helpers
14import Parse.Helpers
14import Parse.Binop (OpTable)
15import Parse.Binop (OpTable)
15import Parse.Expression
16import Parse.Expression
@@ -17,6 +18,7 @@ import Parse.Declaration (infixDecl)
17import Parse.Type
18import Parse.Type
18import Parse.Module
19import Parse.Module
19import qualified Parse.Declaration as Decl
20import qualified Parse.Declaration as Decl
21+import Transform.Declaration (combineAnnotations)
20
22
21freshDef = commitIf (freshLine >> (letter <|> char '_')) $ do
23freshDef = commitIf (freshLine >> (letter <|> char '_')) $ do
22 freshLine
24 freshLine
@@ -25,15 +27,21 @@ freshDef = commitIf (freshLine >> (letter <|> char '_')) $ do
25decls = do d <- Decl.declaration <?> "at least one datatype or variable definition"
27decls = do d <- Decl.declaration <?> "at least one datatype or variable definition"
26 (d:) <$> many freshDef
28 (d:) <$> many freshDef
27
29
28−program :: OpTable -> String -> Either [P.Doc] (S.Module t v)
30+program :: OpTable -> String -> Either [P.Doc] (M.Module D.Declaration)
31+program table src =
29−program table = setupParserWithTable table $ do
32+ do (M.Module names exs ims parseDecls) <- setupParserWithTable table programParser src
33+ decls <- either (\err -> Left [P.text err]) Right (combineAnnotations parseDecls)
34+ return $ M.Module names exs ims decls
35+
36+programParser :: IParser (M.Module D.ParseDeclaration)
37+programParser =
30− optional freshLine
38+ do optional freshLine
31− (names,exports) <- option (["Main"],[]) (moduleDef `followedBy` freshLine)
39+ (names,exports) <- option (["Main"],[]) (moduleDef `followedBy` freshLine)
32− is <- (do try (lookAhead $ reserved "import")
40+ is <- (do try (lookAhead $ reserved "import")
33− imports `followedBy` freshLine) <|> return []
41+ imports `followedBy` freshLine) <|> return []
34− declarations <- decls
42+ declarations <- decls
35− optional freshLine ; optional spaces ; eof
43+ optional freshLine ; optional spaces ; eof
36− return $ S.Module names exports is declarations
44+ return $ M.Module names exports is declarations
37
45
38dependencies :: String -> Either [P.Doc] (String, [String])
46dependencies :: String -> Either [P.Doc] (String, [String])
39dependencies =
47dependencies =