aboutsummaryrefslogtreecommitdiff
path: root/src/parser.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2017-12-17 11:44:26 +0000
committergingerBill <bill@gingerbill.org>2017-12-17 11:44:26 +0000
commit32a502d14ebea99ed1f526904635ff66afda8fd4 (patch)
tree3bc13428d8e0e4c07b313ffb39b35abf3dd3b149 /src/parser.cpp
parent0d665c637f164bb077b9d63bb947690affede6dd (diff)
using x in bar;
Diffstat (limited to 'src/parser.cpp')
-rw-r--r--src/parser.cpp25
1 files changed, 23 insertions, 2 deletions
diff --git a/src/parser.cpp b/src/parser.cpp
index 8c96b1fb2..e8dbd1a05 100644
--- a/src/parser.cpp
+++ b/src/parser.cpp
@@ -307,6 +307,12 @@ AST_NODE_KIND(_ComplexStmtBegin, "", i32) \
Token token; \
Array<AstNode *> list; \
}) \
+ AST_NODE_KIND(UsingInStmt, "using in statement", struct { \
+ Token using_token; \
+ Array<AstNode *> list; \
+ Token in_token; \
+ AstNode *expr; \
+ }) \
AST_NODE_KIND(AsmOperand, "assembly operand", struct { \
Token string; \
AstNode *operand; \
@@ -598,6 +604,7 @@ Token ast_node_token(AstNode *node) {
case AstNode_DeferStmt: return node->DeferStmt.token;
case AstNode_BranchStmt: return node->BranchStmt.token;
case AstNode_UsingStmt: return node->UsingStmt.token;
+ case AstNode_UsingInStmt: return node->UsingInStmt.using_token;
case AstNode_AsmStmt: return node->AsmStmt.token;
case AstNode_PushContext: return node->PushContext.token;
@@ -827,6 +834,10 @@ AstNode *clone_ast_node(gbAllocator a, AstNode *node) {
case AstNode_UsingStmt:
n->UsingStmt.list = clone_ast_node_array(a, n->UsingStmt.list);
break;
+ case AstNode_UsingInStmt:
+ n->UsingInStmt.list = clone_ast_node_array(a, n->UsingInStmt.list);
+ n->UsingInStmt.expr = clone_ast_node(a, n->UsingInStmt.expr);
+ break;
case AstNode_AsmOperand:
n->AsmOperand.operand = clone_ast_node(a, n->AsmOperand.operand);
break;
@@ -1341,6 +1352,14 @@ AstNode *ast_using_stmt(AstFile *f, Token token, Array<AstNode *> list) {
result->UsingStmt.list = list;
return result;
}
+AstNode *ast_using_in_stmt(AstFile *f, Token using_token, Array<AstNode *> list, Token in_token, AstNode *expr) {
+ AstNode *result = make_ast_node(f, AstNode_UsingInStmt);
+ result->UsingInStmt.using_token = using_token;
+ result->UsingInStmt.list = list;
+ result->UsingInStmt.in_token = in_token;
+ result->UsingInStmt.expr = expr;
+ return result;
+}
AstNode *ast_asm_operand(AstFile *f, Token string, AstNode *operand) {
@@ -4535,8 +4554,10 @@ AstNode *parse_stmt(AstFile *f) {
}
return export_decl;
}
- syntax_error(token, "Illegal use of 'using' statement");
- return ast_bad_stmt(f, token, f->curr_token);
+
+ AstNode *expr = parse_expr(f, true);
+ expect_semicolon(f, expr);
+ return ast_using_in_stmt(f, token, list, in_token, expr);
}
if (f->curr_token.kind != Token_Colon) {