]> ocean-lang.org Git - ocean/blobdiff - csrc/parsergen.mdc
oceani: remove the need for 'then' in function declarations.
[ocean] / csrc / parsergen.mdc
index 80027aa74e49989428ea370172c3a783c8ebfd40..6cb5a7371aa3935663d05df35a186ef8d2a6da32 100644 (file)
@@ -2785,11 +2785,12 @@ might also be ignored.  Ignoring tokens is combined with shifting.
        }
 
 Indents are ignored unless they can be shifted onto the stack
-immediately.  The end of an indented section - the OUT token - is
-ignored precisely when the indent was ignored.  To keep track of this we
-need a small stack of flags, which is easily stored as bits in an
-`unsigned long`.  This will never overflow and the scanner only allows
-20 levels of indentation.
+immediately or nothing can be shifted (in which case we reduce, and try
+again).  The end of an indented section - the OUT token - is ignored
+precisely when the indent was ignored.  To keep track of this we need a
+small stack of flags, which is easily stored as bits in an `unsigned
+long`.  This will never overflow and the scanner only allows 20 levels
+of indentation.
 
 ###### parser state
        unsigned long ignored_indents;
@@ -2829,8 +2830,8 @@ we try to reduce a production.
                continue;
        }
 
-       if (tk->num == TK_in) {
-               /* No indent expected here, so ignore IN */
+       if (tk->num == TK_in && states[p.stack[p.tos-1].state].go_to_cnt > 0) {
+               /* No indent expected here and reduce is not mandatory, so ignore IN */
                free(tk);
                tk = NULL;
                p.ignored_indents <<= 1;