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
|
data AST = Add AST AST
|
||||||
| Mul AST AST
|
| Mul AST AST
|
||||||
| Block [AST]
|
| Block [AST]
|
||||||
| FunDef String (Pattern, AST)
|
| FunDef String ([Pattern], AST)
|
||||||
| Def String AST
|
| Def String AST
|
||||||
| Var String
|
| Var String
|
||||||
| Lambda [(Pattern, [AST])]
|
| Lambda [(Pattern, [AST])]
|
||||||
|
|
14
parser.hs
14
parser.hs
|
@ -43,18 +43,24 @@ pattern = option UnitP $
|
||||||
fmap VarP identifier
|
fmap VarP identifier
|
||||||
<|> fmap IntP integer
|
<|> fmap IntP integer
|
||||||
|
|
||||||
|
patterns = sepBy pattern (symbol ",")
|
||||||
|
|
||||||
funDef = do
|
funDef = do
|
||||||
name <- identifier
|
name <- identifier
|
||||||
symbol "("
|
symbol "("
|
||||||
pat <- pattern
|
pats <- patterns
|
||||||
|
let pats' = if pats == [] then [UnitP] else pats -- at least Unit
|
||||||
symbol ")"
|
symbol ")"
|
||||||
symbol "->"
|
symbol "->"
|
||||||
lst <- exprparser
|
lst <- exprparser
|
||||||
return $ rewriteFun (FunDef name (pat, lst))
|
return $ rewriteFun (FunDef name (pats, lst))
|
||||||
|
|
||||||
-- curry FunDef to a definition of lambdas
|
-- curry FunDef to a definition of lambdas
|
||||||
rewriteFun (FunDef name (pattern, body)) =
|
rewriteFun (FunDef name (patterns, body)) =
|
||||||
Def name $ Lambda [(pattern, [body])]
|
Def name lam
|
||||||
|
where
|
||||||
|
-- curry it
|
||||||
|
lam = foldr (\pat lam -> Lambda [(pat, [lam])]) body patterns
|
||||||
|
|
||||||
call = do
|
call = do
|
||||||
name <- identifier
|
name <- identifier
|
||||||
|
|
Loading…
Reference in a new issue