add multiple pattern arguments in parser
This commit is contained in:
parent
7aa23e4800
commit
3506e1282a
2 changed files with 11 additions and 5 deletions
2
ast.hs
2
ast.hs
|
@ -3,7 +3,7 @@ module AST where
|
|||
data AST = Add AST AST
|
||||
| Mul AST AST
|
||||
| Block [AST]
|
||||
| FunDef String (Pattern, AST)
|
||||
| FunDef String ([Pattern], AST)
|
||||
| Def String AST
|
||||
| Var String
|
||||
| Lambda [(Pattern, [AST])]
|
||||
|
|
14
parser.hs
14
parser.hs
|
@ -43,18 +43,24 @@ pattern = option UnitP $
|
|||
fmap VarP identifier
|
||||
<|> fmap IntP integer
|
||||
|
||||
patterns = sepBy pattern (symbol ",")
|
||||
|
||||
funDef = do
|
||||
name <- identifier
|
||||
symbol "("
|
||||
pat <- pattern
|
||||
pats <- patterns
|
||||
let pats' = if pats == [] then [UnitP] else pats -- at least Unit
|
||||
symbol ")"
|
||||
symbol "->"
|
||||
lst <- exprparser
|
||||
return $ rewriteFun (FunDef name (pat, lst))
|
||||
return $ rewriteFun (FunDef name (pats, lst))
|
||||
|
||||
-- curry FunDef to a definition of lambdas
|
||||
rewriteFun (FunDef name (pattern, body)) =
|
||||
Def name $ Lambda [(pattern, [body])]
|
||||
rewriteFun (FunDef name (patterns, body)) =
|
||||
Def name lam
|
||||
where
|
||||
-- curry it
|
||||
lam = foldr (\pat lam -> Lambda [(pat, [lam])]) body patterns
|
||||
|
||||
call = do
|
||||
name <- identifier
|
||||
|
|
Loading…
Reference in a new issue