break;
cp_get(cp);
}
- if (lj_char_isident(cp->c))
+ if (lj_char_isident(cp->c) && !(cp->mode & CPARSE_MODE_SKIP))
cp_errmsg(cp, cp->c, LJ_ERR_XNUMBER);
return CTOK_INTEGER;
}
cp_check(cp, ')');
if (cp_opt(cp, '{')) { /* Skip function definition. */
int level = 1;
+ cp->mode |= CPARSE_MODE_SKIP;
for (;;) {
if (cp->tok == '{') level++;
else if (cp->tok == '}' && --level == 0) break;
else if (cp->tok == CTOK_EOF) cp_err_token(cp, '}');
cp_next(cp);
}
+ cp->mode &= ~CPARSE_MODE_SKIP;
cp->tok = ';'; /* Ok for cp_decl_multi(), error in cp_decl_single(). */
}
info |= (fdecl->fattr & ~CTMASK_CID);
#define CPARSE_MODE_DIRECT 4 /* Accept direct declarators. */
#define CPARSE_MODE_FIELD 8 /* Accept field width in bits, too. */
#define CPARSE_MODE_NOIMPLICIT 16 /* Reject implicit declarations. */
+#define CPARSE_MODE_SKIP 32 /* Skip definitions, ignore errors. */
typedef int CPChar; /* C parser character. Unsigned ext. from char. */
typedef int CPToken; /* C parser token. */