on master help sign in
Pattern clause parser
commit2eb5b529ed03ec89d3f93943d97ca4b44ea68c80 authorEdwin Brady <eb@cs.st-andrews.ac.uk> dateWed 5 Oct 2011, 14:42 (15 years ago) parent82585e7
3 files changed+27−5
decls.mi+6−5 src/Idris/AbsSyntax.hs+1 src/Idris/Parser.hs+20
decls.mi+6−5
@@ -11,15 +11,16 @@ data Vect : Set -> Nat -> Set where
1111 | (::) : a -> Vect a k -> Vect a (S k);
1212
1313plus : Nat -> Nat -> Nat;
14−{-
1514plus O y = y;
1615plus (S k) y = S (plus k y);
17−-}
1816
1917app : Vect a n -> Vect a m -> Vect a (plus n m);
20−{-
2118app VNil ys = ys;
2219app (x :: xs) ys = x :: (app xs ys);
23−-}
2420
25−(::) : a -> Vect a k -> Vect a (S k);
21+infixl 5 .+. ;
22+
23+(.+.) : Nat -> Nat -> Nat;
24+O .+. y = y;
25+(S k) .+. y = S (k .+. y);
26+
src/Idris/AbsSyntax.hs+1
@@ -82,6 +82,7 @@ data PTerm = PQuote Raw
8282 | PLam Name PTerm PTerm
8383 | PPi Plicity Name PTerm PTerm
8484 | PApp PTerm [(Name, PTerm)] [PTerm]
85+ | PHidden PTerm -- irrelevant or hidden pattern
8586 | PSet
8687 | Placeholder
8788 deriving Show
src/Idris/Parser.hs+20
@@ -40,6 +40,7 @@ parseProg :: String -> Idris [PDecl]
4040parseProg fname = do file <- lift $ readFile fname
4141 i <- get
4242 case (runParser (do ps <- many1 pDecl
43+ eof
4344 i' <- getState
4445 return (ps, i')) i fname file) of
4546 Left err -> fail (show err)
@@ -59,6 +60,7 @@ pDecl' = try pFixity
5960 <|> try (do n <- pfName; ty <- pTSig
6061 return (PTy n ty))
6162 <|> try pData
63+ <|> try pPattern
6264
6365-------- Fixity --------
6466
@@ -98,6 +100,11 @@ pSimpleExpr =
98100 <|> try (do lchar '('; e <- pExpr; lchar ')'; return e)
99101 <|> try (do reserved "Set"; return PSet)
100102
103+pHSimpleExpr = try pSimpleExpr
104+ <|> do lchar '.'
105+ e <- pSimpleExpr
106+ return $ PHidden e
107+
101108pApp = do f <- pSimpleExpr
102109 args <- many1 pSimpleExpr
103110 return (PApp f [] args)
@@ -168,3 +175,16 @@ pSimpleCon = do cn <- pfName
168175
169176--------- Pattern match clauses ---------
170177
178+pPattern :: IParser PDecl
179+pPattern = try (do n <- pfName
180+ args <- many pHSimpleExpr
181+ lchar '='
182+ rhs <- pExpr
183+ return $ PClause (PApp (PRef n) [] args) rhs)
184+ <|> do l <- pSimpleExpr
185+ op <- operator
186+ r <- pSimpleExpr
187+ lchar '='
188+ rhs <- pExpr
189+ return $ PClause (PApp (PRef (UN [op])) [] [l,r]) rhs
190+