asm: implement import and instruction parsing

This commit is contained in:
2024-12-14 20:26:04 +00:00
parent 724f40f19f
commit 462f67c6aa
11 changed files with 805 additions and 17 deletions

View File

@@ -9,6 +9,8 @@ extern struct parser_state_type constpool_parser_state_type;
extern struct parser_state_type ident_parser_state_type;
extern struct parser_state_type selector_parser_state_type;
extern struct parser_state_type atom_parser_state_type;
extern struct parser_state_type import_parser_state_type;
extern struct parser_state_type block_parser_state_type;
static const struct parser_state_type *parser_state_types[] = {
[ASM_PARSER_UNIT] = &unit_parser_state_type,
@@ -16,6 +18,8 @@ static const struct parser_state_type *parser_state_types[] = {
[ASM_PARSER_IDENT] = &ident_parser_state_type,
[ASM_PARSER_SELECTOR] = &selector_parser_state_type,
[ASM_PARSER_ATOM] = &atom_parser_state_type,
[ASM_PARSER_IMPORT] = &import_parser_state_type,
[ASM_PARSER_BLOCK] = &block_parser_state_type,
};
static const size_t nr_parser_state_types = sizeof parser_state_types / sizeof parser_state_types[0];
@@ -29,7 +33,7 @@ enum ivy_status ivy_asm_parser_create(struct ivy_asm_parser **out)
memset(parser, 0x0, sizeof *parser);
asm_parser_push_state(parser, ASM_PARSER_UNIT);
asm_parser_push_state(parser, ASM_PARSER_UNIT, NULL);
*out = parser;
return IVY_OK;
@@ -112,7 +116,9 @@ static const struct parser_state_type *get_parser_state_type(enum parser_state_t
return parser_state_types[type];
}
struct parser_state *asm_parser_push_state(struct ivy_asm_parser *parser, enum parser_state_type_id type)
struct parser_state *asm_parser_push_state(
struct ivy_asm_parser *parser, enum parser_state_type_id type,
const ivy_assembler_attrib_table attrib)
{
const struct parser_state_type *type_info = get_parser_state_type(type);
@@ -130,6 +136,10 @@ struct parser_state *asm_parser_push_state(struct ivy_asm_parser *parser, enum p
state->s_type = type_info;
if (attrib) {
memcpy(state->s_attrib, attrib, sizeof attrib);
}
if (type_info->n_init_state) {
type_info->n_init_state(parser, state);
}