bc: simplify bc_parse_expr_empty_ok()
function old new delta bc_parse_expr_empty_ok 1846 1819 -27 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
d897c9aca6
commit
bb116031a0
@ -4661,20 +4661,21 @@ static BC_STATUS zbc_parse_stmt_or_funcdef(BcParse *p)
|
|||||||
// This is not a "z" function: can also return BC_STATUS_PARSE_EMPTY_EXP
|
// This is not a "z" function: can also return BC_STATUS_PARSE_EMPTY_EXP
|
||||||
static BcStatus bc_parse_expr_empty_ok(BcParse *p, uint8_t flags)
|
static BcStatus bc_parse_expr_empty_ok(BcParse *p, uint8_t flags)
|
||||||
{
|
{
|
||||||
BcStatus s = BC_STATUS_SUCCESS;
|
|
||||||
BcInst prev = XC_INST_PRINT;
|
BcInst prev = XC_INST_PRINT;
|
||||||
BcLexType top, t = p->l.lex;
|
BcLexType top, t = p->l.lex;
|
||||||
size_t nexprs = 0, ops_bgn = p->ops.len;
|
size_t nexprs = 0, ops_bgn = p->ops.len;
|
||||||
unsigned nparens, nrelops;
|
unsigned nparens, nrelops;
|
||||||
bool paren_first, paren_expr, rprn, done, get_token, assign, bin_last;
|
bool paren_first, paren_expr, rprn, get_token, assign, bin_last;
|
||||||
|
|
||||||
dbg_lex_enter("%s:%d entered", __func__, __LINE__);
|
dbg_lex_enter("%s:%d entered", __func__, __LINE__);
|
||||||
paren_first = (p->l.lex == BC_LEX_LPAREN);
|
paren_first = (p->l.lex == BC_LEX_LPAREN);
|
||||||
nparens = nrelops = 0;
|
nparens = nrelops = 0;
|
||||||
paren_expr = rprn = done = get_token = assign = false;
|
paren_expr = rprn = get_token = assign = false;
|
||||||
bin_last = true;
|
bin_last = true;
|
||||||
|
|
||||||
for (; !G_interrupt && !s && !done && bc_parse_exprs(t); t = p->l.lex) {
|
for (; bc_parse_exprs(t); t = p->l.lex) {
|
||||||
|
BcStatus s = BC_STATUS_SUCCESS;
|
||||||
|
|
||||||
dbg_lex("%s:%d t:%d", __func__, __LINE__, t);
|
dbg_lex("%s:%d t:%d", __func__, __LINE__, t);
|
||||||
switch (t) {
|
switch (t) {
|
||||||
case BC_LEX_OP_INC:
|
case BC_LEX_OP_INC:
|
||||||
@ -4743,10 +4744,7 @@ static BcStatus bc_parse_expr_empty_ok(BcParse *p, uint8_t flags)
|
|||||||
if (bin_last || prev == XC_INST_BOOL_NOT)
|
if (bin_last || prev == XC_INST_BOOL_NOT)
|
||||||
return bc_error_bad_expression();
|
return bc_error_bad_expression();
|
||||||
if (nparens == 0) {
|
if (nparens == 0) {
|
||||||
s = BC_STATUS_SUCCESS;
|
goto exit_loop;
|
||||||
done = true;
|
|
||||||
get_token = false;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
if (!paren_expr) {
|
if (!paren_expr) {
|
||||||
dbg_lex_done("%s:%d done (returning EMPTY_EXP)", __func__, __LINE__);
|
dbg_lex_done("%s:%d done (returning EMPTY_EXP)", __func__, __LINE__);
|
||||||
@ -4763,7 +4761,7 @@ static BcStatus bc_parse_expr_empty_ok(BcParse *p, uint8_t flags)
|
|||||||
paren_expr = true;
|
paren_expr = true;
|
||||||
rprn = get_token = bin_last = false;
|
rprn = get_token = bin_last = false;
|
||||||
s = zbc_parse_name(p, &prev, flags & ~BC_PARSE_NOCALL);
|
s = zbc_parse_name(p, &prev, flags & ~BC_PARSE_NOCALL);
|
||||||
++nexprs;
|
nexprs++;
|
||||||
break;
|
break;
|
||||||
case XC_LEX_NUMBER:
|
case XC_LEX_NUMBER:
|
||||||
if (BC_PARSE_LEAF(prev, rprn))
|
if (BC_PARSE_LEAF(prev, rprn))
|
||||||
@ -4807,21 +4805,24 @@ static BcStatus bc_parse_expr_empty_ok(BcParse *p, uint8_t flags)
|
|||||||
if (BC_PARSE_LEAF(prev, rprn))
|
if (BC_PARSE_LEAF(prev, rprn))
|
||||||
return bc_error_bad_expression();
|
return bc_error_bad_expression();
|
||||||
s = zbc_parse_scale(p, &prev, flags);
|
s = zbc_parse_scale(p, &prev, flags);
|
||||||
|
prev = XC_INST_SCALE;
|
||||||
paren_expr = true;
|
paren_expr = true;
|
||||||
rprn = get_token = bin_last = false;
|
rprn = get_token = bin_last = false;
|
||||||
nexprs++;
|
nexprs++;
|
||||||
prev = XC_INST_SCALE;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
s = bc_error_bad_token();
|
s = bc_error_bad_token();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!s && get_token) s = zbc_lex_next(&p->l);
|
if (s || G_interrupt) // error, or ^C: stop parsing
|
||||||
|
return BC_STATUS_FAILURE;
|
||||||
|
if (get_token) {
|
||||||
|
s = zbc_lex_next(&p->l);
|
||||||
|
if (s) return s;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
exit_loop:
|
||||||
if (s) return s;
|
|
||||||
if (G_interrupt) return BC_STATUS_FAILURE; // ^C: stop parsing
|
|
||||||
|
|
||||||
while (p->ops.len > ops_bgn) {
|
while (p->ops.len > ops_bgn) {
|
||||||
top = BC_PARSE_TOP_OP(p);
|
top = BC_PARSE_TOP_OP(p);
|
||||||
@ -4840,20 +4841,23 @@ static BcStatus bc_parse_expr_empty_ok(BcParse *p, uint8_t flags)
|
|||||||
return bc_error_bad_expression();
|
return bc_error_bad_expression();
|
||||||
|
|
||||||
if (!(flags & BC_PARSE_REL) && nrelops) {
|
if (!(flags & BC_PARSE_REL) && nrelops) {
|
||||||
|
BcStatus s;
|
||||||
s = zbc_POSIX_does_not_allow("comparison operators outside if or loops");
|
s = zbc_POSIX_does_not_allow("comparison operators outside if or loops");
|
||||||
if (s) return s;
|
if (s) return s;
|
||||||
} else if ((flags & BC_PARSE_REL) && nrelops > 1) {
|
} else if ((flags & BC_PARSE_REL) && nrelops > 1) {
|
||||||
|
BcStatus s;
|
||||||
s = zbc_POSIX_requires("exactly one comparison operator per condition");
|
s = zbc_POSIX_requires("exactly one comparison operator per condition");
|
||||||
if (s) return s;
|
if (s) return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flags & BC_PARSE_PRINT) {
|
if (flags & BC_PARSE_PRINT) {
|
||||||
if (paren_first || !assign) bc_parse_push(p, XC_INST_PRINT);
|
if (paren_first || !assign)
|
||||||
|
bc_parse_push(p, XC_INST_PRINT);
|
||||||
bc_parse_push(p, XC_INST_POP);
|
bc_parse_push(p, XC_INST_POP);
|
||||||
}
|
}
|
||||||
|
|
||||||
dbg_lex_done("%s:%d done", __func__, __LINE__);
|
dbg_lex_done("%s:%d done", __func__, __LINE__);
|
||||||
return s;
|
return BC_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // ENABLE_BC
|
#endif // ENABLE_BC
|
||||||
|
Loading…
x
Reference in New Issue
Block a user