@@ -7,21 +7,22 @@ module Parse.Expression
9import qualified Data.Name as Name
9import qualified Data.Name as Name
10+import Data.Word (Word16)
11import qualified AST.Source as Src
12import qualified AST.Source as Src
12−import Parse.Primitives
13−import qualified Parse.Primitives.Keyword as Keyword
13+import qualified Parse.Keyword as Keyword
14−import qualified Parse.Primitives.Number as Number
14+import qualified Parse.Number as Number
15−import qualified Parse.Primitives.Symbol as Symbol
16−import qualified Parse.Primitives.Utf8 as Utf8
17−import qualified Parse.Primitives.Variable as Var
18−import qualified Parse.Primitives.Whitespace as W
19import qualified Parse.Pattern as Pattern
15import qualified Parse.Pattern as Pattern
20import qualified Parse.Shader as Shader
16import qualified Parse.Shader as Shader
17+import qualified Parse.Symbol as Symbol
21import qualified Parse.Type as Type
18import qualified Parse.Type as Type
19+import qualified Parse.Utf8 as Utf8
20+import qualified Parse.Variable as Var
22+import Parse.Primitives hiding (Parser, State)
23+import qualified Parse.Primitives as P
22import qualified Reporting.Annotation as A
24import qualified Reporting.Annotation as A
23import qualified Reporting.Error.Syntax as E
25import qualified Reporting.Error.Syntax as E
24−import qualified Reporting.Region as R
@@ -30,9 +31,8 @@ import qualified Reporting.Region as R
31term :: Parser Src.Expr
32term :: Parser Src.Expr
34 do start <- getPosition
34 do start <- getPosition
36 [ variable start >>= accessible start
36 [ variable start >>= accessible start
37 , string start
37 , string start
38 , number start
38 , number start
@@ -45,21 +45,21 @@ term =
48−string :: R.Position -> Parser Src.Expr
48+string :: A.Position -> Parser Src.Expr
49string start =
49string start =
50 do str <- Utf8.string
50 do str <- Utf8.string
51 end <- getPosition
51 end <- getPosition
52 return (A.at start end (Src.Str str))
52 return (A.at start end (Src.Str str))
55−character :: R.Position -> Parser Src.Expr
55+character :: A.Position -> Parser Src.Expr
56character start =
56character start =
57 do chr <- Utf8.character
57 do chr <- Utf8.character
58 end <- getPosition
58 end <- getPosition
59 return (A.at start end (Src.Chr chr))
59 return (A.at start end (Src.Chr chr))
62−number :: R.Position -> Parser Src.Expr
62+number :: A.Position -> Parser Src.Expr
63number start =
63number start =
64 do nmbr <- Number.number
64 do nmbr <- Number.number
65 end <- getPosition
65 end <- getPosition
@@ -72,25 +72,25 @@ number start =
72 Src.Float float
72 Src.Float float
75−accessor :: R.Position -> Parser Src.Expr
75+accessor :: A.Position -> Parser Src.Expr
76accessor start =
76accessor start =
77− do Symbol.dot
77+ do word1 0x2E {-.-} E.XXX
78 field <- Var.lower
78 field <- Var.lower
79 end <- getPosition
79 end <- getPosition
80 return (A.at start end (Src.Accessor field))
80 return (A.at start end (Src.Accessor field))
83−variable :: R.Position -> Parser Src.Expr
83+variable :: A.Position -> Parser Src.Expr
84variable start =
84variable start =
85 do var <- Var.foreignAlpha
85 do var <- Var.foreignAlpha
86 end <- getPosition
86 end <- getPosition
87 return (A.at start end var)
87 return (A.at start end var)
90−accessible :: R.Position -> Src.Expr -> Parser Src.Expr
90+accessible :: A.Position -> Src.Expr -> Parser Src.Expr
91accessible start expr =
91accessible start expr =
93− [ do Symbol.dot
93+ [ do word1 0x2E {-.-} E.XXX
94 pos <- getPosition
94 pos <- getPosition
95 field <- Var.lower
95 field <- Var.lower
96 end <- getPosition
96 end <- getPosition
@@ -104,30 +104,29 @@ accessible start expr =
107−list :: R.Position -> Parser Src.Expr
107+list :: A.Position -> Parser Src.Expr
108list start =
108list start =
109− do Symbol.leftSquare
110− inContext start E.ExprList $
109+ inContext E.ExprList (word1 0x5B {-[-} E.XXX) $
111− do spaces
110+ do spaces
112− oneOf
111+ oneOf E.XXX
113− [ do (entry, _, pos) <- expression
112+ [ do (entry, _, pos) <- expression
114− checkSpace pos
113+ checkSpace pos
115− listHelp start [entry]
114+ listHelp start [entry]
116− , do Symbol.rightSquare
115+ , do word1 0x5D {-]-} E.XXX
117− end <- getPosition
116+ end <- getPosition
118− return (A.at start end (Src.List []))
117+ return (A.at start end (Src.List []))
122−listHelp :: R.Position -> [Src.Expr] -> Parser Src.Expr
121+listHelp :: A.Position -> [Src.Expr] -> Parser Src.Expr
123listHelp start entries =
122listHelp start entries =
124− oneOf
123+ oneOf E.XXX
125− [ do Symbol.comma
124+ [ do word1 0x2C {-,-} E.XXX
127 (entry, _, pos) <- expression
126 (entry, _, pos) <- expression
128 checkSpace pos
127 checkSpace pos
129 listHelp start (entry:entries)
128 listHelp start (entry:entries)
130− , do Symbol.rightSquare
129+ , do word1 0x5D {-]-} E.XXX
131 end <- getPosition
130 end <- getPosition
132 return (A.at start end (Src.List (reverse entries)))
131 return (A.at start end (Src.List (reverse entries)))
@@ -137,14 +136,14 @@ listHelp start entries =
140−tuple :: R.Position -> Parser Src.Expr
139+tuple :: A.Position -> Parser Src.Expr
141tuple start =
140tuple start =
142− do Symbol.leftParen
141+ inContext E.ExprTuple (word1 0x28 {-(-} E.XXX) $
143− pos <- getPosition
142+ do pos <- getPosition
144− spos <- W.whitespace
143+ spos <- whitespace
145− inContext start E.ExprTuple $ oneOf $
144+ oneOf E.XXX
146 [ do noSpace pos spos
145 [ do noSpace pos spos
147− try (Symbol.minus >> Symbol.rightParen)
146+ word2 0x2D 0x29 {--)-} E.XXX
148 end <- getPosition
147 end <- getPosition
149 return $ A.at start end (Src.Op "-")
148 return $ A.at start end (Src.Op "-")
@@ -155,27 +154,27 @@ tuple start =
156 , do noSpace pos spos
155 , do noSpace pos spos
157 op <- Symbol.binop
156 op <- Symbol.binop
158− Symbol.rightParen
157+ word1 0x29 {-)-} E.XXX
159 end <- getPosition
158 end <- getPosition
160 return $ A.at start end (Src.Op op)
159 return $ A.at start end (Src.Op op)
162 , do noSpace pos spos
161 , do noSpace pos spos
163− Symbol.rightParen
162+ word1 0x29 {-)-} E.XXX
164 end <- getPosition
163 end <- getPosition
165 return (A.at start end Src.Unit)
164 return (A.at start end Src.Unit)
170−tupleHelp :: R.Position -> Src.Expr -> [Src.Expr] -> Parser Src.Expr
169+tupleHelp :: A.Position -> Src.Expr -> [Src.Expr] -> Parser Src.Expr
171tupleHelp start firstExpr revExprs =
170tupleHelp start firstExpr revExprs =
172− oneOf
171+ oneOf E.XXX
173− [ do Symbol.comma
172+ [ do word1 0x2C {-,-} E.XXX
175 (entry, _, pos) <- expression
174 (entry, _, pos) <- expression
176 checkSpace pos
175 checkSpace pos
177 tupleHelp start firstExpr (entry : revExprs)
176 tupleHelp start firstExpr (entry : revExprs)
178− , do Symbol.rightParen
177+ , do word1 0x29 {-)-} E.XXX
179 end <- getPosition
178 end <- getPosition
180 case reverse revExprs of
179 case reverse revExprs of
@@ -190,33 +189,32 @@ tupleHelp start firstExpr revExprs =
190-- RECORDS
189-- RECORDS
193−record :: R.Position -> Parser Src.Expr
192+record :: A.Position -> Parser Src.Expr
194record start =
193record start =
196− inContext start E.ExprRecord $
194+ inContext E.ExprRecord (word1 0x7B {- { -} E.XXX) $
197− do spaces
195+ do spaces
198− oneOf
196+ oneOf E.XXX
199− [ do Symbol.rightCurly
197+ [ do word1 0x7D {-}-} E.XXX
200− end <- getPosition
198+ end <- getPosition
201− return (A.at start end (Src.Record []))
199+ return (A.at start end (Src.Record []))
202− , do starter <- addLocation Var.lower
200+ , do starter <- addLocation Var.lower
204− oneOf
202+ oneOf E.XXX
205− [ do Symbol.pipe
203+ [ do word1 0x7C {-|-} E.XXX
207− firstField <- chompField
205+ firstField <- chompField
208− fields <- chompFields [firstField]
206+ fields <- chompFields [firstField]
209− end <- getPosition
207+ end <- getPosition
210− return (A.at start end (Src.Update starter fields))
208+ return (A.at start end (Src.Update starter fields))
211− , do Symbol.equals
209+ , do word1 0x3D {-=-} E.XXX
213− (value, _, nextPos) <- expression
211+ (value, _, nextPos) <- expression
214− checkSpace nextPos
212+ checkSpace nextPos
215− fields <- chompFields [(starter, value)]
213+ fields <- chompFields [(starter, value)]
216− end <- getPosition
214+ end <- getPosition
217− return (A.at start end (Src.Record fields))
215+ return (A.at start end (Src.Record fields))
222type Field = ( A.Located Name.Name, Src.Expr )
220type Field = ( A.Located Name.Name, Src.Expr )
@@ -224,12 +222,12 @@ type Field = ( A.Located Name.Name, Src.Expr )
225chompFields :: [Field] -> Parser [Field]
223chompFields :: [Field] -> Parser [Field]
226chompFields fields =
224chompFields fields =
227− oneOf
225+ oneOf E.XXX
228− [ do Symbol.comma
226+ [ do word1 0x2C {-,-} E.XXX
230 f <- chompField
228 f <- chompField
231 chompFields (f : fields)
229 chompFields (f : fields)
232− , do Symbol.rightCurly
230+ , do word1 0x7D {-}-} E.XXX
233 return (reverse fields)
231 return (reverse fields)
@@ -238,7 +236,7 @@ chompField :: Parser Field
238chompField =
236chompField =
239 do key <- addLocation Var.lower
237 do key <- addLocation Var.lower
241− Symbol.equals
239+ word1 0x3D {-=-} E.XXX
243 (value, _, pos) <- expression
241 (value, _, pos) <- expression
244 checkSpace pos
242 checkSpace pos
@@ -255,16 +253,15 @@ type ExprParser =
256expression :: ExprParser
254expression :: ExprParser
257expression =
255expression =
259 do start <- getPosition
256 do start <- getPosition
260− oneOf
257+ oneOf E.XXX
261 [ let_ start
258 [ let_ start
262 , if_ start
259 , if_ start
263 , case_ start
260 , case_ start
264 , function start
261 , function start
265 , do expr <- possiblyNegativeTerm start
262 , do expr <- possiblyNegativeTerm start
266 end <- getPosition
263 end <- getPosition
267− space <- W.whitespace
264+ space <- whitespace
268 exprHelp start (State [] expr [] end space)
265 exprHelp start (State [] expr [] end space)
@@ -274,20 +271,19 @@ data State =
274 { _ops :: ![(Src.Expr, A.Located Name.Name)]
271 { _ops :: ![(Src.Expr, A.Located Name.Name)]
275 , _expr :: !Src.Expr
272 , _expr :: !Src.Expr
276 , _args :: ![Src.Expr]
273 , _args :: ![Src.Expr]
277− , _end :: !R.Position
274+ , _end :: !A.Position
278 , _pos :: !SPos
275 , _pos :: !SPos
282−exprHelp :: R.Position -> State -> ExprParser
279+exprHelp :: A.Position -> State -> ExprParser
283exprHelp start (State ops expr args end pos) =
280exprHelp start (State ops expr args end pos) =
284− oneOf
281+ oneOf E.XXX
285 [ -- argument
282 [ -- argument
287 do checkSpace pos
283 do checkSpace pos
288 arg <- term
284 arg <- term
289 newEnd <- getPosition
285 newEnd <- getPosition
290− newPos <- W.whitespace
286+ newPos <- whitespace
291 exprHelp start (State ops expr (arg:args) newEnd newPos)
287 exprHelp start (State ops expr (arg:args) newEnd newPos)
293 , -- infix operator
289 , -- infix operator
@@ -296,30 +292,29 @@ exprHelp start (State ops expr args end pos) =
296 opName <- Symbol.binop
292 opName <- Symbol.binop
297 opEnd <- getPosition
293 opEnd <- getPosition
298 let op = A.at opStart opEnd opName
294 let op = A.at opStart opEnd opName
299− spos <- W.whitespace
295+ spos <- whitespace
300− hint (E.AfterOpExpr opName) (checkSpace spos)
296+ checkSpace spos
301 newStart <- getPosition
297 newStart <- getPosition
302− hint (E.AfterOpExpr opName) $
303− if "-" == opName && end /= opStart && opEnd == newStart
298+ if "-" == opName && end /= opStart && opEnd == newStart
305 -- negative terms
300 -- negative terms
306 do rawTerm <- term
301 do rawTerm <- term
307 newEnd <- getPosition
302 newEnd <- getPosition
308− newPos <- W.whitespace
303+ newPos <- whitespace
309 let arg = A.at opStart newEnd (Src.Negate rawTerm)
304 let arg = A.at opStart newEnd (Src.Negate rawTerm)
310 exprHelp start (State ops expr (arg:args) newEnd newPos)
305 exprHelp start (State ops expr (arg:args) newEnd newPos)
312− oneOf
307+ oneOf E.XXX
313 [ -- term
308 [ -- term
314 do newExpr <- possiblyNegativeTerm newStart
309 do newExpr <- possiblyNegativeTerm newStart
315 newEnd <- getPosition
310 newEnd <- getPosition
316− newPos <- W.whitespace
311+ newPos <- whitespace
317 let newOps = (toCall expr args, op) : ops
312 let newOps = (toCall expr args, op) : ops
318 exprHelp start (State newOps newExpr [] newEnd newPos)
313 exprHelp start (State newOps newExpr [] newEnd newPos)
320 , -- final term
315 , -- final term
321 do (newLast, newEnd, newPos) <-
316 do (newLast, newEnd, newPos) <-
322− oneOf
317+ oneOf E.XXX
323 [ let_ newStart
318 [ let_ newStart
324 , case_ newStart
319 , case_ newStart
325 , if_ newStart
320 , if_ newStart
@@ -341,10 +336,10 @@ exprHelp start (State ops expr args end pos) =
344−possiblyNegativeTerm :: R.Position -> Parser Src.Expr
339+possiblyNegativeTerm :: A.Position -> Parser Src.Expr
345possiblyNegativeTerm start =
340possiblyNegativeTerm start =
346− oneOf
341+ oneOf E.XXX
347− [ do Symbol.minus
342+ [ do word1 0x2D {---} E.XXX
348 expr <- term
343 expr <- term
349 end <- getPosition
344 end <- getPosition
350 return (A.at start end (Src.Negate expr))
345 return (A.at start end (Src.Negate expr))
@@ -366,13 +361,13 @@ toCall func revArgs =
366-- IF EXPRESSION
361-- IF EXPRESSION
369−if_ :: R.Position -> ExprParser
364+if_ :: A.Position -> ExprParser
370if_ start =
365if_ start =
372− inContext start E.ExprIf $ ifHelp start []
366+ inContext E.ExprIf Keyword.if_ $
375−ifHelp :: R.Position -> [(Src.Expr, Src.Expr)] -> ExprParser
370+ifHelp :: A.Position -> [(Src.Expr, Src.Expr)] -> ExprParser
376ifHelp start branches =
371ifHelp start branches =
377 do spaces
372 do spaces
378 (condition, _, condPos) <- expression
373 (condition, _, condPos) <- expression
@@ -380,11 +375,11 @@ ifHelp start branches =
380 Keyword.then_
375 Keyword.then_
382 (thenBranch, _, thenPos) <- expression
377 (thenBranch, _, thenPos) <- expression
383− hint E.ElseBranch $ checkSpace thenPos
378+ checkSpace thenPos
384− hint E.ElseBranch $ Keyword.else_
379+ Keyword.else_
386 let newBranches = (condition, thenBranch) : branches
381 let newBranches = (condition, thenBranch) : branches
387− oneOf
382+ oneOf E.XXX
388 [ do Keyword.if_
383 [ do Keyword.if_
389 ifHelp start newBranches
384 ifHelp start newBranches
390 , do (elseBranch, elseEnd, elseSpace) <- expression
385 , do (elseBranch, elseEnd, elseSpace) <- expression
@@ -397,27 +392,26 @@ ifHelp start branches =
397-- LAMBDA EXPRESSION
392-- LAMBDA EXPRESSION
400−function :: R.Position -> ExprParser
395+function :: A.Position -> ExprParser
401function start =
396function start =
403− inContext start E.ExprFunc $
397+ inContext E.ExprFunc (word1 0x5C {-\-} E.XXX) $
404− do spaces
398+ do spaces
405− arg <- Pattern.term
399+ arg <- Pattern.term
407− revArgs <- gatherArgs [arg]
401+ revArgs <- gatherArgs [arg]
409− (body, end, space) <- expression
403+ (body, end, space) <- expression
410− let func = A.at start end (Src.Lambda (reverse revArgs) body)
404+ let func = A.at start end (Src.Lambda (reverse revArgs) body)
411− return ( func, end, space )
405+ return ( func, end, space )
414gatherArgs :: [Src.Pattern] -> Parser [Src.Pattern]
408gatherArgs :: [Src.Pattern] -> Parser [Src.Pattern]
415gatherArgs args =
409gatherArgs args =
416− oneOf
410+ oneOf E.XXX
417 [ do arg <- Pattern.term
411 [ do arg <- Pattern.term
419 gatherArgs (arg:args)
413 gatherArgs (arg:args)
420− , do Symbol.rightArrow
414+ , do word2 0x2D 0x3E {-->-} E.XXX
421 return args
415 return args
@@ -426,41 +420,40 @@ gatherArgs args =
426-- CASE EXPRESSIONS
420-- CASE EXPRESSIONS
429−case_ :: R.Position -> ExprParser
423+case_ :: A.Position -> ExprParser
430case_ start =
424case_ start =
432− inContext start E.ExprCase $
425+ inContext E.ExprCase Keyword.case_ $
433− do spaces
426+ do spaces
434− (switcher, _, switcherPos) <- expression
427+ (switcher, _, switcherPos) <- expression
435− checkSpace switcherPos
428+ checkSpace switcherPos
436− Keyword.of_
429+ Keyword.of_
438− oldIndent <- getIndent
431+ oldIndent <- getIndent
439− newIndent <- getCol
432+ newIndent <- getCol
440− setIndent newIndent
433+ setIndent newIndent
441− (firstBranch, firstEnd, firstPos) <- branchHelp
434+ (firstBranch, firstEnd, firstPos) <- branchHelp
442− (branches, end, pos) <- caseHelp [firstBranch] firstEnd firstPos
435+ (branches, end, pos) <- caseHelp [firstBranch] firstEnd firstPos
443− setIndent oldIndent
436+ setIndent oldIndent
445− ( A.at start end (Src.Case switcher branches)
438+ ( A.at start end (Src.Case switcher branches)
451branchHelp :: SParser (Src.Pattern, Src.Expr)
444branchHelp :: SParser (Src.Pattern, Src.Expr)
452branchHelp =
445branchHelp =
453 do (pattern, patternPos) <- Pattern.expression
446 do (pattern, patternPos) <- Pattern.expression
454 checkSpace patternPos
447 checkSpace patternPos
455− Symbol.rightArrow
448+ word2 0x2D 0x3E {-->-} E.XXX
457 (branchExpr, end, pos) <- expression
450 (branchExpr, end, pos) <- expression
458 return ( (pattern, branchExpr), end, pos )
451 return ( (pattern, branchExpr), end, pos )
461−caseHelp :: [(Src.Pattern, Src.Expr)] -> R.Position -> SPos -> SParser [(Src.Pattern, Src.Expr)]
454+caseHelp :: [(Src.Pattern, Src.Expr)] -> A.Position -> SPos -> SParser [(Src.Pattern, Src.Expr)]
462caseHelp branches end pos =
455caseHelp branches end pos =
463− oneOf
456+ oneOf E.XXX
464 [ do checkAligned pos
457 [ do checkAligned pos
465 (branch, newEnd, newPos) <- branchHelp
458 (branch, newEnd, newPos) <- branchHelp
466 caseHelp (branch:branches) newEnd newPos
459 caseHelp (branch:branches) newEnd newPos
@@ -472,7 +465,7 @@ caseHelp branches end pos =
472-- LET EXPRESSION
465-- LET EXPRESSION
475−let_ :: R.Position -> ExprParser
468+let_ :: A.Position -> ExprParser
476let_ start =
469let_ start =
477 do oldIndent <- getIndent
470 do oldIndent <- getIndent
478 letIndent <- getCol
471 letIndent <- getCol
@@ -486,9 +479,9 @@ let_ start =
486 letHelp start oldIndent [def] end space
479 letHelp start oldIndent [def] end space
489−letHelp :: R.Position -> Int -> [A.Located Src.Def] -> R.Position -> SPos -> ExprParser
482+letHelp :: A.Position -> Word16 -> [A.Located Src.Def] -> A.Position -> SPos -> ExprParser
490letHelp start oldIndent revDefs end pos =
483letHelp start oldIndent revDefs end pos =
491− oneOf
484+ oneOf E.XXX
492 [ do checkAligned pos
485 [ do checkAligned pos
493 (def, newEnd, newPos) <- letDef
486 (def, newEnd, newPos) <- letDef
494 letHelp start oldIndent (def:revDefs) newEnd newPos
487 letHelp start oldIndent (def:revDefs) newEnd newPos
@@ -510,7 +503,7 @@ letHelp start oldIndent revDefs end pos =
511letDef :: SParser (A.Located Src.Def)
504letDef :: SParser (A.Located Src.Def)
513− oneOf
506+ oneOf E.XXX
514 [ definition
507 [ definition
515 , destructure
508 , destructure
@@ -524,33 +517,62 @@ definition :: SParser (A.Located Src.Def)
524definition =
517definition =
525 do start <- getPosition
518 do start <- getPosition
526 name <- Var.lower
519 name <- Var.lower
527− nameEnd <- getPosition
520+ end <- getPosition
529− oneOf
522+ oneOf E.XXX
530− [ do Symbol.hasType
523+ [
524+ do word1 0x3A {-:-} E.XXX
531− inContext start (E.Annotation name) $
525+ pushContext start (E.Annotation name)
532− do spaces
526+ spaces
533− (tipe, end, space) <- Type.expression
527+ (tipe, _, space) <- Type.expression
534− return ( A.at start end (Src.Annotate name tipe), end, space )
528+ popContext ()
530+ defName <- matchingName name
531+ let (A.At (A.Region defStart _) _) = defName
532+ pushContext defStart (E.Definition name)
534+ def <- definitionHelp start defName (Just tipe) []
535− , inContext start (E.Definition name) $
537+ do pushContext start (E.Definition name)
536− definitionHelp start (A.at start nameEnd name) []
538+ def <- definitionHelp start (A.at start end name) Nothing []
540−definitionHelp :: R.Position -> A.Located Name.Name -> [Src.Pattern] -> SParser (A.Located Src.Def)
543+definitionHelp :: A.Position -> A.Located Name.Name -> Maybe Src.Type -> [Src.Pattern] -> SParser (A.Located Src.Def)
541−definitionHelp start name revArgs =
544+definitionHelp start name tipe revArgs =
542− oneOf
545+ oneOf E.XXX
543− [ do arg <- hint E.Arg Pattern.term
546+ [ do arg <- Pattern.term
545− definitionHelp start name (arg : revArgs)
548+ definitionHelp start name tipe (arg : revArgs)
546− , do Symbol.equals
549+ , do word1 0x3D {-=-} E.XXX
548 (body, end, space) <- expression
551 (body, end, space) <- expression
549− let def = A.at start end (Src.Define name (reverse revArgs) body)
552+ let def = A.at start end (Src.Define name (reverse revArgs) body tipe)
550 return ( def, end, space )
553 return ( def, end, space )
557+matchingName :: Name.Name -> Parser (A.Located Name.Name)
558+matchingName expectedName =
559+ let (P.Parser parserL) = Var.lower in
560+ P.Parser $ \state@(P.State _ _ _ sr sc ctx) cok eok cerr eerr ->
562+ cokL name newState@(P.State _ _ _ er ec _) =
563+ if expectedName == name
564+ then cok (A.At (A.Region (A.Position sr sc) (A.Position er ec)) name) newState
565+ else cerr sr sc ctx (E.MatchingName expectedName)
567+ eokL name newState@(P.State _ _ _ er ec _) =
568+ if expectedName == name
569+ then eok (A.At (A.Region (A.Position sr sc) (A.Position er ec)) name) newState
570+ else eerr sr sc ctx (E.MatchingName expectedName)
572+ parserL state cokL eokL cerr eerr
555-- DESTRUCTURE
577-- DESTRUCTURE
@@ -560,7 +582,7 @@ destructure =
560 do start <- getPosition
582 do start <- getPosition
561 pattern <- Pattern.term
583 pattern <- Pattern.term
563− Symbol.equals
585+ word1 0x3D {-=-} E.XXX
565 (expr, end, space) <- expression
587 (expr, end, space) <- expression
566 return ( A.at start end (Src.Destruct pattern expr), end, space )
588 return ( A.at start end (Src.Destruct pattern expr), end, space )