]> git.rm.cloudns.org Git - xonotic/gmqcc.git/commitdiff
Handling [ in the SYA
authorWolfgang (Blub) Bumiller <blub@speed.at>
Sun, 11 Nov 2012 17:45:43 +0000 (18:45 +0100)
committerWolfgang (Blub) Bumiller <blub@speed.at>
Sun, 11 Nov 2012 17:45:43 +0000 (18:45 +0100)
parser.c

index 12241cb7083aff4b61106ca364445d7ccbda0e6e..2d3dda9452247d6004a865af49142176314c2d55 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -1000,7 +1000,13 @@ static bool parser_close_paren(parser_t *parser, shunt *sy, bool functions_only)
             return !functions_only;
         }
         if (sy->ops[sy->ops_count-1].paren == SY_PAREN_INDEX) {
+            if (functions_only)
+                return false;
+            /* pop off the parenthesis */
             sy->ops_count--;
+            /* then apply the index operator */
+            if (!parser_sy_pop(parser, sy))
+                return false;
             return true;
         }
         if (!parser_sy_pop(parser, sy))
@@ -1290,10 +1296,12 @@ static ast_expression* parse_expression_leave(parser_t *parser, bool stopatcomma
                     goto onerr;
                 }
                 ++parens;
-                if (!shunt_ops_add(&sy, syparen(parser_ctx(parser), SY_PAREN_INDEX, 0))) {
-                    parseerror(parser, "out of memory");
+                /* push both the operator and the paren, this makes life easier */
+                if (!shunt_ops_add(&sy, syop(parser_ctx(parser), op)))
                     goto onerr;
-                }
+                if (!shunt_ops_add(&sy, syparen(parser_ctx(parser), SY_PAREN_INDEX, 0)))
+                    goto onerr;
+                wantop = false;
             } else {
                 DEBUGSHUNTDO(printf("push operator %s\n", op->op));
                 if (!shunt_ops_add(&sy, syop(parser_ctx(parser), op)))
@@ -1304,7 +1312,7 @@ static ast_expression* parse_expression_leave(parser_t *parser, bool stopatcomma
         if (!parser_next(parser)) {
             goto onerr;
         }
-        if (parser->tok == ';' || parser->tok == ']') {
+        if (parser->tok == ';' || (!parens && parser->tok == ']')) {
             break;
         }
     }