bc: allow {break} and {continue} (allow RBRACE to terminate them)
function old new delta zbc_parse_stmt_possibly_auto 1599 1560 -39 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
d4b721cc8b
commit
5fa74b9efc
@ -3927,7 +3927,7 @@ static BC_STATUS zbc_parse_read(BcParse *p)
|
|||||||
|
|
||||||
bc_parse_push(p, XC_INST_READ);
|
bc_parse_push(p, XC_INST_READ);
|
||||||
|
|
||||||
RETURN_STATUS(zbc_lex_next(&p->l));
|
RETURN_STATUS(s);
|
||||||
}
|
}
|
||||||
#define zbc_parse_read(...) (zbc_parse_read(__VA_ARGS__) COMMA_SUCCESS)
|
#define zbc_parse_read(...) (zbc_parse_read(__VA_ARGS__) COMMA_SUCCESS)
|
||||||
|
|
||||||
@ -3953,7 +3953,7 @@ static BC_STATUS zbc_parse_builtin(BcParse *p, BcLexType type, uint8_t flags,
|
|||||||
*prev = (type == BC_LEX_KEY_LENGTH) ? XC_INST_LENGTH : XC_INST_SQRT;
|
*prev = (type == BC_LEX_KEY_LENGTH) ? XC_INST_LENGTH : XC_INST_SQRT;
|
||||||
bc_parse_push(p, *prev);
|
bc_parse_push(p, *prev);
|
||||||
|
|
||||||
RETURN_STATUS(zbc_lex_next(&p->l));
|
RETURN_STATUS(s);
|
||||||
}
|
}
|
||||||
#define zbc_parse_builtin(...) (zbc_parse_builtin(__VA_ARGS__) COMMA_SUCCESS)
|
#define zbc_parse_builtin(...) (zbc_parse_builtin(__VA_ARGS__) COMMA_SUCCESS)
|
||||||
|
|
||||||
@ -4328,7 +4328,6 @@ static BC_STATUS zbc_parse_for(BcParse *p)
|
|||||||
|
|
||||||
static BC_STATUS zbc_parse_break_or_continue(BcParse *p, BcLexType type)
|
static BC_STATUS zbc_parse_break_or_continue(BcParse *p, BcLexType type)
|
||||||
{
|
{
|
||||||
BcStatus s;
|
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
if (type == BC_LEX_KEY_BREAK) {
|
if (type == BC_LEX_KEY_BREAK) {
|
||||||
@ -4338,15 +4337,8 @@ static BC_STATUS zbc_parse_break_or_continue(BcParse *p, BcLexType type)
|
|||||||
} else {
|
} else {
|
||||||
i = *(size_t*)bc_vec_top(&p->conds);
|
i = *(size_t*)bc_vec_top(&p->conds);
|
||||||
}
|
}
|
||||||
|
|
||||||
bc_parse_pushJUMP(p, i);
|
bc_parse_pushJUMP(p, i);
|
||||||
|
|
||||||
s = zbc_lex_next(&p->l);
|
|
||||||
if (s) RETURN_STATUS(s);
|
|
||||||
|
|
||||||
if (p->l.lex != BC_LEX_SCOLON && p->l.lex != XC_LEX_NLINE)
|
|
||||||
RETURN_STATUS(bc_error_bad_token());
|
|
||||||
|
|
||||||
RETURN_STATUS(zbc_lex_next(&p->l));
|
RETURN_STATUS(zbc_lex_next(&p->l));
|
||||||
}
|
}
|
||||||
#define zbc_parse_break_or_continue(...) (zbc_parse_break_or_continue(__VA_ARGS__) COMMA_SUCCESS)
|
#define zbc_parse_break_or_continue(...) (zbc_parse_break_or_continue(__VA_ARGS__) COMMA_SUCCESS)
|
||||||
@ -4800,9 +4792,9 @@ 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_builtin(p, t, flags, &prev);
|
s = zbc_parse_builtin(p, t, flags, &prev);
|
||||||
|
get_token = true;
|
||||||
paren_expr = true;
|
paren_expr = true;
|
||||||
rprn = bin_last = false;
|
rprn = bin_last = false;
|
||||||
//get_token = false; - already is
|
|
||||||
nexprs++;
|
nexprs++;
|
||||||
break;
|
break;
|
||||||
case BC_LEX_KEY_READ:
|
case BC_LEX_KEY_READ:
|
||||||
@ -4810,9 +4802,9 @@ static BcStatus bc_parse_expr_empty_ok(BcParse *p, uint8_t flags)
|
|||||||
return bc_error_bad_expression();
|
return bc_error_bad_expression();
|
||||||
s = zbc_parse_read(p);
|
s = zbc_parse_read(p);
|
||||||
prev = XC_INST_READ;
|
prev = XC_INST_READ;
|
||||||
|
get_token = true;
|
||||||
paren_expr = true;
|
paren_expr = true;
|
||||||
rprn = bin_last = false;
|
rprn = bin_last = false;
|
||||||
//get_token = false; - already is
|
|
||||||
nexprs++;
|
nexprs++;
|
||||||
break;
|
break;
|
||||||
case BC_LEX_KEY_SCALE:
|
case BC_LEX_KEY_SCALE:
|
||||||
@ -4820,9 +4812,9 @@ static BcStatus bc_parse_expr_empty_ok(BcParse *p, uint8_t flags)
|
|||||||
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;
|
prev = XC_INST_SCALE;
|
||||||
|
//get_token = false; - already is
|
||||||
paren_expr = true;
|
paren_expr = true;
|
||||||
rprn = bin_last = false;
|
rprn = bin_last = false;
|
||||||
//get_token = false; - already is
|
|
||||||
nexprs++;
|
nexprs++;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -66,7 +66,7 @@ testing "bc if 0 else if 1" \
|
|||||||
"2\n9\n" \
|
"2\n9\n" \
|
||||||
"" "if (0) 1 else if (1) 2; 9"
|
"" "if (0) 1 else if (1) 2; 9"
|
||||||
|
|
||||||
testing "bc for(;;)" \
|
testing "bc for (;;)" \
|
||||||
"bc" \
|
"bc" \
|
||||||
"2\n3\n2\n9\n" \
|
"2\n3\n2\n9\n" \
|
||||||
"" "i=2; for (;;) { 2; if(--i==0) break; 3; }; 9"
|
"" "i=2; for (;;) { 2; if(--i==0) break; 3; }; 9"
|
||||||
@ -86,6 +86,11 @@ testing "bc for (init;cond;upd)" \
|
|||||||
"1\n2\n3\n9\n" \
|
"1\n2\n3\n9\n" \
|
||||||
"" "for(i=1;i<4;i++)i; 9"
|
"" "for(i=1;i<4;i++)i; 9"
|
||||||
|
|
||||||
|
testing "bc for (;;) {break}" \
|
||||||
|
"bc" \
|
||||||
|
"2\n9\n" \
|
||||||
|
"" "for (;;) {2;break}; 9"
|
||||||
|
|
||||||
testing "bc define auto" \
|
testing "bc define auto" \
|
||||||
"bc" \
|
"bc" \
|
||||||
"8\n9\n" \
|
"8\n9\n" \
|
||||||
|
Loading…
Reference in New Issue
Block a user