ADD: syntaxic sugar for function declaration.
parent
22131c2cf0
commit
5d975eafdf
|
@ -4,7 +4,10 @@ EXPR ::=
|
|||
| ident
|
||||
| CALL
|
||||
| LAMBDA
|
||||
| FUNDECL
|
||||
CALL ::= opar EXPR EXPR* cpar
|
||||
LAMBDA ::= opar rarrow opar PARAMS cpar BODY cpar
|
||||
PARAMS ::= ident*
|
||||
BODY ::= EXPR*
|
||||
FUNDECL ::=
|
||||
| opar ident opar ident PARAMS cpar BODY cpar
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
($ (f x y) (* x y))
|
||||
|
||||
(assert= 42 (f 6 7))
|
|
@ -59,7 +59,12 @@ namespace fk
|
|||
return consume();
|
||||
}
|
||||
|
||||
if (type_all({NODE_OPAR, NODE_RARROW}))
|
||||
if (type_all({NODE_OPAR, NODE_IDENT, NODE_OPAR, NODE_IDENT})
|
||||
&& m_tokens[m_cursor + 1]->repr() == "$")
|
||||
{
|
||||
return parse_fundecl();
|
||||
}
|
||||
else if (type_all({NODE_OPAR, NODE_RARROW}))
|
||||
{
|
||||
return parse_lambda();
|
||||
}
|
||||
|
@ -134,6 +139,31 @@ namespace fk
|
|||
return node;
|
||||
}
|
||||
|
||||
std::shared_ptr<Node> Parser::parse_fundecl()
|
||||
{
|
||||
consume(NODE_OPAR);
|
||||
auto dollar = consume(NODE_IDENT);
|
||||
|
||||
consume(NODE_OPAR);
|
||||
auto ident = consume(NODE_IDENT);
|
||||
auto params = parse_params();
|
||||
consume(NODE_CPAR);
|
||||
|
||||
auto body = parse_body();
|
||||
consume(NODE_CPAR);
|
||||
|
||||
auto res = make_node(NODE_CALL);
|
||||
res->add_child(dollar);
|
||||
res->add_child(ident);
|
||||
|
||||
auto lambda = make_node(NODE_LAMBDA);
|
||||
lambda->add_child(params);
|
||||
lambda->add_child(body);
|
||||
res->add_child(lambda);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
std::shared_ptr<Node> Parser::make_node(NodeType type)
|
||||
{
|
||||
return std::make_shared<Node>(type, "", loc());
|
||||
|
|
|
@ -26,6 +26,7 @@ namespace fk
|
|||
std::shared_ptr<Node> parse_lambda();
|
||||
std::shared_ptr<Node> parse_params();
|
||||
std::shared_ptr<Node> parse_body();
|
||||
std::shared_ptr<Node> parse_fundecl();
|
||||
|
||||
std::shared_ptr<Node> make_node(NodeType type);
|
||||
Loc loc() const;
|
||||
|
|
|
@ -47,3 +47,10 @@ TEST_CASE_METHOD(ParserTest, "Parser_lambda")
|
|||
test_parse("MODULE(LAMBDA(PARAMS(IDENT[x],IDENT[y]),BODY(INT[7])))",
|
||||
" (-> (x y) 7) ");
|
||||
}
|
||||
|
||||
TEST_CASE_METHOD(ParserTest, "Parser_fundecl")
|
||||
{
|
||||
test_parse("MODULE(CALL(IDENT[$],IDENT[f],"
|
||||
"LAMBDA(PARAMS(IDENT[x]),BODY(INT[7]))))",
|
||||
" ($ (f x) 7) ");
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue