git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Merge pull request #785 from dylex/master

Lift restriction on underscores in unames

commit501ea67ef57aa48a8d940799276ffcff64049b96 authorPhil Freeman <paf31@cantab.net> dateThu 25 Dec 2014, 11:47 (12 years ago) parentd0dc08c3fa8e4f
4 files changed+30−5
examples/failing/UnderscoreModuleName.purs+3 examples/passing/UnderscoreIdent.purs+9 src/Language/PureScript/Parser/Common.hs+1−1 src/Language/PureScript/Parser/Lexer.hs+17−4
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 []
3737 where
3838 part path = (do name <- ProperName <$> P.try qualifier
3939 part (path `snoc` name))
40− <|> (ModuleName . snoc path <$> properName)
40+ <|> (ModuleName . snoc path . ProperName <$> mname)
4141 snoc path name = path ++ [name]
4242
4343-- |
src/Language/PureScript/Parser/Lexer.hs+17−4
@@ -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--