on 6f75310 help sign in
elk/compiler/Parse/Module.hs
55 lines 1.6 kB history raw
2module Parse.Module (moduleDef, getModuleName, 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)
14getModuleName :: String -> Maybe String
15getModuleName source =
16 case iParse getModuleName source of
17 Right name -> Just name
18 Left _ -> Nothing
19 where
20 getModuleName = do
21 optional freshLine
22 (names, _) <- moduleDef
23 return (intercalate "." names)
25moduleDef :: IParser ([String], [String])
26moduleDef = do
27 try (reserved "module")
28 whitespace
29 names <- dotSep1 capVar <?> "name of module"
30 whitespace
31 exports <- option [] varList
32 whitespace <?> "reserved word 'where'"
33 reserved "where"
34 return (names, exports)
36imports :: IParser Imports
37imports = option [] ((:) <$> import' <*> many (try (freshLine >> import')))
39import' :: IParser (String, ImportMethod)
40import' =
41 do reserved "import"
42 whitespace
43 open <- optionMaybe (reserved "open")
44 whitespace
45 name <- intercalate "." <$> dotSep1 capVar
46 case open of
47 Just _ -> return (name, Hiding [])
48 Nothing -> let how = try (whitespace >> (as' <|> importing'))
49 in (,) name <$> option (As name) how
50 where
51 as' :: IParser ImportMethod
52 as' = reserved "as" >> whitespace >> As <$> capVar <?> "alias for module"
54 importing' :: IParser ImportMethod
55 importing' = Importing <$> varList <?> "listing of imported values (x,y,z)"