bc: shrink parsing code a bit more, disallow "auto a b c" (without commas)

function                                             old     new   delta
bc_parse_expr_empty_ok                              1791    1785      -6
zbc_parse_stmt_possibly_auto                        1675    1599     -76
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/2 up/down: 0/-82)             Total: -82 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2018-12-25 16:39:01 +01:00
parent 73b3ebc0e1
commit d4b721cc8b

View File

@ -3788,7 +3788,7 @@ static BC_STATUS zbc_parse_rightParen(BcParse *p, size_t ops_bgn, size_t *nexs)
bc_vec_pop(&p->ops); bc_vec_pop(&p->ops);
RETURN_STATUS(zbc_lex_next(&p->l)); RETURN_STATUS(BC_STATUS_SUCCESS);
} }
#define zbc_parse_rightParen(...) (zbc_parse_rightParen(__VA_ARGS__) COMMA_SUCCESS) #define zbc_parse_rightParen(...) (zbc_parse_rightParen(__VA_ARGS__) COMMA_SUCCESS)
@ -4470,53 +4470,52 @@ static BC_STATUS zbc_parse_funcdef(BcParse *p)
static BC_STATUS zbc_parse_auto(BcParse *p) static BC_STATUS zbc_parse_auto(BcParse *p)
{ {
BcStatus s; BcStatus s;
bool comma, var, one;
char *name; char *name;
dbg_lex_enter("%s:%d entered", __func__, __LINE__); dbg_lex_enter("%s:%d entered", __func__, __LINE__);
s = zbc_lex_next(&p->l); s = zbc_lex_next(&p->l);
if (s) RETURN_STATUS(s); if (s) RETURN_STATUS(s);
comma = false; for (;;) {
one = p->l.lex == XC_LEX_NAME; bool var;
if (p->l.lex != XC_LEX_NAME)
RETURN_STATUS(bc_error("bad 'auto' syntax"));
while (p->l.lex == XC_LEX_NAME) {
name = xstrdup(p->l.lex_buf.v); name = xstrdup(p->l.lex_buf.v);
s = zbc_lex_next(&p->l); s = zbc_lex_next(&p->l);
if (s) goto err; if (s) goto err;
var = p->l.lex != BC_LEX_LBRACKET; var = (p->l.lex != BC_LEX_LBRACKET);
if (!var) { if (!var) {
s = zbc_lex_next(&p->l); s = zbc_lex_next(&p->l);
if (s) goto err; if (s) goto err;
if (p->l.lex != BC_LEX_RBRACKET) { if (p->l.lex != BC_LEX_RBRACKET) {
s = bc_error("bad function definition"); s = bc_error("bad 'auto' syntax");
goto err; goto err;
} }
s = zbc_lex_next(&p->l);
if (s) goto err;
}
comma = p->l.lex == BC_LEX_COMMA;
if (comma) {
s = zbc_lex_next(&p->l); s = zbc_lex_next(&p->l);
if (s) goto err; if (s) goto err;
} }
s = zbc_func_insert(p->func, name, var); s = zbc_func_insert(p->func, name, var);
if (s) goto err; if (s) goto err;
if (p->l.lex == XC_LEX_NLINE
|| p->l.lex == BC_LEX_SCOLON
//|| p->l.lex == BC_LEX_RBRACE // allow "define f() {auto a}"
) {
break;
}
if (p->l.lex != BC_LEX_COMMA)
RETURN_STATUS(bc_error("bad 'auto' syntax"));
s = zbc_lex_next(&p->l); // skip comma
if (s) RETURN_STATUS(s);
} }
if (comma) RETURN_STATUS(bc_error("bad function definition"));
if (!one) RETURN_STATUS(bc_error("no auto variable found"));
if (p->l.lex != XC_LEX_NLINE && p->l.lex != BC_LEX_SCOLON)
RETURN_STATUS(bc_error_bad_token());
dbg_lex_done("%s:%d done", __func__, __LINE__); dbg_lex_done("%s:%d done", __func__, __LINE__);
RETURN_STATUS(zbc_lex_next(&p->l)); RETURN_STATUS(BC_STATUS_SUCCESS);
err: err:
free(name); free(name);
dbg_lex_done("%s:%d done (ERROR)", __func__, __LINE__); dbg_lex_done("%s:%d done (ERROR)", __func__, __LINE__);
@ -4707,11 +4706,10 @@ static BcStatus bc_parse_expr_empty_ok(BcParse *p, uint8_t flags)
&& prev != XC_INST_SCALE && prev != XC_INST_IBASE && prev != XC_INST_SCALE && prev != XC_INST_IBASE
&& prev != XC_INST_OBASE && prev != BC_INST_LAST && prev != XC_INST_OBASE && prev != BC_INST_LAST
) { ) {
s = bc_error("bad assignment:" return bc_error("bad assignment:"
" left side must be variable" " left side must be variable"
" or array element" " or array element"
); // note: shared string ); // note: shared string
break;
} }
// Fallthrough. // Fallthrough.
case XC_LEX_OP_POWER: case XC_LEX_OP_POWER:
@ -4762,9 +4760,9 @@ static BcStatus bc_parse_expr_empty_ok(BcParse *p, uint8_t flags)
} }
s = zbc_parse_rightParen(p, ops_bgn, &nexprs); s = zbc_parse_rightParen(p, ops_bgn, &nexprs);
nparens--; nparens--;
get_token = true;
paren_expr = rprn = true; paren_expr = rprn = true;
bin_last = false; bin_last = false;
//get_token = false; - already is
break; break;
case XC_LEX_NAME: case XC_LEX_NAME:
if (BC_PARSE_LEAF(prev, rprn)) if (BC_PARSE_LEAF(prev, rprn))