BR 2782055: reject invalid tokens after ]
authorVictor van den Elzen <victor.vde@gmail.com>
Tue, 23 Jun 2009 01:47:07 +0000 (03:47 +0200)
committerVictor van den Elzen <victor.vde@gmail.com>
Tue, 23 Jun 2009 01:56:07 +0000 (03:56 +0200)
A bracketed memory reference should be followed by a comma or
the end of the line. Enforce this.

parser.c

index 0f64043..450511b 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -678,24 +678,32 @@ restart_parse:
                 return result;  /* ignore this instruction */
             }
         }
+
+        bool recover = false;
         if (mref && bracket) {  /* find ] at the end */
             if (i != ']') {
                 error(ERR_NONFATAL, "parser: expecting ]");
-                do {            /* error recovery again */
-                    i = stdscan(NULL, &tokval);
-                } while (i != 0 && i != ',');
-            } else              /* we got the required ] */
+                recover = true;
+            } else {            /* we got the required ] */
                 i = stdscan(NULL, &tokval);
+                if (i != 0 && i != ',') {
+                    error(ERR_NONFATAL, "comma or end of line expected");
+                    recover = true;
+                }
+            }
         } else {                /* immediate operand */
             if (i != 0 && i != ',' && i != ':') {
-                error(ERR_NONFATAL, "comma or end of line expected");
-                do {            /* error recovery */
-                    i = stdscan(NULL, &tokval);
-                } while (i != 0 && i != ',');
+                error(ERR_NONFATAL, "comma, colon or end of line expected");
+                recover = true;
             } else if (i == ':') {
                 result->oprs[operand].type |= COLON;
             }
         }
+        if (recover) {
+            do {                /* error recovery */
+                i = stdscan(NULL, &tokval);
+            } while (i != 0 && i != ',');
+        }
 
         /* now convert the exprs returned from evaluate() into operand
          * descriptions... */