ADD: syntaxic sugar for function declaration.
parent
a5ec909a5a
commit
43a029ebc9
|
@ -4,9 +4,11 @@ EXPR ::=
|
||||||
| int
|
| int
|
||||||
| ident
|
| ident
|
||||||
| VARDECL
|
| VARDECL
|
||||||
|
| FUNDECL
|
||||||
| FUNCALL
|
| FUNCALL
|
||||||
| LAMBDA
|
| LAMBDA
|
||||||
VARDECL ::= opar decl ident EXPR cpar
|
VARDECL ::= opar decl ident EXPR cpar
|
||||||
|
FUNDECL ::= opar decl opar ident* cpar BODY cpar
|
||||||
FUNCALL ::= opar EXPR EXPR* cpar
|
FUNCALL ::= opar EXPR EXPR* cpar
|
||||||
LAMBDA ::= opar lambda opar PARAMS cpar BODY cpar
|
LAMBDA ::= opar lambda opar PARAMS cpar BODY cpar
|
||||||
PARAMS ::= ident*
|
PARAMS ::= ident*
|
||||||
|
|
|
@ -8,3 +8,7 @@
|
||||||
|
|
||||||
;; calling function literal
|
;; calling function literal
|
||||||
(assert-eq? 7 ( (-> (x y) (+ x y 1)) 2 4 ))
|
(assert-eq? 7 ( (-> (x y) (+ x y 1)) 2 4 ))
|
||||||
|
|
||||||
|
;; syntaxic sugar for function declaration
|
||||||
|
($ (c n) (* 2 n))
|
||||||
|
(assert-eq? 18 (c 9))
|
|
@ -118,6 +118,11 @@ namespace grino
|
||||||
|
|
||||||
std::shared_ptr<Node> Parser::parse_expr()
|
std::shared_ptr<Node> Parser::parse_expr()
|
||||||
{
|
{
|
||||||
|
if (type_is({NODE_OPAR, NODE_DECL, NODE_OPAR}))
|
||||||
|
{
|
||||||
|
return parse_fundecl();
|
||||||
|
}
|
||||||
|
|
||||||
if (type_is({NODE_OPAR, NODE_DECL}))
|
if (type_is({NODE_OPAR, NODE_DECL}))
|
||||||
{
|
{
|
||||||
return parse_vardecl();
|
return parse_vardecl();
|
||||||
|
@ -164,6 +169,31 @@ namespace grino
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<Node> Parser::parse_fundecl()
|
||||||
|
{
|
||||||
|
consume(NODE_OPAR);
|
||||||
|
consume(NODE_DECL);
|
||||||
|
|
||||||
|
consume(NODE_OPAR);
|
||||||
|
auto ident = consume(NODE_IDENT);
|
||||||
|
|
||||||
|
auto params = parse_params();
|
||||||
|
consume(NODE_CPAR);
|
||||||
|
|
||||||
|
auto body = parse_body();
|
||||||
|
consume(NODE_CPAR);
|
||||||
|
|
||||||
|
auto lambda = make_node(NODE_LAMBDA);
|
||||||
|
lambda->add_child(params);
|
||||||
|
lambda->add_child(body);
|
||||||
|
|
||||||
|
auto node = make_node(NODE_VARDECL);
|
||||||
|
node->add_child(ident);
|
||||||
|
node->add_child(lambda);
|
||||||
|
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
std::shared_ptr<Node> Parser::parse_funcall()
|
std::shared_ptr<Node> Parser::parse_funcall()
|
||||||
{
|
{
|
||||||
consume(NODE_OPAR);
|
consume(NODE_OPAR);
|
||||||
|
|
|
@ -35,6 +35,7 @@ namespace grino
|
||||||
std::shared_ptr<Node> parse_module();
|
std::shared_ptr<Node> parse_module();
|
||||||
std::shared_ptr<Node> parse_expr();
|
std::shared_ptr<Node> parse_expr();
|
||||||
std::shared_ptr<Node> parse_vardecl();
|
std::shared_ptr<Node> parse_vardecl();
|
||||||
|
std::shared_ptr<Node> parse_fundecl();
|
||||||
std::shared_ptr<Node> parse_funcall();
|
std::shared_ptr<Node> parse_funcall();
|
||||||
std::shared_ptr<Node> parse_lambda();
|
std::shared_ptr<Node> parse_lambda();
|
||||||
std::shared_ptr<Node> parse_params();
|
std::shared_ptr<Node> parse_params();
|
||||||
|
|
|
@ -74,3 +74,10 @@ TEST_CASE_METHOD(ParserTest, "Parser_lambda")
|
||||||
"( (-> (x) x ) 4 )");
|
"( (-> (x) x ) 4 )");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE_METHOD(ParserTest, "Parser_fundecl")
|
||||||
|
{
|
||||||
|
test_parse("MODULE(VARDECL(IDENT[f],LAMBDA(PARAMS(IDENT[x]),"
|
||||||
|
"BODY(FUNCALL(IDENT[+],IDENT[x],INT[1])))))",
|
||||||
|
"($ (f x) (+ x 1))");
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue