ADD: blocks.
parent
43a029ebc9
commit
ab64ab8007
|
@ -7,9 +7,11 @@ EXPR ::=
|
||||||
| FUNDECL
|
| FUNDECL
|
||||||
| FUNCALL
|
| FUNCALL
|
||||||
| LAMBDA
|
| LAMBDA
|
||||||
|
| BLOCK
|
||||||
VARDECL ::= opar decl ident EXPR cpar
|
VARDECL ::= opar decl ident EXPR cpar
|
||||||
FUNDECL ::= opar decl opar ident* cpar BODY 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*
|
||||||
BODY ::= EXPR*
|
BODY ::= EXPR*
|
||||||
|
BLOCK ::= opar colon EXPR* cpar
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
(assert-eq? 6 (: 2 4 6))
|
||||||
|
(assert-eq? 9 (: 2 4 (: 3 0 9)))
|
|
@ -30,6 +30,7 @@ namespace grino
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
|
case NODE_BLOCK:
|
||||||
case NODE_BODY: {
|
case NODE_BODY: {
|
||||||
for (size_t i=0; i<node->size(); i++)
|
for (size_t i=0; i<node->size(); i++)
|
||||||
{
|
{
|
||||||
|
|
|
@ -7,6 +7,7 @@ namespace grino
|
||||||
: m_logger { logger }
|
: m_logger { logger }
|
||||||
, m_loc {source_path, 1}
|
, m_loc {source_path, 1}
|
||||||
{
|
{
|
||||||
|
add_text(NODE_COLON, ":", false);
|
||||||
add_text(NODE_OPAR, "(", false);
|
add_text(NODE_OPAR, "(", false);
|
||||||
add_text(NODE_CPAR, ")", false);
|
add_text(NODE_CPAR, ")", false);
|
||||||
add_text(NODE_DECL, "$", false);
|
add_text(NODE_DECL, "$", false);
|
||||||
|
|
|
@ -16,7 +16,9 @@
|
||||||
G(NODE_DECL), \
|
G(NODE_DECL), \
|
||||||
G(NODE_LAMBDA), \
|
G(NODE_LAMBDA), \
|
||||||
G(NODE_PARAMS), \
|
G(NODE_PARAMS), \
|
||||||
G(NODE_BODY),
|
G(NODE_BODY), \
|
||||||
|
G(NODE_COLON), \
|
||||||
|
G(NODE_BLOCK)
|
||||||
|
|
||||||
namespace grino
|
namespace grino
|
||||||
{
|
{
|
||||||
|
|
|
@ -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_COLON}))
|
||||||
|
{
|
||||||
|
return parse_block();
|
||||||
|
}
|
||||||
|
|
||||||
if (type_is({NODE_OPAR, NODE_DECL, NODE_OPAR}))
|
if (type_is({NODE_OPAR, NODE_DECL, NODE_OPAR}))
|
||||||
{
|
{
|
||||||
return parse_fundecl();
|
return parse_fundecl();
|
||||||
|
@ -250,4 +255,21 @@ namespace grino
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<Node> Parser::parse_block()
|
||||||
|
{
|
||||||
|
auto node = make_node(NODE_BLOCK);
|
||||||
|
|
||||||
|
consume(NODE_OPAR);
|
||||||
|
consume(NODE_COLON);
|
||||||
|
|
||||||
|
while (!type_is(NODE_CPAR))
|
||||||
|
{
|
||||||
|
node->add_child(parse_expr());
|
||||||
|
}
|
||||||
|
|
||||||
|
consume(NODE_CPAR);
|
||||||
|
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,6 +40,7 @@ namespace grino
|
||||||
std::shared_ptr<Node> parse_lambda();
|
std::shared_ptr<Node> parse_lambda();
|
||||||
std::shared_ptr<Node> parse_params();
|
std::shared_ptr<Node> parse_params();
|
||||||
std::shared_ptr<Node> parse_body();
|
std::shared_ptr<Node> parse_body();
|
||||||
|
std::shared_ptr<Node> parse_block();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -99,3 +99,12 @@ TEST_CASE_METHOD(LexerTest, "Lexer_lambda")
|
||||||
test_next(lexer, "LAMBDA");
|
test_next(lexer, "LAMBDA");
|
||||||
test_end(lexer);
|
test_end(lexer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE_METHOD(LexerTest, "Lexer_block")
|
||||||
|
{
|
||||||
|
grino::Lexer lexer {m_logger, "tests/lexer"};
|
||||||
|
|
||||||
|
lexer.scan(" : ");
|
||||||
|
test_next(lexer, "COLON");
|
||||||
|
test_end(lexer);
|
||||||
|
}
|
||||||
|
|
|
@ -81,3 +81,9 @@ TEST_CASE_METHOD(ParserTest, "Parser_fundecl")
|
||||||
"BODY(FUNCALL(IDENT[+],IDENT[x],INT[1])))))",
|
"BODY(FUNCALL(IDENT[+],IDENT[x],INT[1])))))",
|
||||||
"($ (f x) (+ x 1))");
|
"($ (f x) (+ x 1))");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE_METHOD(ParserTest, "Parser_block")
|
||||||
|
{
|
||||||
|
test_parse("MODULE(BLOCK(INT[1],BOOL[true],IDENT[salut]))",
|
||||||
|
"(: 1 true salut )");
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue