} else
var_block_close(c, CloseSequential, NULL);
} }$
- | func FuncName then IN OpenScope OptNL Args OUT OptNL do Block Newlines ${ {
- // FIXME that 'then' should not be there.
+ | func FuncName IN OpenScope OptNL Args OUT OptNL do Block Newlines ${ {
struct text funcname = { " func", 5};
$0 = $<FN;
if ($0) {
}
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;
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;