From: Wolfgang (Blub) Bumiller Date: Mon, 12 Nov 2012 23:39:39 +0000 (+0100) Subject: when finishing an array-indexing operation the parser now calls rotate_entfield_array... X-Git-Tag: 0.1~19^2~4 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=b0326c66ed5da46c3d895cde52e7af65a8b68abd;p=xonotic%2Fgmqcc.git when finishing an array-indexing operation the parser now calls rotate_entfield_array_index_nodes to fixup 'ent.foo[n]' to become 'ent.(foo[n])' --- diff --git a/parser.c b/parser.c index 250a75a..894e0a6 100644 --- a/parser.c +++ b/parser.c @@ -380,6 +380,42 @@ static sy_elem syparen(lex_ctx ctx, int p, size_t off) { # define DEBUGSHUNTDO(x) #endif +/* With regular precedence rules, ent.foo[n] is the same as (ent.foo)[n], + * so we need to rotate it to become ent.(foo[n]). + */ +static void rotate_entfield_array_index_nodes(ast_expression **out) +{ + ast_array_index *index; + ast_entfield *entfield; + + ast_value *field; + ast_expression *sub; + ast_expression *entity; + + lex_ctx ctx = ast_ctx(*out); + + if (!ast_istype(*out, ast_array_index)) + return; + index = (ast_array_index*)*out; + + if (!ast_istype(index->array, ast_entfield)) + return; + entfield = (ast_entfield*)index->array; + + if (!ast_istype(entfield->field, ast_value)) + return; + field = (ast_value*)entfield->field; + + sub = index->index; + entity = entfield->entity; + + ast_delete(index); + + index = ast_array_index_new(ctx, (ast_expression*)field, sub); + entfield = ast_entfield_new(ctx, entity, (ast_expression*)index); + *out = (ast_expression*)entfield; +} + static bool parser_sy_pop(parser_t *parser, shunt *sy) { const oper_info *op; @@ -478,6 +514,7 @@ static bool parser_sy_pop(parser_t *parser, shunt *sy) return false; } out = (ast_expression*)ast_array_index_new(ctx, exprs[0], exprs[1]); + rotate_entfield_array_index_nodes(&out); break; case opid1(','):