on b00a8cb help sign in
elk/compiler/Parse/Module.hs
54 lines 1.6 kB history raw
1module Parse.Module (moduleDef, getModuleName, imports) where
3import Control.Applicative ((<$>), (<*>))
4import Data.List (intercalate)
5import Text.Parsec hiding (newline,spaces)
7import Parse.Helpers
8import SourceSyntax.Module (ImportMethod(..), Imports)
10varList :: IParser [String]
11varList = parens $ commaSep1 (var <|> parens symOp)
13getModuleName :: String -> Maybe String
14getModuleName source =
15 case iParse getModuleName source of
16 Right name -> Just name
17 Left _ -> Nothing
18 where
19 getModuleName = do
20 optional freshLine
21 (names, _) <- moduleDef
22 return (intercalate "." names)
24moduleDef :: IParser ([String], [String])
25moduleDef = do
26 try (reserved "module")
27 whitespace
28 names <- dotSep1 capVar <?> "name of module"
29 whitespace
30 exports <- option [] varList
31 whitespace <?> "reserved word 'where'"
32 reserved "where"
33 return (names, exports)
35imports :: IParser Imports
36imports = option [] ((:) <$> import' <*> many (try (freshLine >> import')))
38import' :: IParser (String, ImportMethod)
39import' =
40 do reserved "import"
41 whitespace
42 open <- optionMaybe (reserved "open")
43 whitespace
44 name <- intercalate "." <$> dotSep1 capVar
45 case open of
46 Just _ -> return (name, Hiding [])
47 Nothing -> let how = try (whitespace >> (as' <|> importing'))
48 in (,) name <$> option (As name) how
49 where
50 as' :: IParser ImportMethod
51 as' = reserved "as" >> whitespace >> As <$> capVar <?> "alias for module"
53 importing' :: IParser ImportMethod
54 importing' = Importing <$> varList <?> "listing of imported values (x,y,z)"