aboutsummaryrefslogtreecommitdiff
path: root/src/c8asm/parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/c8asm/parser.c')
-rw-r--r--src/c8asm/parser.c19
1 files changed, 9 insertions, 10 deletions
diff --git a/src/c8asm/parser.c b/src/c8asm/parser.c
index 208511d..01e13ae 100644
--- a/src/c8asm/parser.c
+++ b/src/c8asm/parser.c
@@ -119,14 +119,12 @@ parseop(void)
struct raw_addr
parseaddr(struct token tok)
{
+ assume(tok.kind & (T_NUMBER | T_IDENT));
if (tok.kind == T_NUMBER)
return (struct raw_addr){.val = parsenum(tok, NS_ADDR)};
- if (tok.kind == T_IDENT) {
- if (regtype(tok.sv) != RT_NONE)
- DIE_AT_POS_WITH_CODE(tok.sv, tok.sv.p, E_BADLABEL);
- return (struct raw_addr){.label = true, .sv = tok.sv};
- }
- unreachable();
+ if (regtype(tok.sv) != RT_NONE)
+ DIE_AT_POS_WITH_CODE(tok.sv, tok.sv.p, E_BADLABEL);
+ return (struct raw_addr){.label = true, .sv = tok.sv};
}
enum regtype
@@ -150,6 +148,7 @@ regtype(struct u8view v)
uint16_t
hexval(char ch)
{
+ assume((ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f'));
return ch >= '0' && ch <= '9' ? ch - '0'
: ch >= 'a' && ch <= 'f' ? ch - 'a' + 10
: (unreachable(), 0);
@@ -173,6 +172,9 @@ parsenum(struct token tok, enum numsize size)
}
for (ch = *v.p; v.len; v.p++, v.len--, ch = *v.p) {
+ assume((ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f')
+ || (ch >= 'A' && ch <= 'F') || ch == '\'');
+
if (ch == '\'')
continue;
else if (ch >= '0' && ch <= '9')
@@ -181,8 +183,6 @@ parsenum(struct token tok, enum numsize size)
ch -= 'a' - 10;
else if (ch >= 'A' && ch <= 'F')
ch -= 'A' - 10;
- else
- unreachable();
if (acc > cutoff || (acc == cutoff && ch > cutlim)) {
const char *s = size == NS_NIBBLE ? "nibble"
@@ -386,8 +386,7 @@ parseop_jp(void)
"v0-register or address", tokrepr(op.kind));
}
ins.args[ins.len++] = parseaddr(reqnext("address", T_NUMBER | T_IDENT));
- } else
- unreachable();
+ }
dapush(&ast, I(ins));
}