on 4bec310 help sign in
elk/compiler/Parse/Module.hs
59 lines 1.7 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 = 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 [] (parens 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 name <- intercalate "." <$> dotSep1 capVar
43 (,) name <$> option (As name) method
44 where
45 method :: IParser ImportMethod
46 method = try $ do whitespace
47 as' <|> importing'
49 as' :: IParser ImportMethod
50 as' = do
51 reserved "as"
52 whitespace
53 As <$> capVar <?> "alias for module"
55 importing' :: IParser ImportMethod
56 importing' =
57 parens (choice [ const (Hiding []) <$> string ".."
58 , Importing <$> varList
59 ] <?> "listing of imported values (x,y,z)")