on c19ccfe help sign in
elk/compiler/Parse/Module.hs
44 lines 1.3 kB history raw
2module Parse.Module (moduleDef, imports) where
4import Control.Applicative ((<$>), (<*>))
5import Data.List (intercalate)
6import Text.Parsec hiding (newline,spaces)
8import Parse.Helpers
9import SourceSyntax.Module (Module(..), ImportMethod(..), Imports)
11varList :: IParser [String]
12varList = parens $ commaSep1 (var <|> parens symOp)
14moduleDef :: IParser ([String], [String])
15moduleDef = do
16 try (reserved "module")
17 whitespace
18 names <- dotSep1 capVar <?> "name of module"
19 whitespace
20 exports <- option [] varList
21 whitespace <?> "reserved word 'where'"
22 reserved "where"
23 return (names, exports)
25imports :: IParser Imports
26imports = option [] ((:) <$> import' <*> many (try (freshLine >> import')))
28import' :: IParser (String, ImportMethod)
29import' =
30 do reserved "import"
31 whitespace
32 open <- optionMaybe (reserved "open")
33 whitespace
34 name <- intercalate "." <$> dotSep1 capVar
35 case open of
36 Just _ -> return (name, Hiding [])
37 Nothing -> let how = try (whitespace >> (as' <|> importing'))
38 in (,) name <$> option (Importing []) how
39 where
40 as' :: IParser ImportMethod
41 as' = reserved "as" >> whitespace >> As <$> capVar <?> "alias for module"
43 importing' :: IParser ImportMethod
44 importing' = Importing <$> varList <?> "listing of imported values (x,y,z)"