static void vcc_IfStmt(struct vcc *tl) { SkipToken(tl, ID); Fb(tl, 1, "if "); vcc_Conditional(tl); ERRCHK(tl); L(tl, vcc_Compound(tl)); ERRCHK(tl); while (tl->t->tok == ID) { if (vcc_IdIs(tl->t, "else")) { vcc_NextToken(tl); if (tl->t->tok == '{') { Fb(tl, 1, "else\n"); L(tl, vcc_Compound(tl)); ERRCHK(tl); return; } if (tl->t->tok != ID || !vcc_IdIs(tl->t, "if")) { VSB_printf(tl->sb, "'else' must be followed by 'if' or '{'\n"); vcc_ErrWhere(tl, tl->t); return; } Fb(tl, 1, "else if "); vcc_NextToken(tl); vcc_Conditional(tl); ERRCHK(tl); L(tl, vcc_Compound(tl)); ERRCHK(tl); } else if (vcc_IdIs(tl->t, "elseif") || vcc_IdIs(tl->t, "elsif") || vcc_IdIs(tl->t, "elif")) { Fb(tl, 1, "else if "); vcc_NextToken(tl); vcc_Conditional(tl); ERRCHK(tl); L(tl, vcc_Compound(tl)); ERRCHK(tl); } else { break; } } C(tl, ";"); }
static void vcc_IfStmt(struct vcc *tl) { SkipToken(tl, T_IF); Fb(tl, 1, "if "); vcc_Conditional(tl); ERRCHK(tl); L(tl, vcc_Compound(tl)); ERRCHK(tl); while (1) { switch (tl->t->tok) { case T_ELSE: vcc_NextToken(tl); if (tl->t->tok != T_IF) { Fb(tl, 1, "else\n"); L(tl, vcc_Compound(tl)); ERRCHK(tl); return; } /* FALLTHROUGH */ case T_ELSEIF: case T_ELSIF: Fb(tl, 1, "else if "); vcc_NextToken(tl); vcc_Conditional(tl); ERRCHK(tl); L(tl, vcc_Compound(tl)); ERRCHK(tl); break; default: C(tl, ";"); return; } } }