on master help sign in
Disallow (+) in let expressions in the parser
bca019dEvan Czaplicki
src/Parse/Declaration.hs+1−1
@@ -48,7 +48,7 @@ docDecl start =
48
48
49defDecl :: R.Position -> SParser Decl.Source
49defDecl :: R.Position -> SParser Decl.Source
50defDecl start =
50defDecl start =
51− do (def, end, pos) <- Expr.definition
51+ do (def, end, pos) <- Expr.topLevelDef
52 let decl = A.at start end (Decl.Def def)
52 let decl = A.at start end (Decl.Def def)
53 return ( Decl.Whatever decl, end, pos )
53 return ( Decl.Whatever decl, end, pos )
54
54
src/Parse/Expression.hs+23−17
@@ -1,6 +1,6 @@
1{-# OPTIONS_GHC -Wall -fno-warn-unused-do-bind #-}
1{-# OPTIONS_GHC -Wall -fno-warn-unused-do-bind #-}
2{-# LANGUAGE OverloadedStrings #-}
2{-# LANGUAGE OverloadedStrings #-}
3−module Parse.Expression (term, expression, definition, rootPattern) where
3+module Parse.Expression (term, expression, topLevelDef) where
4
4
5import Control.Monad (guard)
5import Control.Monad (guard)
6import qualified Data.List as List
6import qualified Data.List as List
@@ -474,7 +474,7 @@ let_ start =
474 spaces
474 spaces
475 defIndent <- getCol
475 defIndent <- getCol
476 setIndent defIndent
476 setIndent defIndent
477− (def, end, space) <- definition
477+ (def, end, space) <- letDef
478 letHelp start oldIndent [def] end space
478 letHelp start oldIndent [def] end space
479
479
480
480
@@ -482,7 +482,7 @@ letHelp :: R.Position -> Int -> [Src.RawDef] -> R.Position -> SPos -> ExprParser
482letHelp start oldIndent revDefs end pos =
482letHelp start oldIndent revDefs end pos =
483 oneOf
483 oneOf
484 [ do checkAligned pos
484 [ do checkAligned pos
485− (def, newEnd, newPos) <- definition
485+ (def, newEnd, newPos) <- letDef
486 letHelp start oldIndent (def:revDefs) newEnd newPos
486 letHelp start oldIndent (def:revDefs) newEnd newPos
487
487
488 , do setIndent oldIndent
488 , do setIndent oldIndent
@@ -500,10 +500,27 @@ letHelp start oldIndent revDefs end pos =
500-- DEFINITIONS
500-- DEFINITIONS
501
501
502
502
503+letDef :: SParser Src.RawDef
504+letDef =
505+ definition $ \_ -> Pattern.term
506+
507+
503−definition :: SParser Src.RawDef
508+topLevelDef :: SParser Src.RawDef
509+topLevelDef =
504−definition =
510+ definition $ \start ->
511+ oneOf
512+ [ do op <- try (leftParen >> infixOp)
513+ rightParen
514+ end <- getPosition
515+ return (A.at start end (P.Var op))
516+ , Pattern.term
517+ ]
518+
519+
520+definition :: (R.Position -> Parser P.Raw) -> SParser Src.RawDef
521+definition parseRoot =
505 do start <- getPosition
522 do start <- getPosition
506− root <- rootPattern start
523+ root <- parseRoot start
507 spaces
524 spaces
508 case A.drop root of
525 case A.drop root of
509 P.Var name ->
526 P.Var name ->
@@ -521,17 +538,6 @@ definition =
521 definitionHelp start root []
538 definitionHelp start root []
522
539
523
540
524−rootPattern :: R.Position -> Parser P.Raw
525−rootPattern start =
526− oneOf
527− [ do op <- try (leftParen >> infixOp)
528− rightParen
529− end <- getPosition
530− return (A.at start end (P.Var op))
531− , Pattern.term
532− ]
533−
534−
535definitionHelp :: R.Position -> P.Raw -> [P.Raw] -> SParser Src.RawDef
541definitionHelp :: R.Position -> P.Raw -> [P.Raw] -> SParser Src.RawDef
536definitionHelp start root revArgs =
542definitionHelp start root revArgs =
537 oneOf
543 oneOf
src/Parse/Repl.hs+1−2
@@ -11,7 +11,6 @@ import qualified Data.Text as Text
11import Data.Text (Text)
11import Data.Text (Text)
12
12
13import Parse.Helpers
13import Parse.Helpers
14−import qualified Parse.Expression as Expr
15import qualified Parse.Pattern as Pattern
14import qualified Parse.Pattern as Pattern
16
15
17import qualified AST.Pattern as P
16import qualified AST.Pattern as P
@@ -74,7 +73,7 @@ entryParser source =
74 name <- capVar
73 name <- capVar
75 return (Type (Text.unpack name) source)
74 return (Type (Text.unpack name) source)
76
75
77− , do root <- Expr.rootPattern =<< getPosition
76+ , do root <- Pattern.term
78 spaces
77 spaces
79 case A.drop root of
78 case A.drop root of
80 P.Var name ->
79 P.Var name ->