59 lines
1.6 KiB
Haskell
59 lines
1.6 KiB
Haskell
module Parse.Module (moduleDef, getModuleName, imports) where
|
|
|
|
import Control.Applicative ((<$>), (<*>))
|
|
import Data.List (intercalate)
|
|
import Text.Parsec hiding (newline,spaces)
|
|
|
|
import Parse.Helpers
|
|
import SourceSyntax.Module (ImportMethod(..), Imports)
|
|
|
|
varList :: IParser [String]
|
|
varList = commaSep1 (var <|> parens symOp)
|
|
|
|
getModuleName :: String -> Maybe String
|
|
getModuleName source =
|
|
case iParse getModuleName source of
|
|
Right name -> Just name
|
|
Left _ -> Nothing
|
|
where
|
|
getModuleName = do
|
|
optional freshLine
|
|
(names, _) <- moduleDef
|
|
return (intercalate "." names)
|
|
|
|
moduleDef :: IParser ([String], [String])
|
|
moduleDef = do
|
|
try (reserved "module")
|
|
whitespace
|
|
names <- dotSep1 capVar <?> "name of module"
|
|
whitespace
|
|
exports <- option [] (parens varList)
|
|
whitespace <?> "reserved word 'where'"
|
|
reserved "where"
|
|
return (names, exports)
|
|
|
|
imports :: IParser Imports
|
|
imports = option [] ((:) <$> import' <*> many (try (freshLine >> import')))
|
|
|
|
import' :: IParser (String, ImportMethod)
|
|
import' =
|
|
do reserved "import"
|
|
whitespace
|
|
name <- intercalate "." <$> dotSep1 capVar
|
|
(,) name <$> option (As name) method
|
|
where
|
|
method :: IParser ImportMethod
|
|
method = try $ do whitespace
|
|
as' <|> importing'
|
|
|
|
as' :: IParser ImportMethod
|
|
as' = do
|
|
reserved "as"
|
|
whitespace
|
|
As <$> capVar <?> "alias for module"
|
|
|
|
importing' :: IParser ImportMethod
|
|
importing' =
|
|
parens (choice [ const (Hiding []) <$> string ".."
|
|
, Importing <$> varList
|
|
] <?> "listing of imported values (x,y,z)")
|