@@ -8,49 +8,55 @@ import Parse.Helpers
8import qualified AST.Module as Module
8import qualified AST.Module as Module
9import qualified AST.Variable as Var
9import qualified AST.Variable as Var
11getModuleName :: String -> Maybe String
12getModuleName :: String -> Maybe String
12getModuleName source =
13getModuleName source =
13− case iParse getModuleName source of
14+ case iParse getModuleName source of
14− Right name -> Just name
15+ Right name -> Just name
15− Left _ -> Nothing
16+ Left _ -> Nothing
17− getModuleName = do
18+ getModuleName =
18− optional freshLine
19+ do optional freshLine
19− (names, _) <- header
20+ (names, _) <- header
20− return (intercalate "." names)
21+ return (intercalate "." names)
22headerAndImports :: IParser Module.HeaderAndImports
24headerAndImports :: IParser Module.HeaderAndImports
23headerAndImports =
25headerAndImports =
24− do optional freshLine
26+ do optional freshLine
25− (names, exports) <-
27+ (names, exports) <-
26− option (["Main"], Var.openListing) (header `followedBy` freshLine)
28+ option (["Main"], Var.openListing) (header `followedBy` freshLine)
27− imports' <- commitToImports <|> return []
29+ imports' <- commitToImports <|> return []
28− return $ Module.HeaderAndImports names exports imports'
30+ return $ Module.HeaderAndImports names exports imports'
30− commitToImports =
32+ commitToImports =
31− do try (lookAhead $ reserved "import")
33+ do try (lookAhead $ reserved "import")
32− imports `followedBy` freshLine
34+ imports `followedBy` freshLine
34header :: IParser ([String], Var.Listing Var.Value)
37header :: IParser ([String], Var.Listing Var.Value)
35−header = do
38+header =
36− try (reserved "module")
39+ do try (reserved "module")
37− whitespace
40+ whitespace
38− names <- dotSep1 capVar <?> "name of module"
41+ names <- dotSep1 capVar <?> "name of module"
39− whitespace
42+ whitespace
40− exports <- option Var.openListing (listing value)
43+ exports <- option Var.openListing (listing value)
41− whitespace <?> "reserved word 'where'"
44+ whitespace <?> "reserved word 'where'"
42− reserved "where"
45+ reserved "where"
43− return (names, exports)
46+ return (names, exports)
45imports :: IParser [(Module.Name, Module.ImportMethod)]
49imports :: IParser [(Module.Name, Module.ImportMethod)]
46−imports = option [] ((:) <$> import' <*> many (try (freshLine >> import')))
51+ option [] ((:) <$> import' <*> many (try (freshLine >> import')))
48import' :: IParser (Module.Name, Module.ImportMethod)
54import' :: IParser (Module.Name, Module.ImportMethod)
50− do reserved "import"
56+ do reserved "import"
51− whitespace
57+ whitespace
52− names <- dotSep1 capVar
58+ names <- dotSep1 capVar
53− (,) names <$> option (Module.As (intercalate "." names)) method
59+ (,) names <$> option (Module.As (intercalate "." names)) method
55 method :: IParser Module.ImportMethod
61 method :: IParser Module.ImportMethod
56 method = as' <|> importing'
62 method = as' <|> importing'
@@ -64,25 +70,31 @@ import' =
64 importing' :: IParser Module.ImportMethod
70 importing' :: IParser Module.ImportMethod
65 importing' = Module.Open <$> listing value
71 importing' = Module.Open <$> listing value
67listing :: IParser a -> IParser (Var.Listing a)
74listing :: IParser a -> IParser (Var.Listing a)
68listing item =
75listing item =
69− do try (whitespace >> char '(')
76+ do try (whitespace >> char '(')
70− whitespace
77+ whitespace
71− listing <- choice [ const Var.openListing <$> string ".."
80+ [ const Var.openListing <$> string ".."
72− , Var.Listing <$> commaSep1 item <*> return False
81+ , Var.Listing <$> commaSep1 item <*> return False
73− ] <?> "listing of values (x,y,z)"
82+ ] <?> "listing of values (x,y,z)"
74− whitespace
83+ whitespace
76− return listing
85+ return listing
78value :: IParser Var.Value
88value :: IParser Var.Value
79−value = val <|> tipe
90+ val <|> tipe
81− val = Var.Value <$> (lowVar <|> parens symOp)
93+ Var.Value <$> (lowVar <|> parens symOp)
84− name <- capVar
96+ do name <- capVar
85− maybeCtors <- optionMaybe (listing capVar)
97+ maybeCtors <- optionMaybe (listing capVar)
86− case maybeCtors of
98+ case maybeCtors of
87− Nothing -> return (Var.Alias name)
99+ Nothing -> return (Var.Alias name)
88− Just ctors -> return (Var.Union name ctors)
100+ Just ctors -> return (Var.Union name ctors)