@@ -27,60 +27,106 @@ import qualified Text.Parsec.Token as PT
2727import Language.PureScript.Names
2828
2929-- |
30−-- A list of reserved identifiers
31−--
32−reservedNames :: [String]
33−reservedNames = [ "case"
34− , "of"
35− , "data"
36− , "type"
37− , "var"
38− , "val"
39− , "while"
40− , "for"
41− , "foreach"
42− , "if"
43− , "then"
44− , "else"
45− , "return"
46− , "true"
47− , "false"
48− , "foreign"
49− , "import"
50− , "member"
51− , "forall"
52− , "do"
53− , "until"
54− , "in"
55− , "break"
56− , "catch"
57− , "continue"
58− , "debugger"
59− , "default"
60− , "delete"
61− , "finally"
62− , "function"
63− , "instanceof"
64− , "new"
65− , "switch"
66− , "this"
67− , "throw"
68− , "try"
69− , "typeof"
70− , "void"
71− , "with"
72− , "Number"
73− , "String"
74− , "Boolean"
75− , "infixl"
76− , "infixr"
77− , "module"
78− , "let"
79− , "class"
80− , "instance"
81− , "where"
82− , "null"
83− , "undefined" ]
30+-- A list of purescript reserved identifiers
31+--
32+reservedPsNames :: [String]
33+reservedPsNames = [ "data"
34+ , "type"
35+ , "foreign"
36+ , "import"
37+ , "infixl"
38+ , "infixr"
39+ , "class"
40+ , "instance"
41+ , "module"
42+ , "case"
43+ , "of"
44+ , "if"
45+ , "then"
46+ , "else"
47+ , "do"
48+ , "let"
49+ , "true"
50+ , "false"
51+ , "until"
52+ ]
53+
54+-- |
55+-- A list of javascript reserved identifiers
56+--
57+reservedJsNames :: [String]
58+reservedJsNames = [ "abstract"
59+ , "boolean"
60+ , "break"
61+ , "byte"
62+ , "case"
63+ , "catch"
64+ , "char"
65+ , "class"
66+ , "const"
67+ , "continue"
68+ , "debugger"
69+ , "default"
70+ , "delete"
71+ , "do"
72+ , "double"
73+ , "else"
74+ , "enum"
75+ , "export"
76+ , "extends"
77+ , "final"
78+ , "finally"
79+ , "float"
80+ , "for"
81+ , "function"
82+ , "goto"
83+ , "if"
84+ , "implements"
85+ , "import"
86+ , "in"
87+ , "instanceof"
88+ , "int"
89+ , "interface"
90+ , "let"
91+ , "long"
92+ , "native"
93+ , "new"
94+ , "package"
95+ , "private"
96+ , "protected"
97+ , "public"
98+ , "return"
99+ , "short"
100+ , "static"
101+ , "super"
102+ , "switch"
103+ , "synchronized"
104+ , "this"
105+ , "throw"
106+ , "throws"
107+ , "transient"
108+ , "try"
109+ , "typeof"
110+ , "var"
111+ , "void"
112+ , "volatile"
113+ , "while"
114+ , "with"
115+ , "yield" ]
116+
117+-- |
118+-- A list of reserved identifiers for types
119+--
120+reservedTypeNames :: [String]
121+reservedTypeNames = [ "forall"
122+ , "where" ]
123+
124+-- |
125+-- A list of reserved identifiers for block statements
126+--
127+reservedStatementNames :: [String]
128+reservedStatementNames = [ "for"
129+ , "return" ]
84130
85131-- |
86132-- A list of reserved operators
@@ -123,7 +169,7 @@ opLetter = P.oneOf ":!#$%&*+./<=>?@\\^|-~"
123169--
124170langDef :: PT.GenLanguageDef String u Identity
125171langDef = PT.LanguageDef
126− { PT.reservedNames = reservedNames
172+ { PT.reservedNames = reservedPsNames
127173 , PT.reservedOpNames = reservedOpNames
128174 , PT.commentStart = "{-"
129175 , PT.commentEnd = "-}"
@@ -253,20 +299,12 @@ integerOrFloat = (Left <$> P.try (PT.natural tokenParser) <|>
253299-- Parse an identifier or parenthesized operator
254300--
255301parseIdent :: P.Parsec String ParseState Ident
256−parseIdent = (Ident <$> identifier) <|> (Op <$> parens operator)
257−
258−
259−-- |
260−-- Parse an identifier or parenthesized operator that is not a reserved keyword or operator
261−--
262−parseNonReservedIdent :: P.Parsec String ParseState Ident
263−parseNonReservedIdent = do
264− ident <- parseIdent
265− when (isReserved ident) $ P.unexpected $ "reserved identifier " ++ show ident
266− return ident
302+parseIdent = parseIdent' <|> (Op <$> parens operator)
267303 where
268− isReserved (Ident ident) = ident `elem` reservedNames
269− isReserved (Op op) = op `elem` reservedOpNames
304+ parseIdent' :: P.Parsec String ParseState Ident
305+ parseIdent' = do
306+ ident <- identifier
307+ return $ if (ident `elem` reservedJsNames) then (Escaped $ "$" ++ ident) else (Ident ident)
270308
271309-- |
272310-- Parse a token inside square brackets