2012-06-11 13:11:15 +00:00
|
|
|
|
2012-11-23 04:15:59 +00:00
|
|
|
module Parse.Modules (moduleDef, imports) where
|
2012-06-11 13:11:15 +00:00
|
|
|
|
|
|
|
import Control.Applicative ((<$>), (<*>))
|
|
|
|
import Data.List (intercalate)
|
|
|
|
import Text.Parsec hiding (newline,spaces)
|
|
|
|
|
|
|
|
import Ast
|
2012-11-23 04:15:59 +00:00
|
|
|
import Parse.Library
|
2012-06-11 13:11:15 +00:00
|
|
|
|
2012-11-25 04:49:56 +00:00
|
|
|
varList :: IParser [String]
|
2012-11-24 21:00:00 +00:00
|
|
|
varList = parens $ commaSep1 (var <|> parens symOp)
|
|
|
|
|
2012-11-25 04:49:56 +00:00
|
|
|
moduleDef :: IParser ([String], [String])
|
2012-06-11 13:11:15 +00:00
|
|
|
moduleDef = do
|
2012-06-12 06:28:45 +00:00
|
|
|
try (reserved "module")
|
2012-06-11 13:11:15 +00:00
|
|
|
whitespace
|
2012-11-24 21:00:00 +00:00
|
|
|
names <- dotSep1 capVar <?> "name of module"
|
|
|
|
whitespace
|
|
|
|
exports <- option [] varList
|
2012-06-12 06:28:45 +00:00
|
|
|
whitespace <?> "reserved word 'where'"
|
2012-06-11 13:11:15 +00:00
|
|
|
reserved "where"
|
2012-06-12 06:28:45 +00:00
|
|
|
return (names, exports)
|
2012-06-11 13:11:15 +00:00
|
|
|
|
2012-11-25 04:49:56 +00:00
|
|
|
imports :: IParser Imports
|
2012-06-12 06:28:45 +00:00
|
|
|
imports = option [] ((:) <$> import' <*> many (try (freshLine >> import')))
|
2012-06-11 13:11:15 +00:00
|
|
|
|
|
|
|
|
2012-11-25 04:49:56 +00:00
|
|
|
import' :: IParser (String, ImportMethod)
|
2012-06-11 13:11:15 +00:00
|
|
|
import' = do
|
|
|
|
reserved "import"
|
|
|
|
whitespace
|
|
|
|
name <- intercalate "." <$> dotSep1 capVar
|
2013-03-16 20:02:01 +00:00
|
|
|
method <- option (Importing []) $ try (whitespace >> (as' <|> importing'))
|
2012-06-11 13:11:15 +00:00
|
|
|
return (name, method)
|
|
|
|
|
|
|
|
|
2012-11-25 04:49:56 +00:00
|
|
|
as' :: IParser ImportMethod
|
2012-06-12 06:28:45 +00:00
|
|
|
as' = reserved "as" >> whitespace >> As <$> capVar <?> "alias for module"
|
2012-06-11 13:11:15 +00:00
|
|
|
|
2012-11-25 04:49:56 +00:00
|
|
|
importing' :: IParser ImportMethod
|
2012-11-24 21:00:00 +00:00
|
|
|
importing' = Importing <$> varList <?> "listing of imported values (x,y,z)"
|