ADD: namespace syntax.
parent
f7857a5d4b
commit
2fe55d2c20
|
@ -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)+
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
|
@ -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; ");
|
||||||
|
}
|
||||||
|
|
Reference in New Issue