aboutsummaryrefslogtreecommitdiff
path: root/src/parser.c
diff options
context:
space:
mode:
authorGinger Bill <bill@gingerbill.org>2017-01-29 20:15:16 +0000
committerGinger Bill <bill@gingerbill.org>2017-01-29 20:15:16 +0000
commit984e36a15147cb4ed681174fb1f97f4e1735411d (patch)
tree042890f3eb8a56add6091646279a599204635d18 /src/parser.c
parentec9c8fb8a49cb6f9fe8f6df806dfb5a6fcb2e148 (diff)
Dynamic arrays
Diffstat (limited to 'src/parser.c')
-rw-r--r--src/parser.c34
1 files changed, 26 insertions, 8 deletions
diff --git a/src/parser.c b/src/parser.c
index e5d6205e7..733ba0d8d 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -341,6 +341,10 @@ AST_NODE_KIND(_TypeBegin, "", i32) \
AstNode *count; \
AstNode *elem; \
}) \
+ AST_NODE_KIND(DynamicArrayType, "dynamic array type", struct { \
+ Token token; \
+ AstNode *elem; \
+ }) \
AST_NODE_KIND(VectorType, "vector type", struct { \
Token token; \
AstNode *count; \
@@ -553,6 +557,8 @@ Token ast_node_token(AstNode *node) {
return node->MaybeType.token;
case AstNode_ArrayType:
return node->ArrayType.token;
+ case AstNode_DynamicArrayType:
+ return node->DynamicArrayType.token;
case AstNode_VectorType:
return node->VectorType.token;
case AstNode_StructType:
@@ -1080,6 +1086,13 @@ AstNode *make_array_type(AstFile *f, Token token, AstNode *count, AstNode *elem)
return result;
}
+AstNode *make_dynamic_array_type(AstFile *f, Token token, AstNode *elem) {
+ AstNode *result = make_node(f, AstNode_DynamicArrayType);
+ result->DynamicArrayType.token = token;
+ result->DynamicArrayType.elem = elem;
+ return result;
+}
+
AstNode *make_vector_type(AstFile *f, Token token, AstNode *count, AstNode *elem) {
AstNode *result = make_node(f, AstNode_VectorType);
result->VectorType.token = token;
@@ -1267,7 +1280,6 @@ void fix_advance_to_next_stmt(AstFile *f) {
case Token_if:
case Token_when:
case Token_return:
- case Token_range:
case Token_match:
case Token_defer:
case Token_asm:
@@ -1463,7 +1475,7 @@ AstNode *parse_value(AstFile *f) {
return value;
}
-AstNode *parse_identifier_or_type(AstFile *f);
+AstNode *parse_type_or_ident(AstFile *f);
void check_proc_add_tag(AstFile *f, AstNode *tag_expr, u64 *tags, ProcTag tag, String tag_name) {
@@ -1839,7 +1851,7 @@ AstNode *parse_operand(AstFile *f, bool lhs) {
break;
default: {
- AstNode *type = parse_identifier_or_type(f);
+ AstNode *type = parse_type_or_ident(f);
if (type != NULL) {
// TODO(bill): Is this correct???
// NOTE(bill): Sanity check as identifiers should be handled already
@@ -2204,7 +2216,7 @@ void parse_check_name_list_for_reserves(AstFile *f, AstNodeArray names) {
}
AstNode *parse_type_attempt(AstFile *f) {
- AstNode *type = parse_identifier_or_type(f);
+ AstNode *type = parse_type_or_ident(f);
if (type != NULL) {
// TODO(bill): Handle?
}
@@ -2415,7 +2427,7 @@ AstNode *parse_var_type(AstFile *f, bool allow_ellipsis) {
if (allow_ellipsis && f->curr_token.kind == Token_Ellipsis) {
Token tok = f->curr_token;
next_token(f);
- AstNode *type = parse_identifier_or_type(f);
+ AstNode *type = parse_type_or_ident(f);
if (type == NULL) {
error(tok, "variadic field missing type after `...`");
type = make_bad_expr(f, tok, f->curr_token);
@@ -2561,7 +2573,7 @@ AstNodeArray parse_record_fields(AstFile *f, isize *field_count_, u32 flags, Str
return parse_field_list(f, field_count_, flags, Token_Comma, Token_CloseBrace);
}
-AstNode *parse_identifier_or_type(AstFile *f) {
+AstNode *parse_type_or_ident(AstFile *f) {
switch (f->curr_token.kind) {
case Token_Ident: {
AstNode *e = parse_identifier(f);
@@ -2597,7 +2609,6 @@ AstNode *parse_identifier_or_type(AstFile *f) {
}
case Token_OpenBracket: {
- f->expr_level++;
Token token = expect_token(f, Token_OpenBracket);
AstNode *count_expr = NULL;
bool is_vector = false;
@@ -2607,16 +2618,23 @@ AstNode *parse_identifier_or_type(AstFile *f) {
} else if (f->curr_token.kind == Token_vector) {
next_token(f);
if (f->curr_token.kind != Token_CloseBracket) {
+ f->expr_level++;
count_expr = parse_expr(f, false);
+ f->expr_level--;
} else {
syntax_error(f->curr_token, "Vector type missing count");
}
is_vector = true;
+ } else if (f->curr_token.kind == Token_dynamic) {
+ next_token(f);
+ expect_token(f, Token_CloseBracket);
+ return make_dynamic_array_type(f, token, parse_type(f));
} else if (f->curr_token.kind != Token_CloseBracket) {
+ f->expr_level++;
count_expr = parse_expr(f, false);
+ f->expr_level--;
}
expect_token(f, Token_CloseBracket);
- f->expr_level--;
if (is_vector) {
return make_vector_type(f, token, count_expr, parse_type(f));
}