ADD: namespace syntax.

main
bog 2023-09-29 11:18:03 +02:00
parent f7857a5d4b
commit 2fe55d2c20
8 changed files with 42 additions and 2 deletions

View File

@ -24,6 +24,9 @@ LITERAL ::=
| ident | ident
| int | int
| CALL | CALL
| NS
CALL ::= ident opar ARGS cpar CALL ::= ident opar ARGS cpar
ARGS ::= (EXPR (comma EXPR)*)? ARGS ::= (EXPR (comma EXPR)*)?
NS ::= ident (dot ident)+

View File

@ -105,7 +105,7 @@ namespace wg
if (node->child(0)->repr() == "import") if (node->child(0)->repr() == "import")
{ {
std::string pkg_name = node->child(1)->repr(); std::string pkg_name = node->child(1)->repr();
std::cout << "-> " << pkg_name << std::endl; std::cout << "import pkg " << pkg_name << std::endl;
} }
return nullptr; return nullptr;

View File

@ -10,6 +10,7 @@ namespace wg
add_keyword("return", NODE_RETURN); add_keyword("return", NODE_RETURN);
add_keyword("extern", NODE_EXTERN); add_keyword("extern", NODE_EXTERN);
add_text(".", NODE_DOT);
add_text("{", NODE_OBRACE); add_text("{", NODE_OBRACE);
add_text("}", NODE_CBRACE); add_text("}", NODE_CBRACE);
add_text(",", NODE_COMMA); add_text(",", NODE_COMMA);

View File

@ -17,7 +17,7 @@
G(NODE_ARGS), G(NODE_TYPE), G(NODE_RETURN), \ G(NODE_ARGS), G(NODE_TYPE), G(NODE_RETURN), \
G(NODE_FUN), G(NODE_PARAMS), G(NODE_BLOCK), \ G(NODE_FUN), G(NODE_PARAMS), G(NODE_BLOCK), \
G(NODE_OBRACE), G(NODE_CBRACE), G(NODE_FUNDECL), \ G(NODE_OBRACE), G(NODE_CBRACE), G(NODE_FUNDECL), \
G(NODE_EXTERN), G(NODE_RET) G(NODE_EXTERN), G(NODE_RET), G(NODE_DOT), G(NODE_NS)
namespace wg namespace wg
{ {

View File

@ -280,6 +280,12 @@ namespace wg
return parse_call(); return parse_call();
} }
if (type_is(NODE_IDENT)
&& type_is(NODE_DOT, 1))
{
return parse_ns();
}
if (type_is(NODE_INT) if (type_is(NODE_INT)
|| type_is(NODE_IDENT)) || type_is(NODE_IDENT))
{ {
@ -337,4 +343,18 @@ namespace wg
return node; return node;
} }
std::shared_ptr<Node> Parser::parse_ns()
{
auto node = make_node(NODE_NS);
node->add_child(consume(NODE_IDENT));
while (type_is(NODE_DOT))
{
consume();
node->add_child(consume(NODE_IDENT));
}
return node;
}
} }

View File

@ -45,6 +45,8 @@ namespace wg
std::shared_ptr<Node> parse_call(); std::shared_ptr<Node> parse_call();
std::shared_ptr<Node> parse_args(); std::shared_ptr<Node> parse_args();
std::shared_ptr<Node> parse_ns();
}; };
} }

View File

@ -68,3 +68,11 @@ TEST_CASE_METHOD(LexerTest, "Lexer_fun_call")
test_next(lex, "EXTERN"); test_next(lex, "EXTERN");
test_end(lex); test_end(lex);
} }
TEST_CASE_METHOD(LexerTest, "Lexer_pkg_namespace")
{
wg::Lexer lex;
lex.scan(" . ");
test_next(lex, "DOT");
test_end(lex);
}

View File

@ -90,3 +90,9 @@ TEST_CASE_METHOD(ParserTest, "Parser_fundecl")
test_parse("PROG(RETURN(ADD(CALL(IDENT[a],ARGS),INT[1])))", test_parse("PROG(RETURN(ADD(CALL(IDENT[a],ARGS),INT[1])))",
" return a() + 1; "); " return a() + 1; ");
} }
TEST_CASE_METHOD(ParserTest, "Parser_namespace")
{
test_parse("PROG(NS(IDENT[a],IDENT[b],IDENT[c],IDENT[d]))",
" a.b.c.d; ");
}