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:
parent
73b3ebc0e1
commit
d4b721cc8b
@ -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))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user