on master help sign in
Correct pattern parsing error in which arg-less constructors would capture the remaining patterns.
25c70dfevancz
elm/src/Parse/Patterns.hs+6−4
@@ -2,7 +2,7 @@ module Patterns (patternTerm, patternExpr, makeLambda, flattenPatterns) where
2
2
3import Ast
3import Ast
4import Data.Char (isUpper)
4import Data.Char (isUpper)
5−import Control.Applicative ((<$>))
5+import Control.Applicative ((<$>),(<*>))
6import Control.Monad
6import Control.Monad
7import Text.Parsec
7import Text.Parsec
8import ParseLib
8import ParseLib
@@ -11,8 +11,7 @@ patternBasic :: Monad m => ParsecT [Char] u m Pattern
11patternBasic =
11patternBasic =
12 choice [ char '_' >> return PAnything
12 choice [ char '_' >> return PAnything
13 , do x@(c:_) <- var
13 , do x@(c:_) <- var
14− if isUpper c then PData x <$> spacePrefix patternTerm
14+ return $ if isUpper c then PData x [] else PVar x
15− else return $ PVar x
16 ]
15 ]
17
16
18patternTuple :: Monad m => ParsecT [Char] u m Pattern
17patternTuple :: Monad m => ParsecT [Char] u m Pattern
@@ -25,8 +24,11 @@ patternList = plist <$> braces (commaSep patternExpr)
25patternTerm :: Monad m => ParsecT [Char] u m Pattern
24patternTerm :: Monad m => ParsecT [Char] u m Pattern
26patternTerm = patternTuple <|> patternList <|> patternBasic <?> "pattern"
25patternTerm = patternTuple <|> patternList <|> patternBasic <?> "pattern"
27
26
27+patternConstructor :: Monad m => ParsecT [Char] u m Pattern
28+patternConstructor = PData <$> capVar <*> spacePrefix patternTerm
29+
28patternExpr :: Monad m => ParsecT [Char] u m Pattern
30patternExpr :: Monad m => ParsecT [Char] u m Pattern
29−patternExpr = foldr1 pcons <$> consSep1 patternTerm <?> "pattern"
31+patternExpr = foldr1 pcons <$> consSep1 (patternConstructor <|> patternTerm) <?> "pattern"
30
32
31
33
32makeLambda pats body = foldr Lambda (makeBody pats body) (map getName pats)
34makeLambda pats body = foldr Lambda (makeBody pats body) (map getName pats)