ADD: blocks.

main
bog 2023-09-12 05:53:16 +02:00
parent 43a029ebc9
commit ab64ab8007
9 changed files with 47 additions and 1 deletions

View File

@ -7,9 +7,11 @@ EXPR ::=
| FUNDECL
| FUNCALL
| LAMBDA
| BLOCK
VARDECL ::= opar decl ident EXPR cpar
FUNDECL ::= opar decl opar ident* cpar BODY cpar
FUNCALL ::= opar EXPR EXPR* cpar
LAMBDA ::= opar lambda opar PARAMS cpar BODY cpar
PARAMS ::= ident*
BODY ::= EXPR*
BLOCK ::= opar colon EXPR* cpar

2
examples/block.gri Normal file
View File

@ -0,0 +1,2 @@
(assert-eq? 6 (: 2 4 6))
(assert-eq? 9 (: 2 4 (: 3 0 9)))

View File

@ -30,6 +30,7 @@ namespace grino
}
} break;
case NODE_BLOCK:
case NODE_BODY: {
for (size_t i=0; i<node->size(); i++)
{

View File

@ -7,6 +7,7 @@ namespace grino
: m_logger { logger }
, m_loc {source_path, 1}
{
add_text(NODE_COLON, ":", false);
add_text(NODE_OPAR, "(", false);
add_text(NODE_CPAR, ")", false);
add_text(NODE_DECL, "$", false);

View File

@ -16,7 +16,9 @@
G(NODE_DECL), \
G(NODE_LAMBDA), \
G(NODE_PARAMS), \
G(NODE_BODY),
G(NODE_BODY), \
G(NODE_COLON), \
G(NODE_BLOCK)
namespace grino
{

View File

@ -118,6 +118,11 @@ namespace grino
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}))
{
return parse_fundecl();
@ -250,4 +255,21 @@ namespace grino
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;
}
}

View File

@ -40,6 +40,7 @@ namespace grino
std::shared_ptr<Node> parse_lambda();
std::shared_ptr<Node> parse_params();
std::shared_ptr<Node> parse_body();
std::shared_ptr<Node> parse_block();
};
}

View File

@ -99,3 +99,12 @@ TEST_CASE_METHOD(LexerTest, "Lexer_lambda")
test_next(lexer, "LAMBDA");
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);
}

View File

@ -81,3 +81,9 @@ TEST_CASE_METHOD(ParserTest, "Parser_fundecl")
"BODY(FUNCALL(IDENT[+],IDENT[x],INT[1])))))",
"($ (f x) (+ x 1))");
}
TEST_CASE_METHOD(ParserTest, "Parser_block")
{
test_parse("MODULE(BLOCK(INT[1],BOOL[true],IDENT[salut]))",
"(: 1 true salut )");
}