@@ -26,6 +26,8 @@ module Language.PureScript.Parser.Declarations (
26 parseBinderNoParens,
26 parseBinderNoParens,
29+import Prelude hiding (lex)
29import Data.Maybe (isJust, fromMaybe)
31import Data.Maybe (isJust, fromMaybe)
30import Data.Traversable (forM)
32import Data.Traversable (forM)
@@ -33,11 +35,11 @@ import Control.Applicative
33import Control.Arrow ((+++))
35import Control.Arrow ((+++))
35import Language.PureScript.Kinds
37import Language.PureScript.Kinds
36−import Language.PureScript.Parser.State
37import Language.PureScript.Parser.Common
38import Language.PureScript.Parser.Common
38import Language.PureScript.AST
39import Language.PureScript.AST
39import Language.PureScript.Parser.Types
40import Language.PureScript.Parser.Types
40import Language.PureScript.Parser.Kinds
41import Language.PureScript.Parser.Kinds
42+import Language.PureScript.Parser.Lexer
41import Language.PureScript.CodeGen.JS.AST
43import Language.PureScript.CodeGen.JS.AST
42import Language.PureScript.Environment
44import Language.PureScript.Environment
@@ -58,43 +60,43 @@ withSourceSpan f p = do
59 toSourcePos pos = SourcePos (P.sourceLine pos) (P.sourceColumn pos)
61 toSourcePos pos = SourcePos (P.sourceLine pos) (P.sourceColumn pos)
61−kindedIdent :: P.Parsec String ParseState (String, Maybe Kind)
63+kindedIdent :: TokenParser (String, Maybe Kind)
62kindedIdent = (, Nothing) <$> identifier
64kindedIdent = (, Nothing) <$> identifier
63− <|> parens ((,) <$> identifier <*> (Just <$> (indented *> lexeme (P.string "::") *> indented *> parseKind)))
65+ <|> parens ((,) <$> identifier <*> (Just <$> (indented *> doubleColon *> indented *> parseKind)))
65−parseDataDeclaration :: P.Parsec String ParseState Declaration
67+parseDataDeclaration :: TokenParser Declaration
66parseDataDeclaration = do
68parseDataDeclaration = do
67 dtype <- (reserved "data" *> return Data) <|> (reserved "newtype" *> return Newtype)
69 dtype <- (reserved "data" *> return Data) <|> (reserved "newtype" *> return Newtype)
68 name <- indented *> properName
70 name <- indented *> properName
69 tyArgs <- many (indented *> kindedIdent)
71 tyArgs <- many (indented *> kindedIdent)
70 ctors <- P.option [] $ do
72 ctors <- P.option [] $ do
71− _ <- lexeme $ indented *> P.char '='
73+ indented *> equals
72− sepBy1 ((,) <$> properName <*> P.many (indented *> noWildcards parseTypeAtom)) pipe
74+ P.sepBy1 ((,) <$> properName <*> P.many (indented *> noWildcards parseTypeAtom)) pipe
73 return $ DataDeclaration dtype name tyArgs ctors
75 return $ DataDeclaration dtype name tyArgs ctors
75−parseTypeDeclaration :: P.Parsec String ParseState Declaration
77+parseTypeDeclaration :: TokenParser Declaration
76parseTypeDeclaration =
78parseTypeDeclaration =
77− TypeDeclaration <$> P.try (parseIdent <* lexeme (indented *> P.string "::"))
79+ TypeDeclaration <$> P.try (parseIdent <* indented <* doubleColon)
78 <*> parsePolyType
80 <*> parsePolyType
80−parseTypeSynonymDeclaration :: P.Parsec String ParseState Declaration
82+parseTypeSynonymDeclaration :: TokenParser Declaration
81parseTypeSynonymDeclaration =
83parseTypeSynonymDeclaration =
82 TypeSynonymDeclaration <$> (P.try (reserved "type") *> indented *> properName)
84 TypeSynonymDeclaration <$> (P.try (reserved "type") *> indented *> properName)
83 <*> many (indented *> kindedIdent)
85 <*> many (indented *> kindedIdent)
84− <*> (lexeme (indented *> P.char '=') *> noWildcards parsePolyType)
86+ <*> (indented *> equals *> noWildcards parsePolyType)
86−parseValueDeclaration :: P.Parsec String ParseState Declaration
88+parseValueDeclaration :: TokenParser Declaration
87parseValueDeclaration = do
89parseValueDeclaration = do
88 name <- parseIdent
90 name <- parseIdent
89 binders <- P.many parseBinderNoParens
91 binders <- P.many parseBinderNoParens
90 value <- Left <$> (C.indented *>
92 value <- Left <$> (C.indented *>
91 P.many1 ((,) <$> parseGuard
93 P.many1 ((,) <$> parseGuard
92− <*> (lexeme (indented *> P.char '=') *> parseValueWithWhereClause)
94+ <*> (indented *> equals *> parseValueWithWhereClause)
94− <|> Right <$> (lexeme (indented *> P.char '=') *> parseValueWithWhereClause)
96+ <|> Right <$> (indented *> equals *> parseValueWithWhereClause)
95 return $ ValueDeclaration name Value binders value
97 return $ ValueDeclaration name Value binders value
97− parseValueWithWhereClause :: P.Parsec String ParseState Expr
99+ parseValueWithWhereClause :: TokenParser Expr
98 parseValueWithWhereClause = do
100 parseValueWithWhereClause = do
99 value <- parseValue
101 value <- parseValue
100 whereClause <- P.optionMaybe $ do
102 whereClause <- P.optionMaybe $ do
@@ -104,42 +106,42 @@ parseValueDeclaration = do
104 C.mark $ P.many1 (C.same *> parseLocalDeclaration)
106 C.mark $ P.many1 (C.same *> parseLocalDeclaration)
105 return $ maybe value (`Let` value) whereClause
107 return $ maybe value (`Let` value) whereClause
107−parseExternDeclaration :: P.Parsec String ParseState Declaration
109+parseExternDeclaration :: TokenParser Declaration
108parseExternDeclaration = P.try (reserved "foreign") *> indented *> reserved "import" *> indented *>
110parseExternDeclaration = P.try (reserved "foreign") *> indented *> reserved "import" *> indented *>
109 (ExternDataDeclaration <$> (P.try (reserved "data") *> indented *> properName)
111 (ExternDataDeclaration <$> (P.try (reserved "data") *> indented *> properName)
110− <*> (lexeme (indented *> P.string "::") *> parseKind)
112+ <*> (indented *> doubleColon *> parseKind)
111 <|> (do reserved "instance"
113 <|> (do reserved "instance"
112− name <- parseIdent <* lexeme (indented *> P.string "::")
114+ name <- parseIdent <* indented <* doubleColon
113 deps <- P.option [] $ do
115 deps <- P.option [] $ do
114 deps <- parens (commaSep1 ((,) <$> parseQualified properName <*> P.many (noWildcards parseTypeAtom)))
116 deps <- parens (commaSep1 ((,) <$> parseQualified properName <*> P.many (noWildcards parseTypeAtom)))
116− reservedOp "=>"
118+ rfatArrow
117 return deps
119 return deps
118 className <- indented *> parseQualified properName
120 className <- indented *> parseQualified properName
119 tys <- P.many (indented *> noWildcards parseTypeAtom)
121 tys <- P.many (indented *> noWildcards parseTypeAtom)
120 return $ ExternInstanceDeclaration name deps className tys)
122 return $ ExternInstanceDeclaration name deps className tys)
121 <|> (do ident <- parseIdent
123 <|> (do ident <- parseIdent
122 js <- P.optionMaybe (JSRaw <$> stringLiteral)
124 js <- P.optionMaybe (JSRaw <$> stringLiteral)
123− ty <- lexeme (indented *> P.string "::") *> noWildcards parsePolyType
125+ ty <- indented *> doubleColon *> noWildcards parsePolyType
124 return $ ExternDeclaration (if isJust js then InlineJavascript else ForeignImport) ident js ty))
126 return $ ExternDeclaration (if isJust js then InlineJavascript else ForeignImport) ident js ty))
126−parseAssociativity :: P.Parsec String ParseState Associativity
128+parseAssociativity :: TokenParser Associativity
127parseAssociativity =
129parseAssociativity =
128 (P.try (reserved "infixl") >> return Infixl) <|>
130 (P.try (reserved "infixl") >> return Infixl) <|>
129 (P.try (reserved "infixr") >> return Infixr) <|>
131 (P.try (reserved "infixr") >> return Infixr) <|>
130 (P.try (reserved "infix") >> return Infix)
132 (P.try (reserved "infix") >> return Infix)
132−parseFixity :: P.Parsec String ParseState Fixity
134+parseFixity :: TokenParser Fixity
133parseFixity = Fixity <$> parseAssociativity <*> (indented *> natural)
135parseFixity = Fixity <$> parseAssociativity <*> (indented *> natural)
135−parseFixityDeclaration :: P.Parsec String ParseState Declaration
137+parseFixityDeclaration :: TokenParser Declaration
136parseFixityDeclaration = do
138parseFixityDeclaration = do
137 fixity <- parseFixity
139 fixity <- parseFixity
139− name <- operator
141+ name <- symbol
140 return $ FixityDeclaration fixity name
142 return $ FixityDeclaration fixity name
142−parseImportDeclaration :: P.Parsec String ParseState Declaration
144+parseImportDeclaration :: TokenParser Declaration
143parseImportDeclaration = do
145parseImportDeclaration = do
144 reserved "import"
146 reserved "import"
@@ -169,20 +171,20 @@ parseImportDeclaration = do
169 return $ fromMaybe Unqualified (expectedType <$> idents)
171 return $ fromMaybe Unqualified (expectedType <$> idents)
172−parseDeclarationRef :: P.Parsec String ParseState DeclarationRef
174+parseDeclarationRef :: TokenParser DeclarationRef
173parseDeclarationRef = withSourceSpan PositionedDeclarationRef $
175parseDeclarationRef = withSourceSpan PositionedDeclarationRef $
174 ValueRef <$> parseIdent
176 ValueRef <$> parseIdent
175 <|> do name <- properName
177 <|> 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)
177 return $ maybe (TypeClassRef name) (TypeRef name) dctors
179 return $ maybe (TypeClassRef name) (TypeRef name) dctors
179−parseTypeClassDeclaration :: P.Parsec String ParseState Declaration
181+parseTypeClassDeclaration :: TokenParser Declaration
180parseTypeClassDeclaration = do
182parseTypeClassDeclaration = do
181 reserved "class"
183 reserved "class"
182 implies <- P.option [] $ do
184 implies <- P.option [] $ do
184 implies <- parens (commaSep1 ((,) <$> parseQualified properName <*> P.many (noWildcards parseTypeAtom)))
186 implies <- parens (commaSep1 ((,) <$> parseQualified properName <*> P.many (noWildcards parseTypeAtom)))
185− reservedOp "<="
187+ lfatArrow
186 return implies
188 return implies
187 className <- indented *> properName
189 className <- indented *> properName
188 idents <- P.many (indented *> kindedIdent)
190 idents <- P.many (indented *> kindedIdent)
@@ -191,14 +193,14 @@ parseTypeClassDeclaration = do
191 mark (P.many (same *> positioned parseTypeDeclaration))
193 mark (P.many (same *> positioned parseTypeDeclaration))
192 return $ TypeClassDeclaration className idents implies members
194 return $ TypeClassDeclaration className idents implies members
194−parseTypeInstanceDeclaration :: P.Parsec String ParseState Declaration
196+parseTypeInstanceDeclaration :: TokenParser Declaration
195parseTypeInstanceDeclaration = do
197parseTypeInstanceDeclaration = do
196 reserved "instance"
198 reserved "instance"
197− name <- parseIdent <* lexeme (indented *> P.string "::")
199+ name <- parseIdent <* indented <* doubleColon
198 deps <- P.optionMaybe $ do
200 deps <- P.optionMaybe $ do
199 deps <- parens (commaSep1 ((,) <$> parseQualified properName <*> P.many (noWildcards parseTypeAtom)))
201 deps <- parens (commaSep1 ((,) <$> parseQualified properName <*> P.many (noWildcards parseTypeAtom)))
201− reservedOp "=>"
203+ rfatArrow
202 return deps
204 return deps
203 className <- indented *> parseQualified properName
205 className <- indented *> parseQualified properName
204 ty <- P.many (indented *> (noWildcards parseTypeAtom))
206 ty <- P.many (indented *> (noWildcards parseTypeAtom))
@@ -207,13 +209,13 @@ parseTypeInstanceDeclaration = do
207 mark (P.many (same *> positioned parseValueDeclaration))
209 mark (P.many (same *> positioned parseValueDeclaration))
208 return $ TypeInstanceDeclaration name (fromMaybe [] deps) className ty members
210 return $ TypeInstanceDeclaration name (fromMaybe [] deps) className ty members
210−positioned :: P.Parsec String ParseState Declaration -> P.Parsec String ParseState Declaration
212+positioned :: TokenParser Declaration -> TokenParser Declaration
211positioned d = withSourceSpan PositionedDeclaration d
213positioned d = withSourceSpan PositionedDeclaration d
214-- Parse a single declaration
216-- Parse a single declaration
216−parseDeclaration :: P.Parsec String ParseState Declaration
218+parseDeclaration :: TokenParser Declaration
217parseDeclaration = positioned (P.choice
219parseDeclaration = positioned (P.choice
218 [ parseDataDeclaration
220 [ parseDataDeclaration
219 , parseTypeDeclaration
221 , parseTypeDeclaration
@@ -226,7 +228,7 @@ parseDeclaration = positioned (P.choice
226 , parseTypeInstanceDeclaration
228 , parseTypeInstanceDeclaration
227 ]) P.<?> "declaration"
229 ]) P.<?> "declaration"
229−parseLocalDeclaration :: P.Parsec String ParseState Declaration
231+parseLocalDeclaration :: TokenParser Declaration
230parseLocalDeclaration = positioned (P.choice
232parseLocalDeclaration = positioned (P.choice
231 [ parseTypeDeclaration
233 [ parseTypeDeclaration
232 , parseValueDeclaration
234 , parseValueDeclaration
@@ -235,13 +237,13 @@ parseLocalDeclaration = positioned (P.choice
236-- Parse a module header and a collection of declarations
238-- Parse a module header and a collection of declarations
238−parseModule :: P.Parsec String ParseState Module
240+parseModule :: TokenParser Module
239parseModule = do
241parseModule = do
240 reserved "module"
242 reserved "module"
242 name <- moduleName
244 name <- moduleName
243 exports <- P.optionMaybe $ parens $ commaSep1 parseDeclarationRef
245 exports <- P.optionMaybe $ parens $ commaSep1 parseDeclarationRef
244− _ <- lexeme $ P.string "where"
246+ reserved "where"
245 decls <- mark (P.many (same *> parseDeclaration))
247 decls <- mark (P.many (same *> parseDeclaration))
246 return $ Module name decls exports
248 return $ Module name decls exports
@@ -250,9 +252,11 @@ parseModule = do
251parseModulesFromFiles :: (k -> String) -> [(k, String)] -> Either P.ParseError [(k, Module)]
253parseModulesFromFiles :: (k -> String) -> [(k, String)] -> Either P.ParseError [(k, Module)]
252parseModulesFromFiles toFilePath input =
254parseModulesFromFiles toFilePath input =
253− fmap collect . forM input $ \(filename, content) -> do
255+ fmap collect . forM input $ \(k, content) -> do
254− ms <- runIndentParser (toFilePath filename) parseModules content
256+ let filename = toFilePath k
257+ ts <- lex filename content
258+ ms <- runTokenParser filename parseModules ts
255− return (filename, ms)
259+ return (k, ms)
257 collect :: [(k, [v])] -> [(k, v)]
261 collect :: [(k, [v])] -> [(k, v)]
258 collect vss = [ (k, v) | (k, vs) <- vss, v <- vs ]
262 collect vss = [ (k, v) | (k, vs) <- vss, v <- vs ]
@@ -260,77 +264,77 @@ parseModulesFromFiles toFilePath input =
261-- Parse a collection of modules
265-- Parse a collection of modules
263−parseModules :: P.Parsec String ParseState [Module]
267+parseModules :: TokenParser [Module]
264−parseModules = whiteSpace *> mark (P.many (same *> parseModule)) <* P.eof
268+parseModules = mark (P.many (same *> parseModule)) <* P.eof
266−booleanLiteral :: P.Parsec String ParseState Bool
270+booleanLiteral :: TokenParser Bool
267−booleanLiteral = (C.reserved "true" >> return True) P.<|> (C.reserved "false" >> return False)
271+booleanLiteral = (reserved "true" >> return True) P.<|> (reserved "false" >> return False)
269−parseNumericLiteral :: P.Parsec String ParseState Expr
273+parseNumericLiteral :: TokenParser Expr
270−parseNumericLiteral = NumericLiteral <$> C.integerOrFloat
274+parseNumericLiteral = NumericLiteral <$> number
272−parseStringLiteral :: P.Parsec String ParseState Expr
276+parseStringLiteral :: TokenParser Expr
273−parseStringLiteral = StringLiteral <$> C.stringLiteral
277+parseStringLiteral = StringLiteral <$> stringLiteral
275−parseBooleanLiteral :: P.Parsec String ParseState Expr
279+parseBooleanLiteral :: TokenParser Expr
276parseBooleanLiteral = BooleanLiteral <$> booleanLiteral
280parseBooleanLiteral = BooleanLiteral <$> booleanLiteral
278−parseArrayLiteral :: P.Parsec String ParseState Expr
282+parseArrayLiteral :: TokenParser Expr
279−parseArrayLiteral = ArrayLiteral <$> C.squares (C.commaSep parseValue)
283+parseArrayLiteral = ArrayLiteral <$> squares (commaSep parseValue)
281−parseObjectLiteral :: P.Parsec String ParseState Expr
285+parseObjectLiteral :: TokenParser Expr
282−parseObjectLiteral = ObjectLiteral <$> C.braces (C.commaSep parseIdentifierAndValue)
286+parseObjectLiteral = ObjectLiteral <$> braces (commaSep parseIdentifierAndValue)
284−parseIdentifierAndValue :: P.Parsec String ParseState (String, Expr)
288+parseIdentifierAndValue :: TokenParser (String, Expr)
285−parseIdentifierAndValue = (,) <$> (C.indented *> (C.identifierName <|> C.stringLiteral) <* C.indented <* C.colon)
289+parseIdentifierAndValue = (,) <$> (C.indented *> (lname <|> stringLiteral) <* C.indented <* colon)
286 <*> (C.indented *> parseValue)
290 <*> (C.indented *> parseValue)
288−parseAbs :: P.Parsec String ParseState Expr
292+parseAbs :: TokenParser Expr
289parseAbs = do
293parseAbs = do
290− C.reservedOp "\\"
294+ symbol' "\\"
291 args <- P.many1 (C.indented *> (Abs <$> (Left <$> P.try C.parseIdent <|> Right <$> parseBinderNoParens)))
295 args <- P.many1 (C.indented *> (Abs <$> (Left <$> P.try C.parseIdent <|> Right <$> parseBinderNoParens)))
292− C.indented *> C.reservedOp "->"
296+ C.indented *> rarrow
293 value <- parseValue
297 value <- parseValue
294 return $ toFunction args value
298 return $ toFunction args value
296 toFunction :: [Expr -> Expr] -> Expr -> Expr
300 toFunction :: [Expr -> Expr] -> Expr -> Expr
297 toFunction args value = foldr ($) value args
301 toFunction args value = foldr ($) value args
299−parseVar :: P.Parsec String ParseState Expr
303+parseVar :: TokenParser Expr
300parseVar = Var <$> C.parseQualified C.parseIdent
304parseVar = Var <$> C.parseQualified C.parseIdent
302−parseConstructor :: P.Parsec String ParseState Expr
306+parseConstructor :: TokenParser Expr
303parseConstructor = Constructor <$> C.parseQualified C.properName
307parseConstructor = Constructor <$> C.parseQualified C.properName
305−parseCase :: P.Parsec String ParseState Expr
309+parseCase :: TokenParser Expr
306−parseCase = Case <$> P.between (P.try (C.reserved "case")) (C.indented *> C.reserved "of") (return <$> parseValue)
310+parseCase = Case <$> P.between (P.try (reserved "case")) (C.indented *> reserved "of") (return <$> parseValue)
307 <*> (C.indented *> C.mark (P.many (C.same *> C.mark parseCaseAlternative)))
311 <*> (C.indented *> C.mark (P.many (C.same *> C.mark parseCaseAlternative)))
309−parseCaseAlternative :: P.Parsec String ParseState CaseAlternative
313+parseCaseAlternative :: TokenParser CaseAlternative
310parseCaseAlternative = CaseAlternative <$> (return <$> parseBinder)
314parseCaseAlternative = CaseAlternative <$> (return <$> parseBinder)
311 <*> (Left <$> (C.indented *>
315 <*> (Left <$> (C.indented *>
312 P.many1 ((,) <$> parseGuard
316 P.many1 ((,) <$> parseGuard
313− <*> (lexeme (indented *> C.reservedOp "->") *> parseValue)
317+ <*> (indented *> rarrow *> parseValue)
315− <|> Right <$> (lexeme (indented *> C.reservedOp "->") *> parseValue))
319+ <|> Right <$> (indented *> rarrow *> parseValue))
316 P.<?> "case alternative"
320 P.<?> "case alternative"
318−parseIfThenElse :: P.Parsec String ParseState Expr
322+parseIfThenElse :: TokenParser Expr
319−parseIfThenElse = IfThenElse <$> (P.try (C.reserved "if") *> C.indented *> parseValue)
323+parseIfThenElse = IfThenElse <$> (P.try (reserved "if") *> C.indented *> parseValue)
320− <*> (C.indented *> C.reserved "then" *> C.indented *> parseValue)
324+ <*> (C.indented *> reserved "then" *> C.indented *> parseValue)
321− <*> (C.indented *> C.reserved "else" *> C.indented *> parseValue)
325+ <*> (C.indented *> reserved "else" *> C.indented *> parseValue)
323−parseLet :: P.Parsec String ParseState Expr
327+parseLet :: TokenParser Expr
324parseLet = do
328parseLet = do
325− C.reserved "let"
329+ reserved "let"
326 C.indented
330 C.indented
327 ds <- C.mark $ P.many1 (C.same *> parseLocalDeclaration)
331 ds <- C.mark $ P.many1 (C.same *> parseLocalDeclaration)
328 C.indented
332 C.indented
329− C.reserved "in"
333+ reserved "in"
330 result <- parseValue
334 result <- parseValue
331 return $ Let ds result
335 return $ Let ds result
333−parseValueAtom :: P.Parsec String ParseState Expr
337+parseValueAtom :: TokenParser Expr
334parseValueAtom = P.choice
338parseValueAtom = P.choice
335 [ P.try parseNumericLiteral
339 [ P.try parseNumericLiteral
336 , P.try parseStringLiteral
340 , P.try parseStringLiteral
@@ -344,32 +348,32 @@ parseValueAtom = P.choice
344 , parseIfThenElse
348 , parseIfThenElse
345 , parseDo
349 , parseDo
346 , parseLet
350 , parseLet
347− , Parens <$> C.parens parseValue ]
351+ , Parens <$> parens parseValue ]
349−parsePropertyUpdate :: P.Parsec String ParseState (String, Expr)
353+parsePropertyUpdate :: TokenParser (String, Expr)
350parsePropertyUpdate = do
354parsePropertyUpdate = do
351− name <- C.lexeme (C.identifierName <|> C.stringLiteral)
355+ name <- lname <|> stringLiteral
352− _ <- C.lexeme $ C.indented *> P.char '='
356+ _ <- C.indented *> equals
353 value <- C.indented *> parseValue
357 value <- C.indented *> parseValue
354 return (name, value)
358 return (name, value)
356−parseAccessor :: Expr -> P.Parsec String ParseState Expr
360+parseAccessor :: Expr -> TokenParser Expr
357parseAccessor (Constructor _) = P.unexpected "constructor"
361parseAccessor (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
360−parseDo :: P.Parsec String ParseState Expr
364+parseDo :: TokenParser Expr
361parseDo = do
365parseDo = do
362− C.reserved "do"
366+ reserved "do"
363 C.indented
367 C.indented
364 Do <$> C.mark (P.many (C.same *> C.mark parseDoNotationElement))
368 Do <$> C.mark (P.many (C.same *> C.mark parseDoNotationElement))
366−parseDoNotationLet :: P.Parsec String ParseState DoNotationElement
370+parseDoNotationLet :: TokenParser DoNotationElement
367−parseDoNotationLet = DoNotationLet <$> (C.reserved "let" *> C.indented *> C.mark (P.many1 (C.same *> parseLocalDeclaration)))
371+parseDoNotationLet = DoNotationLet <$> (reserved "let" *> C.indented *> C.mark (P.many1 (C.same *> parseLocalDeclaration)))
369−parseDoNotationBind :: P.Parsec String ParseState DoNotationElement
373+parseDoNotationBind :: TokenParser DoNotationElement
370−parseDoNotationBind = DoNotationBind <$> parseBinder <*> (C.indented *> C.reservedOp "<-" *> parseValue)
374+parseDoNotationBind = DoNotationBind <$> parseBinder <*> (C.indented *> larrow *> parseValue)
372−parseDoNotationElement :: P.Parsec String ParseState DoNotationElement
376+parseDoNotationElement :: TokenParser DoNotationElement
373parseDoNotationElement = P.choice
377parseDoNotationElement = P.choice
374 [ P.try parseDoNotationBind
378 [ P.try parseDoNotationBind
375 , parseDoNotationLet
379 , parseDoNotationLet
@@ -378,7 +382,7 @@ parseDoNotationElement = P.choice
379-- Parse a value
383-- Parse a value
381−parseValue :: P.Parsec String ParseState Expr
385+parseValue :: TokenParser Expr
382parseValue = withSourceSpan PositionedValue
386parseValue = withSourceSpan PositionedValue
383 (P.buildExpressionParser operators
387 (P.buildExpressionParser operators
384 . C.buildPostfixParser postfixTable2
388 . C.buildPostfixParser postfixTable2
@@ -386,68 +390,68 @@ parseValue = withSourceSpan PositionedValue
387 indexersAndAccessors = C.buildPostfixParser postfixTable1 parseValueAtom
391 indexersAndAccessors = C.buildPostfixParser postfixTable1 parseValueAtom
388 postfixTable1 = [ parseAccessor
392 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 ]
390 postfixTable2 = [ \v -> P.try (flip App <$> (C.indented *> indexersAndAccessors)) <*> pure v
394 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
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)
395− , [ P.Infix (C.lexeme (P.try (C.indented *> C.parseIdentInfix P.<?> "operator") >>= \ident ->
399+ , [ P.Infix (P.try (C.indented *> C.parseIdentInfix P.<?> "operator") >>= \ident ->
396− return (BinaryNoParens ident))) P.AssocRight
400+ return (BinaryNoParens ident)) P.AssocRight
400−parseStringBinder :: P.Parsec String ParseState Binder
404+parseStringBinder :: TokenParser Binder
401−parseStringBinder = StringBinder <$> C.stringLiteral
405+parseStringBinder = StringBinder <$> stringLiteral
403−parseBooleanBinder :: P.Parsec String ParseState Binder
407+parseBooleanBinder :: TokenParser Binder
404parseBooleanBinder = BooleanBinder <$> booleanLiteral
408parseBooleanBinder = BooleanBinder <$> booleanLiteral
406−parseNumberBinder :: P.Parsec String ParseState Binder
410+parseNumberBinder :: TokenParser Binder
407−parseNumberBinder = NumberBinder <$> (C.lexeme sign <*> C.integerOrFloat)
411+parseNumberBinder = NumberBinder <$> (sign <*> number)
409− sign :: P.Parsec String ParseState (Either Integer Double -> Either Integer Double)
413+ sign :: TokenParser (Either Integer Double -> Either Integer Double)
410− sign = (P.char '-' >> return (negate +++ negate))
414+ sign = (symbol' "-" >> return (negate +++ negate))
411− <|> (P.char '+' >> return id)
415+ <|> (symbol' "+" >> return id)
412 <|> return id
416 <|> return id
414−parseVarBinder :: P.Parsec String ParseState Binder
418+parseVarBinder :: TokenParser Binder
415parseVarBinder = VarBinder <$> C.parseIdent
419parseVarBinder = VarBinder <$> C.parseIdent
417−parseNullaryConstructorBinder :: P.Parsec String ParseState Binder
421+parseNullaryConstructorBinder :: TokenParser Binder
418−parseNullaryConstructorBinder = ConstructorBinder <$> C.lexeme (C.parseQualified C.properName) <*> pure []
422+parseNullaryConstructorBinder = ConstructorBinder <$> C.parseQualified C.properName <*> pure []
420−parseConstructorBinder :: P.Parsec String ParseState Binder
424+parseConstructorBinder :: TokenParser Binder
421−parseConstructorBinder = ConstructorBinder <$> C.lexeme (C.parseQualified C.properName) <*> many (C.indented *> parseBinderNoParens)
425+parseConstructorBinder = ConstructorBinder <$> C.parseQualified C.properName <*> many (C.indented *> parseBinderNoParens)
423−parseObjectBinder :: P.Parsec String ParseState Binder
427+parseObjectBinder :: TokenParser Binder
424−parseObjectBinder = ObjectBinder <$> C.braces (C.commaSep (C.indented *> parseIdentifierAndBinder))
428+parseObjectBinder = ObjectBinder <$> braces (commaSep (C.indented *> parseIdentifierAndBinder))
426−parseArrayBinder :: P.Parsec String ParseState Binder
430+parseArrayBinder :: TokenParser Binder
427−parseArrayBinder = C.squares $ ArrayBinder <$> C.commaSep (C.indented *> parseBinder)
431+parseArrayBinder = squares $ ArrayBinder <$> commaSep (C.indented *> parseBinder)
429−parseNamedBinder :: P.Parsec String ParseState Binder
433+parseNamedBinder :: TokenParser Binder
430−parseNamedBinder = NamedBinder <$> (C.parseIdent <* C.indented <* C.lexeme (P.char '@'))
434+parseNamedBinder = NamedBinder <$> (C.parseIdent <* C.indented <* at)
431 <*> (C.indented *> parseBinder)
435 <*> (C.indented *> parseBinder)
433−parseNullBinder :: P.Parsec String ParseState Binder
437+parseNullBinder :: TokenParser Binder
434−parseNullBinder = C.lexeme (P.char '_' *> P.notFollowedBy C.identLetter) *> return NullBinder
438+parseNullBinder = symbol' "_" *> return NullBinder
436−parseIdentifierAndBinder :: P.Parsec String ParseState (String, Binder)
440+parseIdentifierAndBinder :: TokenParser (String, Binder)
437parseIdentifierAndBinder = do
441parseIdentifierAndBinder = do
438− name <- C.lexeme (C.identifierName <|> C.stringLiteral)
442+ name <- lname <|> stringLiteral
439− _ <- C.lexeme $ C.indented *> (P.char '=' <|> P.char ':')
443+ C.indented *> (equals <|> colon)
440 binder <- C.indented *> parseBinder
444 binder <- C.indented *> parseBinder
441 return (name, binder)
445 return (name, binder)
444-- Parse a binder
448-- Parse a binder
446−parseBinder :: P.Parsec String ParseState Binder
450+parseBinder :: TokenParser Binder
447parseBinder = withSourceSpan PositionedBinder (P.buildExpressionParser operators parseBinderAtom P.<?> "expression")
451parseBinder = withSourceSpan PositionedBinder (P.buildExpressionParser operators parseBinderAtom P.<?> "expression")
449− operators = [ [ P.Infix ( C.lexeme (P.try $ C.indented *> C.reservedOp ":") >> return ConsBinder) P.AssocRight ] ]
453+ operators = [ [ P.Infix (P.try $ C.indented *> colon *> return ConsBinder) P.AssocRight ] ]
450− parseBinderAtom :: P.Parsec String ParseState Binder
454+ parseBinderAtom :: TokenParser Binder
451 parseBinderAtom = P.choice (map P.try
455 parseBinderAtom = P.choice (map P.try
452 [ parseNullBinder
456 [ parseNullBinder
453 , parseStringBinder
457 , parseStringBinder
@@ -458,12 +462,12 @@ parseBinder = withSourceSpan PositionedBinder (P.buildExpressionParser operators
458 , parseConstructorBinder
462 , parseConstructorBinder
459 , parseObjectBinder
463 , parseObjectBinder
460 , parseArrayBinder
464 , parseArrayBinder
461− , C.parens parseBinder ]) P.<?> "binder"
465+ , parens parseBinder ]) P.<?> "binder"
464-- Parse a binder as it would appear in a top level declaration
468-- Parse a binder as it would appear in a top level declaration
466−parseBinderNoParens :: P.Parsec String ParseState Binder
470+parseBinderNoParens :: TokenParser Binder
467parseBinderNoParens = P.choice (map P.try
471parseBinderNoParens = P.choice (map P.try
468 [ parseNullBinder
472 [ parseNullBinder
469 , parseStringBinder
473 , parseStringBinder
@@ -474,11 +478,11 @@ parseBinderNoParens = P.choice (map P.try
474 , parseNullaryConstructorBinder
478 , parseNullaryConstructorBinder
475 , parseObjectBinder
479 , parseObjectBinder
476 , parseArrayBinder
480 , parseArrayBinder
477− , C.parens parseBinder ]) P.<?> "binder"
481+ , parens parseBinder ]) P.<?> "binder"
479-- Parse a guard
483-- Parse a guard
481−parseGuard :: P.Parsec String ParseState Guard
485+parseGuard :: TokenParser Guard
482−parseGuard = C.pipe *> C.indented *> parseValue
486+parseGuard = pipe *> C.indented *> parseValue