git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Merge pull request #785 from dylex/master
501ea67Phil Freeman
examples/failing/UnderscoreModuleName.pursnew file+3
@@ -0,0 +1,3 @@
1+module Bad_Module where
2+
3+main = Debug.Trace.trace "Done"
examples/passing/UnderscoreIdent.pursnew file+9
@@ -0,0 +1,9 @@
1+module Main where
2+
3+data Data_type = Con_Structor | Con_2 String
4+
5+type Type_name = Data_type
6+
7+done (Con_2 s) = s
8+
9+main = Debug.Trace.trace (done (Con_2 "Done"))
src/Language/PureScript/Parser/Common.hs+1−1
@@ -37,7 +37,7 @@ moduleName = part []
37 where
37 where
38 part path = (do name <- ProperName <$> P.try qualifier
38 part path = (do name <- ProperName <$> P.try qualifier
39 part (path `snoc` name))
39 part (path `snoc` name))
40− <|> (ModuleName . snoc path <$> properName)
40+ <|> (ModuleName . snoc path . ProperName <$> mname)
41 snoc path name = path ++ [name]
41 snoc path name = path ++ [name]
42
42
43-- |
43-- |
src/Language/PureScript/Parser/Lexer.hs+17−4
@@ -54,6 +54,7 @@ module Language.PureScript.Parser.Lexer
54 , qualifier
54 , qualifier
55 , uname
55 , uname
56 , uname'
56 , uname'
57+ , mname
57 , reserved
58 , reserved
58 , symbol
59 , symbol
59 , symbol'
60 , symbol'
@@ -69,7 +70,7 @@ module Language.PureScript.Parser.Lexer
69
70
70import Prelude hiding (lex)
71import Prelude hiding (lex)
71
72
72−import Control.Monad (void)
73+import Control.Monad (void, guard)
73import Data.Functor.Identity
74import Data.Functor.Identity
74
75
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
210
211
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
213
214
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
219
220
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 "_'"
222−
223+
224+ uidentLetter :: P.Parsec String u Char
225+ uidentLetter = P.alphaNum <|> P.char '_'
226+
223 symbolChar :: P.Parsec String u Char
227 symbolChar :: P.Parsec String u Char
224 symbolChar = P.oneOf opChars
228 symbolChar = P.oneOf opChars
225
229
@@ -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
393
397
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+
394uname' :: String -> TokenParser ()
404uname' :: String -> TokenParser ()
395uname' s = token go P.<?> show s
405uname' s = token go P.<?> show s
396 where
406 where
@@ -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
439
449
450+validModuleName :: String -> Bool
451+validModuleName s = not ('_' `elem` s)
452+
440-- |
453-- |
441-- A list of purescript reserved identifiers
454-- A list of purescript reserved identifiers
442--
455--