@@ -54,6 +54,7 @@ module Language.PureScript.Parser.Lexer
5454 , qualifier
5555 , uname
5656 , uname'
57+ , mname
5758 , reserved
5859 , symbol
5960 , symbol'
@@ -69,7 +70,7 @@ module Language.PureScript.Parser.Lexer
6970
7071import Prelude hiding (lex)
7172
72−import Control.Monad (void)
73+import Control.Monad (void, guard)
7374import Data.Functor.Identity
7475
7576import Control.Applicative
@@ -198,7 +199,7 @@ parseToken = P.choice
198199 , P.try $ P.char '@' *> P.notFollowedBy symbolChar *> pure At
199200 , LName <$> parseLName
200201 , do uName <- parseUName
201− (Qualifier uName <$ P.char '.') <|> pure (UName uName)
202+ (guard (validModuleName uName) >> Qualifier uName <$ P.char '.') <|> pure (UName uName)
202203 , Symbol <$> parseSymbol
203204 , StringLiteral <$> parseStringLiteral
204205 , Number <$> parseNumber
@@ -209,7 +210,7 @@ parseToken = P.choice
209210 parseLName = (:) <$> identStart <*> P.many identLetter
210211
211212 parseUName :: P.Parsec String u String
212− parseUName = (:) <$> P.upper <*> P.many P.alphaNum
213+ parseUName = (:) <$> P.upper <*> P.many uidentLetter
213214
214215 parseSymbol :: P.Parsec String u String
215216 parseSymbol = P.many1 symbolChar
@@ -219,7 +220,10 @@ parseToken = P.choice
219220
220221 identLetter :: P.Parsec String u Char
221222 identLetter = P.alphaNum <|> P.oneOf "_'"
222−
223+
224+ uidentLetter :: P.Parsec String u Char
225+ uidentLetter = P.alphaNum <|> P.char '_'
226+
223227 symbolChar :: P.Parsec String u Char
224228 symbolChar = P.oneOf opChars
225229
@@ -391,6 +395,12 @@ uname = token go P.<?> "proper name"
391395 go (UName s) = Just s
392396 go _ = Nothing
393397
398+mname :: TokenParser String
399+mname = token go P.<?> "module name"
400+ where
401+ go (UName s) | validModuleName s = Just s
402+ go _ = Nothing
403+
394404uname' :: String -> TokenParser ()
395405uname' s = token go P.<?> show s
396406 where
@@ -437,6 +447,9 @@ identifier = token go P.<?> "identifier"
437447 go (LName s) | s `notElem` reservedPsNames = Just s
438448 go _ = Nothing
439449
450+validModuleName :: String -> Bool
451+validModuleName s = not ('_' `elem` s)
452+
440453-- |
441454-- A list of purescript reserved identifiers
442455--