// BC_LEX_NEG is not used in lexing; it is only for parsing.
typedef enum BcLexType {
- BC_LEX_EOF,
- BC_LEX_INVALID,
+ XC_LEX_EOF,
+ XC_LEX_INVALID,
BC_LEX_OP_INC,
BC_LEX_OP_DEC,
BC_LEX_KEY_WHILE,
#if ENABLE_DC
- BC_LEX_EQ_NO_REG,
- BC_LEX_OP_MODEXP,
- BC_LEX_OP_DIVMOD,
-
- BC_LEX_COLON,
- BC_LEX_ELSE,
- BC_LEX_EXECUTE,
- BC_LEX_PRINT_STACK,
- BC_LEX_CLEAR_STACK,
- BC_LEX_STACK_LEVEL,
- BC_LEX_DUPLICATE,
- BC_LEX_SWAP,
- BC_LEX_POP,
-
- BC_LEX_ASCIIFY,
- BC_LEX_PRINT_STREAM,
-
- // code uses "t - BC_LEX_STORE_IBASE + XC_INST_IBASE" construct,
- BC_LEX_STORE_IBASE, // relative order should match for: XC_INST_IBASE
- BC_LEX_STORE_OBASE, // relative order should match for: XC_INST_OBASE
- BC_LEX_STORE_SCALE, // relative order should match for: XC_INST_SCALE
- BC_LEX_LOAD,
- BC_LEX_LOAD_POP,
- BC_LEX_STORE_PUSH,
- BC_LEX_PRINT_POP,
- BC_LEX_NQUIT,
- BC_LEX_SCALE_FACTOR,
+ DC_LEX_EQ_NO_REG,
+ DC_LEX_OP_MODEXP,
+ DC_LEX_OP_DIVMOD,
+
+ DC_LEX_COLON,
+ DC_LEX_ELSE,
+ DC_LEX_EXECUTE,
+ DC_LEX_PRINT_STACK,
+ DC_LEX_CLEAR_STACK,
+ DC_LEX_STACK_LEVEL,
+ DC_LEX_DUPLICATE,
+ DC_LEX_SWAP,
+ DC_LEX_POP,
+
+ DC_LEX_ASCIIFY,
+ DC_LEX_PRINT_STREAM,
+
+ // code uses "t - DC_LEX_STORE_IBASE + XC_INST_IBASE" construct,
+ DC_LEX_STORE_IBASE, // relative order should match for: XC_INST_IBASE
+ DC_LEX_STORE_OBASE, // relative order should match for: XC_INST_OBASE
+ DC_LEX_STORE_SCALE, // relative order should match for: XC_INST_SCALE
+ DC_LEX_LOAD,
+ DC_LEX_LOAD_POP,
+ DC_LEX_STORE_PUSH,
+ DC_LEX_PRINT_POP,
+ DC_LEX_NQUIT,
+ DC_LEX_SCALE_FACTOR,
#endif
} BcLexType;
// must match order of BC_LEX_KEY_foo etc above
uint8_t
dc_char_to_LEX[] = {
/* %&'( */
- BC_LEX_OP_MODULUS, BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_LPAREN,
+ BC_LEX_OP_MODULUS, XC_LEX_INVALID, XC_LEX_INVALID, BC_LEX_LPAREN,
/* )*+, */
- BC_LEX_INVALID, BC_LEX_OP_MULTIPLY, BC_LEX_OP_PLUS, BC_LEX_INVALID,
+ XC_LEX_INVALID, BC_LEX_OP_MULTIPLY, BC_LEX_OP_PLUS, XC_LEX_INVALID,
/* -./ */
- BC_LEX_OP_MINUS, BC_LEX_INVALID, BC_LEX_OP_DIVIDE,
+ BC_LEX_OP_MINUS, XC_LEX_INVALID, BC_LEX_OP_DIVIDE,
/* 0123456789 */
- BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID,
- BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID,
- BC_LEX_INVALID, BC_LEX_INVALID,
+ XC_LEX_INVALID, XC_LEX_INVALID, XC_LEX_INVALID, XC_LEX_INVALID,
+ XC_LEX_INVALID, XC_LEX_INVALID, XC_LEX_INVALID, XC_LEX_INVALID,
+ XC_LEX_INVALID, XC_LEX_INVALID,
/* :;<=>?@ */
- BC_LEX_COLON, BC_LEX_SCOLON, BC_LEX_OP_REL_GT, BC_LEX_OP_REL_EQ,
- BC_LEX_OP_REL_LT, BC_LEX_KEY_READ, BC_LEX_INVALID,
+ DC_LEX_COLON, BC_LEX_SCOLON, BC_LEX_OP_REL_GT, BC_LEX_OP_REL_EQ,
+ BC_LEX_OP_REL_LT, BC_LEX_KEY_READ, XC_LEX_INVALID,
/* ABCDEFGH */
- BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID,
- BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_EQ_NO_REG, BC_LEX_INVALID,
+ XC_LEX_INVALID, XC_LEX_INVALID, XC_LEX_INVALID, XC_LEX_INVALID,
+ XC_LEX_INVALID, XC_LEX_INVALID, DC_LEX_EQ_NO_REG, XC_LEX_INVALID,
/* IJKLMNOP */
- BC_LEX_KEY_IBASE, BC_LEX_INVALID, BC_LEX_KEY_SCALE, BC_LEX_LOAD_POP,
- BC_LEX_INVALID, BC_LEX_OP_BOOL_NOT, BC_LEX_KEY_OBASE, BC_LEX_PRINT_STREAM,
+ BC_LEX_KEY_IBASE, XC_LEX_INVALID, BC_LEX_KEY_SCALE, DC_LEX_LOAD_POP,
+ XC_LEX_INVALID, BC_LEX_OP_BOOL_NOT, BC_LEX_KEY_OBASE, DC_LEX_PRINT_STREAM,
/* QRSTUVWXY */
- BC_LEX_NQUIT, BC_LEX_POP, BC_LEX_STORE_PUSH, BC_LEX_INVALID, BC_LEX_INVALID,
- BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_SCALE_FACTOR, BC_LEX_INVALID,
+ DC_LEX_NQUIT, DC_LEX_POP, DC_LEX_STORE_PUSH, XC_LEX_INVALID, XC_LEX_INVALID,
+ XC_LEX_INVALID, XC_LEX_INVALID, DC_LEX_SCALE_FACTOR, XC_LEX_INVALID,
/* Z[\] */
- BC_LEX_KEY_LENGTH, BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID,
+ BC_LEX_KEY_LENGTH, XC_LEX_INVALID, XC_LEX_INVALID, XC_LEX_INVALID,
/* ^_` */
- BC_LEX_OP_POWER, BC_LEX_NEG, BC_LEX_INVALID,
+ BC_LEX_OP_POWER, BC_LEX_NEG, XC_LEX_INVALID,
/* abcdefgh */
- BC_LEX_ASCIIFY, BC_LEX_INVALID, BC_LEX_CLEAR_STACK, BC_LEX_DUPLICATE,
- BC_LEX_ELSE, BC_LEX_PRINT_STACK, BC_LEX_INVALID, BC_LEX_INVALID,
+ DC_LEX_ASCIIFY, XC_LEX_INVALID, DC_LEX_CLEAR_STACK, DC_LEX_DUPLICATE,
+ DC_LEX_ELSE, DC_LEX_PRINT_STACK, XC_LEX_INVALID, XC_LEX_INVALID,
/* ijklmnop */
- BC_LEX_STORE_IBASE, BC_LEX_INVALID, BC_LEX_STORE_SCALE, BC_LEX_LOAD,
- BC_LEX_INVALID, BC_LEX_PRINT_POP, BC_LEX_STORE_OBASE, BC_LEX_KEY_PRINT,
+ DC_LEX_STORE_IBASE, XC_LEX_INVALID, DC_LEX_STORE_SCALE, DC_LEX_LOAD,
+ XC_LEX_INVALID, DC_LEX_PRINT_POP, DC_LEX_STORE_OBASE, BC_LEX_KEY_PRINT,
/* qrstuvwx */
- BC_LEX_KEY_QUIT, BC_LEX_SWAP, BC_LEX_OP_ASSIGN, BC_LEX_INVALID,
- BC_LEX_INVALID, BC_LEX_KEY_SQRT, BC_LEX_INVALID, BC_LEX_EXECUTE,
+ BC_LEX_KEY_QUIT, DC_LEX_SWAP, BC_LEX_OP_ASSIGN, XC_LEX_INVALID,
+ XC_LEX_INVALID, BC_LEX_KEY_SQRT, XC_LEX_INVALID, DC_LEX_EXECUTE,
/* yz */
- BC_LEX_INVALID, BC_LEX_STACK_LEVEL,
+ XC_LEX_INVALID, DC_LEX_STACK_LEVEL,
/* {|}~ */
- BC_LEX_LBRACE, BC_LEX_OP_MODEXP, BC_LEX_INVALID, BC_LEX_OP_DIVMOD,
+ BC_LEX_LBRACE, DC_LEX_OP_MODEXP, XC_LEX_INVALID, DC_LEX_OP_DIVMOD,
};
static const //BcInst - should be this type. Using signed narrow type since DC_INST_INVALID is -1
int8_t
BcStatus s;
l->t.last = l->t.t;
- if (l->t.last == BC_LEX_EOF) RETURN_STATUS(bc_error("end of file"));
+ if (l->t.last == XC_LEX_EOF) RETURN_STATUS(bc_error("end of file"));
l->line += l->newline;
G.err_line = l->line;
s = BC_STATUS_SUCCESS;
do {
if (l->i == l->len) {
- l->t.t = BC_LEX_EOF;
+ l->t.t = XC_LEX_EOF;
if (!G.input_fp)
RETURN_STATUS(BC_STATUS_SUCCESS);
if (!bc_lex_more_input(l)) {
l->buf = text;
l->i = 0;
l->len = strlen(text);
- l->t.t = l->t.last = BC_LEX_INVALID;
+ l->t.t = l->t.last = XC_LEX_INVALID;
RETURN_STATUS(zbc_lex_next(l));
}
#define zbc_lex_text_init(...) (zbc_lex_text_init(__VA_ARGS__) COMMA_SUCCESS)
switch (c) {
// case '\0': // probably never reached
// l->i--;
-// l->t.t = BC_LEX_EOF;
+// l->t.t = XC_LEX_EOF;
// l->newline = true;
// break;
case '\n':
++l->i;
l->t.t = BC_LEX_OP_BOOL_AND;
} else {
- l->t.t = BC_LEX_INVALID;
+ l->t.t = XC_LEX_INVALID;
s = bc_error_bad_character('&');
}
break;
++l->i;
l->t.t = BC_LEX_OP_BOOL_OR;
} else {
- l->t.t = BC_LEX_INVALID;
+ l->t.t = XC_LEX_INVALID;
s = bc_error_bad_character(c);
}
break;
default:
- l->t.t = BC_LEX_INVALID;
+ l->t.t = XC_LEX_INVALID;
s = bc_error_bad_character(c);
break;
}
uint8_t
dc_lex_regs[] = {
BC_LEX_OP_REL_EQ, BC_LEX_OP_REL_LE, BC_LEX_OP_REL_GE, BC_LEX_OP_REL_NE,
- BC_LEX_OP_REL_LT, BC_LEX_OP_REL_GT, BC_LEX_SCOLON, BC_LEX_COLON,
- BC_LEX_ELSE, BC_LEX_LOAD, BC_LEX_LOAD_POP, BC_LEX_OP_ASSIGN,
- BC_LEX_STORE_PUSH,
+ BC_LEX_OP_REL_LT, BC_LEX_OP_REL_GT, BC_LEX_SCOLON, DC_LEX_COLON,
+ DC_LEX_ELSE, DC_LEX_LOAD, DC_LEX_LOAD_POP, BC_LEX_OP_ASSIGN,
+ DC_LEX_STORE_PUSH,
};
BcStatus s;
s = BC_STATUS_SUCCESS;
c = l->buf[l->i++];
if (c >= '%' && c <= '~'
- && (l->t.t = dc_char_to_LEX[c - '%']) != BC_LEX_INVALID
+ && (l->t.t = dc_char_to_LEX[c - '%']) != XC_LEX_INVALID
) {
RETURN_STATUS(s);
}
// This is the workhorse of the lexer.
switch (c) {
// case '\0': // probably never reached
-// l->t.t = BC_LEX_EOF;
+// l->t.t = XC_LEX_EOF;
// break;
case '\n':
// '\n' is BC_LEX_NLINE, not BC_LEX_WHITESPACE
s = zdc_lex_string(l);
break;
default:
- l->t.t = BC_LEX_INVALID;
+ l->t.t = XC_LEX_INVALID;
s = bc_error_bad_character(c);
break;
}
}
p->l.i = p->l.len;
- p->l.t.t = BC_LEX_EOF;
+ p->l.t.t = XC_LEX_EOF;
IF_BC(bc_vec_pop_all(&p->exits);)
IF_BC(bc_vec_pop_all(&p->conds);)
BcStatus s;
dbg_lex_enter("%s:%d entered", __func__, __LINE__);
- if (p->l.t.t == BC_LEX_EOF)
+ if (p->l.t.t == XC_LEX_EOF)
s = bc_error("end of file");
else if (p->l.t.t == BC_LEX_KEY_DEFINE) {
dbg_lex("%s:%d p->l.t.t:BC_LEX_KEY_DEFINE", __func__, __LINE__);
// Note that 'else' part can not be on the next line:
// echo -e '[1p]sa [2p]sb 2 1>a eb' | dc - OK, prints "2"
// echo -e '[1p]sa [2p]sb 2 1>a\neb' | dc - parse error
- if (p->l.t.t == BC_LEX_ELSE) {
+ if (p->l.t.t == DC_LEX_ELSE) {
s = zdc_parse_register(p);
if (s) RETURN_STATUS(s);
s = zbc_lex_next(&p->l);
get_token = false;
break;
case BC_LEX_SCOLON:
- case BC_LEX_COLON:
+ case DC_LEX_COLON:
dbg_lex("%s:%d LEX_[S]COLON", __func__, __LINE__);
- s = zdc_parse_mem(p, XC_INST_ARRAY_ELEM, true, t == BC_LEX_COLON);
+ s = zdc_parse_mem(p, XC_INST_ARRAY_ELEM, true, t == DC_LEX_COLON);
break;
case BC_LEX_STR:
dbg_lex("%s:%d LEX_STR", __func__, __LINE__);
bc_parse_push(p, XC_INST_READ);
break;
case BC_LEX_OP_ASSIGN:
- case BC_LEX_STORE_PUSH:
+ case DC_LEX_STORE_PUSH:
dbg_lex("%s:%d LEX_OP_ASSIGN/STORE_PUSH", __func__, __LINE__);
assign = t == BC_LEX_OP_ASSIGN;
inst = assign ? XC_INST_VAR : DC_INST_PUSH_TO_VAR;
s = zdc_parse_mem(p, inst, true, assign);
break;
- case BC_LEX_LOAD:
- case BC_LEX_LOAD_POP:
+ case DC_LEX_LOAD:
+ case DC_LEX_LOAD_POP:
dbg_lex("%s:%d LEX_OP_LOAD[_POP]", __func__, __LINE__);
- inst = t == BC_LEX_LOAD_POP ? DC_INST_PUSH_VAR : DC_INST_LOAD;
+ inst = t == DC_LEX_LOAD_POP ? DC_INST_PUSH_VAR : DC_INST_LOAD;
s = zdc_parse_mem(p, inst, true, false);
break;
- case BC_LEX_STORE_IBASE:
- case BC_LEX_STORE_SCALE:
- case BC_LEX_STORE_OBASE:
+ case DC_LEX_STORE_IBASE:
+ case DC_LEX_STORE_SCALE:
+ case DC_LEX_STORE_OBASE:
dbg_lex("%s:%d LEX_OP_STORE_I/OBASE/SCALE", __func__, __LINE__);
- inst = t - BC_LEX_STORE_IBASE + XC_INST_IBASE;
+ inst = t - DC_LEX_STORE_IBASE + XC_INST_IBASE;
s = zdc_parse_mem(p, inst, false, true);
break;
default:
static BC_STATUS zdc_parse_exprs_until_eof(BcParse *p)
{
dbg_lex_enter("%s:%d entered, p->l.t.t:%d", __func__, __LINE__, p->l.t.t);
- while (p->l.t.t != BC_LEX_EOF) {
+ while (p->l.t.t != XC_LEX_EOF) {
BcStatus s = zdc_parse_expr(p);
if (s) RETURN_STATUS(s);
}
}
if (s) goto exec_err;
- if (parse.l.t.t != BC_LEX_NLINE && parse.l.t.t != BC_LEX_EOF) {
+ if (parse.l.t.t != BC_LEX_NLINE && parse.l.t.t != XC_LEX_EOF) {
s = bc_error("bad read() expression");
goto exec_err;
}
G.input_fp = sv_input_fp;
if (s) goto err;
- if (prs.l.t.t != BC_LEX_EOF) {
+ if (prs.l.t.t != XC_LEX_EOF) {
s = bc_error_bad_expression();
err:
bc_parse_free(&prs);
s = zbc_parse_text_init(&G.prs, text); // does the first zbc_lex_next()
if (s) RETURN_STATUS(s);
- while (G.prs.l.t.t != BC_LEX_EOF) {
+ while (G.prs.l.t.t != XC_LEX_EOF) {
BcInstPtr *ip;
BcFunc *f;
while (G.prs.l.t.t == BC_LEX_NLINE) {
s = zbc_lex_next(&G.prs.l);
if (s) goto err;
- if (G.prs.l.t.t == BC_LEX_EOF)
+ if (G.prs.l.t.t == XC_LEX_EOF)
goto done;
}
IF_DC(s = zdc_parse_expr(&G.prs));