ADD: namespace syntax.
parent
f7857a5d4b
commit
2fe55d2c20
|
@ -24,6 +24,9 @@ LITERAL ::=
|
|||
| ident
|
||||
| int
|
||||
| CALL
|
||||
| NS
|
||||
|
||||
CALL ::= ident opar ARGS cpar
|
||||
ARGS ::= (EXPR (comma EXPR)*)?
|
||||
|
||||
NS ::= ident (dot ident)+
|
||||
|
|
|
@ -105,7 +105,7 @@ namespace wg
|
|||
if (node->child(0)->repr() == "import")
|
||||
{
|
||||
std::string pkg_name = node->child(1)->repr();
|
||||
std::cout << "-> " << pkg_name << std::endl;
|
||||
std::cout << "import pkg " << pkg_name << std::endl;
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
|
|
|
@ -10,6 +10,7 @@ namespace wg
|
|||
add_keyword("return", NODE_RETURN);
|
||||
add_keyword("extern", NODE_EXTERN);
|
||||
|
||||
add_text(".", NODE_DOT);
|
||||
add_text("{", NODE_OBRACE);
|
||||
add_text("}", NODE_CBRACE);
|
||||
add_text(",", NODE_COMMA);
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
G(NODE_ARGS), G(NODE_TYPE), G(NODE_RETURN), \
|
||||
G(NODE_FUN), G(NODE_PARAMS), G(NODE_BLOCK), \
|
||||
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
|
||||
{
|
||||
|
|
|
@ -280,6 +280,12 @@ namespace wg
|
|||
return parse_call();
|
||||
}
|
||||
|
||||
if (type_is(NODE_IDENT)
|
||||
&& type_is(NODE_DOT, 1))
|
||||
{
|
||||
return parse_ns();
|
||||
}
|
||||
|
||||
if (type_is(NODE_INT)
|
||||
|| type_is(NODE_IDENT))
|
||||
{
|
||||
|
@ -337,4 +343,18 @@ namespace wg
|
|||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -45,6 +45,8 @@ namespace wg
|
|||
std::shared_ptr<Node> parse_call();
|
||||
std::shared_ptr<Node> parse_args();
|
||||
|
||||
std::shared_ptr<Node> parse_ns();
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -68,3 +68,11 @@ TEST_CASE_METHOD(LexerTest, "Lexer_fun_call")
|
|||
test_next(lex, "EXTERN");
|
||||
test_end(lex);
|
||||
}
|
||||
|
||||
TEST_CASE_METHOD(LexerTest, "Lexer_pkg_namespace")
|
||||
{
|
||||
wg::Lexer lex;
|
||||
lex.scan(" . ");
|
||||
test_next(lex, "DOT");
|
||||
test_end(lex);
|
||||
}
|
||||
|
|
|
@ -90,3 +90,9 @@ TEST_CASE_METHOD(ParserTest, "Parser_fundecl")
|
|||
test_parse("PROG(RETURN(ADD(CALL(IDENT[a],ARGS),INT[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; ");
|
||||
}
|
||||
|
|
Reference in New Issue