@@ -26,6 +26,8 @@ module Language.PureScript.Parser.Declarations (
2626 parseBinderNoParens,
2727) where
2828
29+import Prelude hiding (lex)
30+
2931import Data.Maybe (isJust, fromMaybe)
3032import Data.Traversable (forM)
3133
@@ -33,11 +35,11 @@ import Control.Applicative
3335import Control.Arrow ((+++))
3436
3537import Language.PureScript.Kinds
36−import Language.PureScript.Parser.State
3738import Language.PureScript.Parser.Common
3839import Language.PureScript.AST
3940import Language.PureScript.Parser.Types
4041import Language.PureScript.Parser.Kinds
42+import Language.PureScript.Parser.Lexer
4143import Language.PureScript.CodeGen.JS.AST
4244import Language.PureScript.Environment
4345
@@ -58,43 +60,43 @@ withSourceSpan f p = do
5860 where
5961 toSourcePos pos = SourcePos (P.sourceLine pos) (P.sourceColumn pos)
6062
61−kindedIdent :: P.Parsec String ParseState (String, Maybe Kind)
63+kindedIdent :: TokenParser (String, Maybe Kind)
6264kindedIdent = (, Nothing) <$> identifier
63− <|> parens ((,) <$> identifier <*> (Just <$> (indented *> lexeme (P.string "::") *> indented *> parseKind)))
65+ <|> parens ((,) <$> identifier <*> (Just <$> (indented *> doubleColon *> indented *> parseKind)))
6466
65−parseDataDeclaration :: P.Parsec String ParseState Declaration
67+parseDataDeclaration :: TokenParser Declaration
6668parseDataDeclaration = do
6769 dtype <- (reserved "data" *> return Data) <|> (reserved "newtype" *> return Newtype)
6870 name <- indented *> properName
6971 tyArgs <- many (indented *> kindedIdent)
7072 ctors <- P.option [] $ do
71− _ <- lexeme $ indented *> P.char '='
72− sepBy1 ((,) <$> properName <*> P.many (indented *> noWildcards parseTypeAtom)) pipe
73+ indented *> equals
74+ P.sepBy1 ((,) <$> properName <*> P.many (indented *> noWildcards parseTypeAtom)) pipe
7375 return $ DataDeclaration dtype name tyArgs ctors
7476
75−parseTypeDeclaration :: P.Parsec String ParseState Declaration
77+parseTypeDeclaration :: TokenParser Declaration
7678parseTypeDeclaration =
77− TypeDeclaration <$> P.try (parseIdent <* lexeme (indented *> P.string "::"))
79+ TypeDeclaration <$> P.try (parseIdent <* indented <* doubleColon)
7880 <*> parsePolyType
7981
80−parseTypeSynonymDeclaration :: P.Parsec String ParseState Declaration
82+parseTypeSynonymDeclaration :: TokenParser Declaration
8183parseTypeSynonymDeclaration =
8284 TypeSynonymDeclaration <$> (P.try (reserved "type") *> indented *> properName)
8385 <*> many (indented *> kindedIdent)
84− <*> (lexeme (indented *> P.char '=') *> noWildcards parsePolyType)
86+ <*> (indented *> equals *> noWildcards parsePolyType)
8587
86−parseValueDeclaration :: P.Parsec String ParseState Declaration
88+parseValueDeclaration :: TokenParser Declaration
8789parseValueDeclaration = do
8890 name <- parseIdent
8991 binders <- P.many parseBinderNoParens
9092 value <- Left <$> (C.indented *>
9193 P.many1 ((,) <$> parseGuard
92− <*> (lexeme (indented *> P.char '=') *> parseValueWithWhereClause)
94+ <*> (indented *> equals *> parseValueWithWhereClause)
9395 ))
94− <|> Right <$> (lexeme (indented *> P.char '=') *> parseValueWithWhereClause)
96+ <|> Right <$> (indented *> equals *> parseValueWithWhereClause)
9597 return $ ValueDeclaration name Value binders value
9698 where
97− parseValueWithWhereClause :: P.Parsec String ParseState Expr
99+ parseValueWithWhereClause :: TokenParser Expr
98100 parseValueWithWhereClause = do
99101 value <- parseValue
100102 whereClause <- P.optionMaybe $ do
@@ -104,42 +106,42 @@ parseValueDeclaration = do
104106 C.mark $ P.many1 (C.same *> parseLocalDeclaration)
105107 return $ maybe value (`Let` value) whereClause
106108
107−parseExternDeclaration :: P.Parsec String ParseState Declaration
109+parseExternDeclaration :: TokenParser Declaration
108110parseExternDeclaration = P.try (reserved "foreign") *> indented *> reserved "import" *> indented *>
109111 (ExternDataDeclaration <$> (P.try (reserved "data") *> indented *> properName)
110− <*> (lexeme (indented *> P.string "::") *> parseKind)
112+ <*> (indented *> doubleColon *> parseKind)
111113 <|> (do reserved "instance"
112− name <- parseIdent <* lexeme (indented *> P.string "::")
114+ name <- parseIdent <* indented <* doubleColon
113115 deps <- P.option [] $ do
114116 deps <- parens (commaSep1 ((,) <$> parseQualified properName <*> P.many (noWildcards parseTypeAtom)))
115117 indented
116− reservedOp "=>"
118+ rfatArrow
117119 return deps
118120 className <- indented *> parseQualified properName
119121 tys <- P.many (indented *> noWildcards parseTypeAtom)
120122 return $ ExternInstanceDeclaration name deps className tys)
121123 <|> (do ident <- parseIdent
122124 js <- P.optionMaybe (JSRaw <$> stringLiteral)
123− ty <- lexeme (indented *> P.string "::") *> noWildcards parsePolyType
125+ ty <- indented *> doubleColon *> noWildcards parsePolyType
124126 return $ ExternDeclaration (if isJust js then InlineJavascript else ForeignImport) ident js ty))
125127
126−parseAssociativity :: P.Parsec String ParseState Associativity
128+parseAssociativity :: TokenParser Associativity
127129parseAssociativity =
128130 (P.try (reserved "infixl") >> return Infixl) <|>
129131 (P.try (reserved "infixr") >> return Infixr) <|>
130132 (P.try (reserved "infix") >> return Infix)
131133
132−parseFixity :: P.Parsec String ParseState Fixity
134+parseFixity :: TokenParser Fixity
133135parseFixity = Fixity <$> parseAssociativity <*> (indented *> natural)
134136
135−parseFixityDeclaration :: P.Parsec String ParseState Declaration
137+parseFixityDeclaration :: TokenParser Declaration
136138parseFixityDeclaration = do
137139 fixity <- parseFixity
138140 indented
139− name <- operator
141+ name <- symbol
140142 return $ FixityDeclaration fixity name
141143
142−parseImportDeclaration :: P.Parsec String ParseState Declaration
144+parseImportDeclaration :: TokenParser Declaration
143145parseImportDeclaration = do
144146 reserved "import"
145147 indented
@@ -169,20 +171,20 @@ parseImportDeclaration = do
169171 return $ fromMaybe Unqualified (expectedType <$> idents)
170172
171173
172−parseDeclarationRef :: P.Parsec String ParseState DeclarationRef
174+parseDeclarationRef :: TokenParser DeclarationRef
173175parseDeclarationRef = withSourceSpan PositionedDeclarationRef $
174176 ValueRef <$> parseIdent
175177 <|> do name <- properName
176− dctors <- P.optionMaybe $ parens (lexeme (P.string "..") *> pure Nothing <|> Just <$> commaSep properName)
178+ dctors <- P.optionMaybe $ parens (symbol' ".." *> pure Nothing <|> Just <$> commaSep properName)
177179 return $ maybe (TypeClassRef name) (TypeRef name) dctors
178180
179−parseTypeClassDeclaration :: P.Parsec String ParseState Declaration
181+parseTypeClassDeclaration :: TokenParser Declaration
180182parseTypeClassDeclaration = do
181183 reserved "class"
182184 implies <- P.option [] $ do
183185 indented
184186 implies <- parens (commaSep1 ((,) <$> parseQualified properName <*> P.many (noWildcards parseTypeAtom)))
185− reservedOp "<="
187+ lfatArrow
186188 return implies
187189 className <- indented *> properName
188190 idents <- P.many (indented *> kindedIdent)
@@ -191,14 +193,14 @@ parseTypeClassDeclaration = do
191193 mark (P.many (same *> positioned parseTypeDeclaration))
192194 return $ TypeClassDeclaration className idents implies members
193195
194−parseTypeInstanceDeclaration :: P.Parsec String ParseState Declaration
196+parseTypeInstanceDeclaration :: TokenParser Declaration
195197parseTypeInstanceDeclaration = do
196198 reserved "instance"
197− name <- parseIdent <* lexeme (indented *> P.string "::")
199+ name <- parseIdent <* indented <* doubleColon
198200 deps <- P.optionMaybe $ do
199201 deps <- parens (commaSep1 ((,) <$> parseQualified properName <*> P.many (noWildcards parseTypeAtom)))
200202 indented
201− reservedOp "=>"
203+ rfatArrow
202204 return deps
203205 className <- indented *> parseQualified properName
204206 ty <- P.many (indented *> (noWildcards parseTypeAtom))
@@ -207,13 +209,13 @@ parseTypeInstanceDeclaration = do
207209 mark (P.many (same *> positioned parseValueDeclaration))
208210 return $ TypeInstanceDeclaration name (fromMaybe [] deps) className ty members
209211
210−positioned :: P.Parsec String ParseState Declaration -> P.Parsec String ParseState Declaration
212+positioned :: TokenParser Declaration -> TokenParser Declaration
211213positioned d = withSourceSpan PositionedDeclaration d
212214
213215-- |
214216-- Parse a single declaration
215217--
216−parseDeclaration :: P.Parsec String ParseState Declaration
218+parseDeclaration :: TokenParser Declaration
217219parseDeclaration = positioned (P.choice
218220 [ parseDataDeclaration
219221 , parseTypeDeclaration
@@ -226,7 +228,7 @@ parseDeclaration = positioned (P.choice
226228 , parseTypeInstanceDeclaration
227229 ]) P.<?> "declaration"
228230
229−parseLocalDeclaration :: P.Parsec String ParseState Declaration
231+parseLocalDeclaration :: TokenParser Declaration
230232parseLocalDeclaration = positioned (P.choice
231233 [ parseTypeDeclaration
232234 , parseValueDeclaration
@@ -235,13 +237,13 @@ parseLocalDeclaration = positioned (P.choice
235237-- |
236238-- Parse a module header and a collection of declarations
237239--
238−parseModule :: P.Parsec String ParseState Module
240+parseModule :: TokenParser Module
239241parseModule = do
240242 reserved "module"
241243 indented
242244 name <- moduleName
243245 exports <- P.optionMaybe $ parens $ commaSep1 parseDeclarationRef
244− _ <- lexeme $ P.string "where"
246+ reserved "where"
245247 decls <- mark (P.many (same *> parseDeclaration))
246248 return $ Module name decls exports
247249
@@ -250,9 +252,11 @@ parseModule = do
250252--
251253parseModulesFromFiles :: (k -> String) -> [(k, String)] -> Either P.ParseError [(k, Module)]
252254parseModulesFromFiles toFilePath input =
253− fmap collect . forM input $ \(filename, content) -> do
254− ms <- runIndentParser (toFilePath filename) parseModules content
255− return (filename, ms)
255+ fmap collect . forM input $ \(k, content) -> do
256+ let filename = toFilePath k
257+ ts <- lex filename content
258+ ms <- runTokenParser filename parseModules ts
259+ return (k, ms)
256260 where
257261 collect :: [(k, [v])] -> [(k, v)]
258262 collect vss = [ (k, v) | (k, vs) <- vss, v <- vs ]
@@ -260,77 +264,77 @@ parseModulesFromFiles toFilePath input =
260264-- |
261265-- Parse a collection of modules
262266--
263−parseModules :: P.Parsec String ParseState [Module]
264−parseModules = whiteSpace *> mark (P.many (same *> parseModule)) <* P.eof
267+parseModules :: TokenParser [Module]
268+parseModules = mark (P.many (same *> parseModule)) <* P.eof
265269
266−booleanLiteral :: P.Parsec String ParseState Bool
267−booleanLiteral = (C.reserved "true" >> return True) P.<|> (C.reserved "false" >> return False)
270+booleanLiteral :: TokenParser Bool
271+booleanLiteral = (reserved "true" >> return True) P.<|> (reserved "false" >> return False)
268272
269−parseNumericLiteral :: P.Parsec String ParseState Expr
270−parseNumericLiteral = NumericLiteral <$> C.integerOrFloat
273+parseNumericLiteral :: TokenParser Expr
274+parseNumericLiteral = NumericLiteral <$> number
271275
272−parseStringLiteral :: P.Parsec String ParseState Expr
273−parseStringLiteral = StringLiteral <$> C.stringLiteral
276+parseStringLiteral :: TokenParser Expr
277+parseStringLiteral = StringLiteral <$> stringLiteral
274278
275−parseBooleanLiteral :: P.Parsec String ParseState Expr
279+parseBooleanLiteral :: TokenParser Expr
276280parseBooleanLiteral = BooleanLiteral <$> booleanLiteral
277281
278−parseArrayLiteral :: P.Parsec String ParseState Expr
279−parseArrayLiteral = ArrayLiteral <$> C.squares (C.commaSep parseValue)
282+parseArrayLiteral :: TokenParser Expr
283+parseArrayLiteral = ArrayLiteral <$> squares (commaSep parseValue)
280284
281−parseObjectLiteral :: P.Parsec String ParseState Expr
282−parseObjectLiteral = ObjectLiteral <$> C.braces (C.commaSep parseIdentifierAndValue)
285+parseObjectLiteral :: TokenParser Expr
286+parseObjectLiteral = ObjectLiteral <$> braces (commaSep parseIdentifierAndValue)
283287
284−parseIdentifierAndValue :: P.Parsec String ParseState (String, Expr)
285−parseIdentifierAndValue = (,) <$> (C.indented *> (C.identifierName <|> C.stringLiteral) <* C.indented <* C.colon)
288+parseIdentifierAndValue :: TokenParser (String, Expr)
289+parseIdentifierAndValue = (,) <$> (C.indented *> (lname <|> stringLiteral) <* C.indented <* colon)
286290 <*> (C.indented *> parseValue)
287291
288−parseAbs :: P.Parsec String ParseState Expr
292+parseAbs :: TokenParser Expr
289293parseAbs = do
290− C.reservedOp "\\"
294+ symbol' "\\"
291295 args <- P.many1 (C.indented *> (Abs <$> (Left <$> P.try C.parseIdent <|> Right <$> parseBinderNoParens)))
292− C.indented *> C.reservedOp "->"
296+ C.indented *> rarrow
293297 value <- parseValue
294298 return $ toFunction args value
295299 where
296300 toFunction :: [Expr -> Expr] -> Expr -> Expr
297301 toFunction args value = foldr ($) value args
298302
299−parseVar :: P.Parsec String ParseState Expr
303+parseVar :: TokenParser Expr
300304parseVar = Var <$> C.parseQualified C.parseIdent
301305
302−parseConstructor :: P.Parsec String ParseState Expr
306+parseConstructor :: TokenParser Expr
303307parseConstructor = Constructor <$> C.parseQualified C.properName
304308
305−parseCase :: P.Parsec String ParseState Expr
306−parseCase = Case <$> P.between (P.try (C.reserved "case")) (C.indented *> C.reserved "of") (return <$> parseValue)
309+parseCase :: TokenParser Expr
310+parseCase = Case <$> P.between (P.try (reserved "case")) (C.indented *> reserved "of") (return <$> parseValue)
307311 <*> (C.indented *> C.mark (P.many (C.same *> C.mark parseCaseAlternative)))
308312
309−parseCaseAlternative :: P.Parsec String ParseState CaseAlternative
313+parseCaseAlternative :: TokenParser CaseAlternative
310314parseCaseAlternative = CaseAlternative <$> (return <$> parseBinder)
311315 <*> (Left <$> (C.indented *>
312316 P.many1 ((,) <$> parseGuard
313− <*> (lexeme (indented *> C.reservedOp "->") *> parseValue)
317+ <*> (indented *> rarrow *> parseValue)
314318 ))
315− <|> Right <$> (lexeme (indented *> C.reservedOp "->") *> parseValue))
319+ <|> Right <$> (indented *> rarrow *> parseValue))
316320 P.<?> "case alternative"
317321
318−parseIfThenElse :: P.Parsec String ParseState Expr
319−parseIfThenElse = IfThenElse <$> (P.try (C.reserved "if") *> C.indented *> parseValue)
320− <*> (C.indented *> C.reserved "then" *> C.indented *> parseValue)
321− <*> (C.indented *> C.reserved "else" *> C.indented *> parseValue)
322+parseIfThenElse :: TokenParser Expr
323+parseIfThenElse = IfThenElse <$> (P.try (reserved "if") *> C.indented *> parseValue)
324+ <*> (C.indented *> reserved "then" *> C.indented *> parseValue)
325+ <*> (C.indented *> reserved "else" *> C.indented *> parseValue)
322326
323−parseLet :: P.Parsec String ParseState Expr
327+parseLet :: TokenParser Expr
324328parseLet = do
325− C.reserved "let"
329+ reserved "let"
326330 C.indented
327331 ds <- C.mark $ P.many1 (C.same *> parseLocalDeclaration)
328332 C.indented
329− C.reserved "in"
333+ reserved "in"
330334 result <- parseValue
331335 return $ Let ds result
332336
333−parseValueAtom :: P.Parsec String ParseState Expr
337+parseValueAtom :: TokenParser Expr
334338parseValueAtom = P.choice
335339 [ P.try parseNumericLiteral
336340 , P.try parseStringLiteral
@@ -344,32 +348,32 @@ parseValueAtom = P.choice
344348 , parseIfThenElse
345349 , parseDo
346350 , parseLet
347− , Parens <$> C.parens parseValue ]
351+ , Parens <$> parens parseValue ]
348352
349−parsePropertyUpdate :: P.Parsec String ParseState (String, Expr)
353+parsePropertyUpdate :: TokenParser (String, Expr)
350354parsePropertyUpdate = do
351− name <- C.lexeme (C.identifierName <|> C.stringLiteral)
352− _ <- C.lexeme $ C.indented *> P.char '='
355+ name <- lname <|> stringLiteral
356+ _ <- C.indented *> equals
353357 value <- C.indented *> parseValue
354358 return (name, value)
355359
356−parseAccessor :: Expr -> P.Parsec String ParseState Expr
360+parseAccessor :: Expr -> TokenParser Expr
357361parseAccessor (Constructor _) = P.unexpected "constructor"
358−parseAccessor obj = P.try $ Accessor <$> (C.indented *> C.dot *> P.notFollowedBy C.opLetter *> C.indented *> (C.identifierName <|> C.stringLiteral)) <*> pure obj
362+parseAccessor obj = P.try $ Accessor <$> (C.indented *> dot *> C.indented *> (lname <|> stringLiteral)) <*> pure obj
359363
360−parseDo :: P.Parsec String ParseState Expr
364+parseDo :: TokenParser Expr
361365parseDo = do
362− C.reserved "do"
366+ reserved "do"
363367 C.indented
364368 Do <$> C.mark (P.many (C.same *> C.mark parseDoNotationElement))
365369
366−parseDoNotationLet :: P.Parsec String ParseState DoNotationElement
367−parseDoNotationLet = DoNotationLet <$> (C.reserved "let" *> C.indented *> C.mark (P.many1 (C.same *> parseLocalDeclaration)))
370+parseDoNotationLet :: TokenParser DoNotationElement
371+parseDoNotationLet = DoNotationLet <$> (reserved "let" *> C.indented *> C.mark (P.many1 (C.same *> parseLocalDeclaration)))
368372
369−parseDoNotationBind :: P.Parsec String ParseState DoNotationElement
370−parseDoNotationBind = DoNotationBind <$> parseBinder <*> (C.indented *> C.reservedOp "<-" *> parseValue)
373+parseDoNotationBind :: TokenParser DoNotationElement
374+parseDoNotationBind = DoNotationBind <$> parseBinder <*> (C.indented *> larrow *> parseValue)
371375
372−parseDoNotationElement :: P.Parsec String ParseState DoNotationElement
376+parseDoNotationElement :: TokenParser DoNotationElement
373377parseDoNotationElement = P.choice
374378 [ P.try parseDoNotationBind
375379 , parseDoNotationLet
@@ -378,7 +382,7 @@ parseDoNotationElement = P.choice
378382-- |
379383-- Parse a value
380384--
381−parseValue :: P.Parsec String ParseState Expr
385+parseValue :: TokenParser Expr
382386parseValue = withSourceSpan PositionedValue
383387 (P.buildExpressionParser operators
384388 . C.buildPostfixParser postfixTable2
@@ -386,68 +390,68 @@ parseValue = withSourceSpan PositionedValue
386390 where
387391 indexersAndAccessors = C.buildPostfixParser postfixTable1 parseValueAtom
388392 postfixTable1 = [ parseAccessor
389− , \v -> P.try $ flip ObjectUpdate <$> (C.indented *> C.braces (C.commaSep1 (C.indented *> parsePropertyUpdate))) <*> pure v ]
393+ , \v -> P.try $ flip ObjectUpdate <$> (C.indented *> braces (commaSep1 (C.indented *> parsePropertyUpdate))) <*> pure v ]
390394 postfixTable2 = [ \v -> P.try (flip App <$> (C.indented *> indexersAndAccessors)) <*> pure v
391− , \v -> flip (TypedValue True) <$> (P.try (C.lexeme (C.indented *> P.string "::")) *> parsePolyType) <*> pure v
395+ , \v -> flip (TypedValue True) <$> (P.try (C.indented *> doubleColon) *> parsePolyType) <*> pure v
392396 ]
393− operators = [ [ P.Prefix (C.lexeme (P.try (C.indented *> P.char '-') >> return UnaryMinus))
397+ operators = [ [ P.Prefix (P.try (C.indented *> symbol' "-") >> return UnaryMinus)
394398 ]
395− , [ P.Infix (C.lexeme (P.try (C.indented *> C.parseIdentInfix P.<?> "operator") >>= \ident ->
396− return (BinaryNoParens ident))) P.AssocRight
399+ , [ P.Infix (P.try (C.indented *> C.parseIdentInfix P.<?> "operator") >>= \ident ->
400+ return (BinaryNoParens ident)) P.AssocRight
397401 ]
398402 ]
399403
400−parseStringBinder :: P.Parsec String ParseState Binder
401−parseStringBinder = StringBinder <$> C.stringLiteral
404+parseStringBinder :: TokenParser Binder
405+parseStringBinder = StringBinder <$> stringLiteral
402406
403−parseBooleanBinder :: P.Parsec String ParseState Binder
407+parseBooleanBinder :: TokenParser Binder
404408parseBooleanBinder = BooleanBinder <$> booleanLiteral
405409
406−parseNumberBinder :: P.Parsec String ParseState Binder
407−parseNumberBinder = NumberBinder <$> (C.lexeme sign <*> C.integerOrFloat)
410+parseNumberBinder :: TokenParser Binder
411+parseNumberBinder = NumberBinder <$> (sign <*> number)
408412 where
409− sign :: P.Parsec String ParseState (Either Integer Double -> Either Integer Double)
410− sign = (P.char '-' >> return (negate +++ negate))
411− <|> (P.char '+' >> return id)
413+ sign :: TokenParser (Either Integer Double -> Either Integer Double)
414+ sign = (symbol' "-" >> return (negate +++ negate))
415+ <|> (symbol' "+" >> return id)
412416 <|> return id
413417
414−parseVarBinder :: P.Parsec String ParseState Binder
418+parseVarBinder :: TokenParser Binder
415419parseVarBinder = VarBinder <$> C.parseIdent
416420
417−parseNullaryConstructorBinder :: P.Parsec String ParseState Binder
418−parseNullaryConstructorBinder = ConstructorBinder <$> C.lexeme (C.parseQualified C.properName) <*> pure []
421+parseNullaryConstructorBinder :: TokenParser Binder
422+parseNullaryConstructorBinder = ConstructorBinder <$> C.parseQualified C.properName <*> pure []
419423
420−parseConstructorBinder :: P.Parsec String ParseState Binder
421−parseConstructorBinder = ConstructorBinder <$> C.lexeme (C.parseQualified C.properName) <*> many (C.indented *> parseBinderNoParens)
424+parseConstructorBinder :: TokenParser Binder
425+parseConstructorBinder = ConstructorBinder <$> C.parseQualified C.properName <*> many (C.indented *> parseBinderNoParens)
422426
423−parseObjectBinder :: P.Parsec String ParseState Binder
424−parseObjectBinder = ObjectBinder <$> C.braces (C.commaSep (C.indented *> parseIdentifierAndBinder))
427+parseObjectBinder :: TokenParser Binder
428+parseObjectBinder = ObjectBinder <$> braces (commaSep (C.indented *> parseIdentifierAndBinder))
425429
426−parseArrayBinder :: P.Parsec String ParseState Binder
427−parseArrayBinder = C.squares $ ArrayBinder <$> C.commaSep (C.indented *> parseBinder)
430+parseArrayBinder :: TokenParser Binder
431+parseArrayBinder = squares $ ArrayBinder <$> commaSep (C.indented *> parseBinder)
428432
429−parseNamedBinder :: P.Parsec String ParseState Binder
430−parseNamedBinder = NamedBinder <$> (C.parseIdent <* C.indented <* C.lexeme (P.char '@'))
433+parseNamedBinder :: TokenParser Binder
434+parseNamedBinder = NamedBinder <$> (C.parseIdent <* C.indented <* at)
431435 <*> (C.indented *> parseBinder)
432436
433−parseNullBinder :: P.Parsec String ParseState Binder
434−parseNullBinder = C.lexeme (P.char '_' *> P.notFollowedBy C.identLetter) *> return NullBinder
437+parseNullBinder :: TokenParser Binder
438+parseNullBinder = reserved "_" *> return NullBinder
435439
436−parseIdentifierAndBinder :: P.Parsec String ParseState (String, Binder)
440+parseIdentifierAndBinder :: TokenParser (String, Binder)
437441parseIdentifierAndBinder = do
438− name <- C.lexeme (C.identifierName <|> C.stringLiteral)
439− _ <- C.lexeme $ C.indented *> (P.char '=' <|> P.char ':')
442+ name <- lname <|> stringLiteral
443+ C.indented *> (equals <|> colon)
440444 binder <- C.indented *> parseBinder
441445 return (name, binder)
442446
443447-- |
444448-- Parse a binder
445449--
446−parseBinder :: P.Parsec String ParseState Binder
450+parseBinder :: TokenParser Binder
447451parseBinder = withSourceSpan PositionedBinder (P.buildExpressionParser operators parseBinderAtom P.<?> "expression")
448452 where
449− operators = [ [ P.Infix ( C.lexeme (P.try $ C.indented *> C.reservedOp ":") >> return ConsBinder) P.AssocRight ] ]
450− parseBinderAtom :: P.Parsec String ParseState Binder
453+ operators = [ [ P.Infix (P.try $ C.indented *> colon *> return ConsBinder) P.AssocRight ] ]
454+ parseBinderAtom :: TokenParser Binder
451455 parseBinderAtom = P.choice (map P.try
452456 [ parseNullBinder
453457 , parseStringBinder
@@ -458,12 +462,12 @@ parseBinder = withSourceSpan PositionedBinder (P.buildExpressionParser operators
458462 , parseConstructorBinder
459463 , parseObjectBinder
460464 , parseArrayBinder
461− , C.parens parseBinder ]) P.<?> "binder"
465+ , parens parseBinder ]) P.<?> "binder"
462466
463467-- |
464468-- Parse a binder as it would appear in a top level declaration
465469--
466−parseBinderNoParens :: P.Parsec String ParseState Binder
470+parseBinderNoParens :: TokenParser Binder
467471parseBinderNoParens = P.choice (map P.try
468472 [ parseNullBinder
469473 , parseStringBinder
@@ -474,11 +478,11 @@ parseBinderNoParens = P.choice (map P.try
474478 , parseNullaryConstructorBinder
475479 , parseObjectBinder
476480 , parseArrayBinder
477− , C.parens parseBinder ]) P.<?> "binder"
481+ , parens parseBinder ]) P.<?> "binder"
478482-- |
479483-- Parse a guard
480484--
481−parseGuard :: P.Parsec String ParseState Guard
482−parseGuard = C.pipe *> C.indented *> parseValue
485+parseGuard :: TokenParser Guard
486+parseGuard = pipe *> C.indented *> parseValue
483487
484488