]> git.xonotic.org Git - xonotic/gmqcc.git/commitdiff
factoring out the closing-paren handling code since it'll be used recursively
authorWolfgang Bumiller <wolfgang.linux@bumiller.com>
Fri, 27 Jul 2012 11:07:16 +0000 (13:07 +0200)
committerWolfgang Bumiller <wolfgang.linux@bumiller.com>
Fri, 27 Jul 2012 11:07:16 +0000 (13:07 +0200)
parser.c

index 75c69111e3f19655e6825aa91d1586dbb4d8b775..f95e7e087bdfc3784f1a36a493b3cddc57fe9759 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -391,6 +391,27 @@ static bool parser_sy_pop(parser_t *parser, shunt *sy)
     return true;
 }
 
+static bool parser_close_paren(parser_t *parser, shunt *sy)
+{
+    if (!sy->ops_count) {
+        parseerror(parser, "unmatched closing paren");
+        return false;
+    }
+    if (sy->ops[sy->ops_count-1].paren == 1) {
+        parseerror(parser, "empty parenthesis expression");
+        return false;
+    }
+    while (sy->ops_count) {
+        if (sy->ops[sy->ops_count-1].paren == 1) {
+            sy->ops_count--;
+            break;
+        }
+        if (!parser_sy_pop(parser, sy))
+            return false;
+    }
+    return true;
+}
+
 static ast_expression* parser_expression(parser_t *parser)
 {
     ast_expression *expr = NULL;
@@ -461,22 +482,8 @@ static ast_expression* parser_expression(parser_t *parser)
             else if (parser->tok == ')') {
                 /* we do expect an operator next */
                 /* closing an opening paren */
-                if (!sy.ops_count) {
-                    parseerror(parser, "unmatched closing paren");
+                if (!parser_close_paren(parser, &sy))
                     goto onerr;
-                }
-                if (sy.ops[sy.ops_count-1].paren == 1) {
-                    parseerror(parser, "empty parenthesis expression");
-                    goto onerr;
-                }
-                while (sy.ops_count) {
-                    if (sy.ops[sy.ops_count-1].paren == 1) {
-                        sy.ops_count--;
-                        break;
-                    }
-                    if (!parser_sy_pop(parser, &sy))
-                        goto onerr;
-                }
             }
             else if (parser->tok != TOKEN_OPERATOR) {
                 parseerror(parser, "expected operator or end of statement");