@@ -54,6 +54,7 @@ module Language.PureScript.Parser.Lexer
54 , qualifier
54 , qualifier
57 , reserved
58 , reserved
@@ -69,7 +70,7 @@ module Language.PureScript.Parser.Lexer
70import Prelude hiding (lex)
71import Prelude hiding (lex)
72−import Control.Monad (void)
73+import Control.Monad (void, guard)
73import Data.Functor.Identity
74import Data.Functor.Identity
75import Control.Applicative
76import Control.Applicative
@@ -198,7 +199,7 @@ parseToken = P.choice
198 , P.try $ P.char '@' *> P.notFollowedBy symbolChar *> pure At
199 , P.try $ P.char '@' *> P.notFollowedBy symbolChar *> pure At
199 , LName <$> parseLName
200 , LName <$> parseLName
200 , do uName <- parseUName
201 , do uName <- parseUName
201− (Qualifier uName <$ P.char '.') <|> pure (UName uName)
202+ (guard (validModuleName uName) >> Qualifier uName <$ P.char '.') <|> pure (UName uName)
202 , Symbol <$> parseSymbol
203 , Symbol <$> parseSymbol
203 , StringLiteral <$> parseStringLiteral
204 , StringLiteral <$> parseStringLiteral
204 , Number <$> parseNumber
205 , Number <$> parseNumber
@@ -209,7 +210,7 @@ parseToken = P.choice
209 parseLName = (:) <$> identStart <*> P.many identLetter
210 parseLName = (:) <$> identStart <*> P.many identLetter
211 parseUName :: P.Parsec String u String
212 parseUName :: P.Parsec String u String
212− parseUName = (:) <$> P.upper <*> P.many P.alphaNum
213+ parseUName = (:) <$> P.upper <*> P.many uidentLetter
214 parseSymbol :: P.Parsec String u String
215 parseSymbol :: P.Parsec String u String
215 parseSymbol = P.many1 symbolChar
216 parseSymbol = P.many1 symbolChar
@@ -219,7 +220,10 @@ parseToken = P.choice
220 identLetter :: P.Parsec String u Char
221 identLetter :: P.Parsec String u Char
221 identLetter = P.alphaNum <|> P.oneOf "_'"
222 identLetter = P.alphaNum <|> P.oneOf "_'"
224+ uidentLetter :: P.Parsec String u Char
225+ uidentLetter = P.alphaNum <|> P.char '_'
223 symbolChar :: P.Parsec String u Char
227 symbolChar :: P.Parsec String u Char
224 symbolChar = P.oneOf opChars
228 symbolChar = P.oneOf opChars
@@ -391,6 +395,12 @@ uname = token go P.<?> "proper name"
391 go (UName s) = Just s
395 go (UName s) = Just s
392 go _ = Nothing
396 go _ = Nothing
398+mname :: TokenParser String
399+mname = token go P.<?> "module name"
401+ go (UName s) | validModuleName s = Just s
394uname' :: String -> TokenParser ()
404uname' :: String -> TokenParser ()
395uname' s = token go P.<?> show s
405uname' s = token go P.<?> show s
@@ -437,6 +447,9 @@ identifier = token go P.<?> "identifier"
437 go (LName s) | s `notElem` reservedPsNames = Just s
447 go (LName s) | s `notElem` reservedPsNames = Just s
438 go _ = Nothing
448 go _ = Nothing
450+validModuleName :: String -> Bool
451+validModuleName s = not ('_' `elem` s)
441-- A list of purescript reserved identifiers
454-- A list of purescript reserved identifiers