diff options
| author | gingerBill <ginger.bill.22@gmail.com> | 2016-08-16 21:01:59 +0100 |
|---|---|---|
| committer | gingerBill <ginger.bill.22@gmail.com> | 2016-08-16 21:01:59 +0100 |
| commit | 9e61e3beee6ca5ae48db68fd03ed0c73604e7279 (patch) | |
| tree | 937d3130c4a68e2b36a3af5380b7d19f2e54aafd /src/parser.cpp | |
| parent | e8530ca883edd79c188443ced54cea2c5d3ad4ed (diff) | |
field = value, for structure literals
Diffstat (limited to 'src/parser.cpp')
| -rw-r--r-- | src/parser.cpp | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/src/parser.cpp b/src/parser.cpp index d6c450a88..051cd9779 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -115,6 +115,7 @@ AST_NODE_KIND(_ExprBegin, struct{}) \ AstNode *low, *high, *max; \ b32 triple_indexed; \ }) \ + AST_NODE_KIND(FieldValue, struct { Token eq; AstNode *field, *value; }) \ AST_NODE_KIND(Ellipsis, struct { Token token; }) \ AST_NODE_KIND(_ExprEnd, struct{}) \ AST_NODE_KIND(_StmtBegin, struct{}) \ @@ -301,6 +302,8 @@ Token ast_node_token(AstNode *node) { return node->SliceExpr.open; case AstNode_Ellipsis: return node->Ellipsis.token; + case AstNode_FieldValue: + return node->FieldValue.eq; case AstNode_DerefExpr: return node->DerefExpr.op; case AstNode_BadStmt: @@ -572,6 +575,13 @@ gb_inline AstNode *make_proc_lit(AstFile *f, AstNode *type, AstNode *body, u64 t return result; } +gb_inline AstNode *make_field_value(AstFile *f, AstNode *field, AstNode *value, Token eq) { + AstNode *result = make_node(f, AstNode_FieldValue); + result->FieldValue.field = field; + result->FieldValue.value = value; + result->FieldValue.eq = eq; + return result; +} gb_inline AstNode *make_compound_lit(AstFile *f, AstNode *type, AstNode *elem_list, isize elem_count, Token open, Token close) { @@ -930,12 +940,11 @@ AstNode *parse_element_list(AstFile *f, isize *element_count_) { while (f->cursor[0].kind != Token_CloseBrace && f->cursor[0].kind != Token_EOF) { AstNode *elem = parse_value(f); - #if 0 - // TODO(bill): Designated Initializers if (f->cursor[0].kind == Token_Eq) { Token eq = expect_token(f, Token_Eq); + AstNode *value = parse_value(f); + elem = make_field_value(f, elem, value, eq); } - #endif DLIST_APPEND(root, curr, elem); element_count++; if (f->cursor[0].kind != Token_Comma) |