55 lines
No EOL
1.6 KiB
Haskell
55 lines
No EOL
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 (Module(..), ImportMethod(..), Imports)
|
|
|
|
varList :: IParser [String]
|
|
varList = parens $ 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 [] 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
|
|
open <- optionMaybe (reserved "open")
|
|
whitespace
|
|
name <- intercalate "." <$> dotSep1 capVar
|
|
case open of
|
|
Just _ -> return (name, Hiding [])
|
|
Nothing -> let how = try (whitespace >> (as' <|> importing'))
|
|
in (,) name <$> option (As name) how
|
|
where
|
|
as' :: IParser ImportMethod
|
|
as' = reserved "as" >> whitespace >> As <$> capVar <?> "alias for module"
|
|
|
|
importing' :: IParser ImportMethod
|
|
importing' = Importing <$> varList <?> "listing of imported values (x,y,z)" |