#ifndef _PARSE_PARSE_H_ #define _PARSE_PARSE_H_ #include #include #include #define HASH_IDENT 0x684f633b2528fc75 #define HASH_INDEX 0x83cf8e8f9081468b #define HASH_RECIPIENT 0x3d0abea328337078 #define HASH_SELECTOR 0x03b0355a1af4ac9c #define HASH_GET 0xd4e26318faaa79f7 #define HASH_SET 0x823b87195ce20e23 #define HASH_PACKAGE 0x53cf3eec39cf731b #define HASH_BLOCK 0x14e5faab9ce0e362 #define __TOK_PARSER_INDEX(x) ((x) - __IVY_ASM_TOK_INDEX_BASE) #define __SYM_PARSER_INDEX(x) ((x) - __IVY_ASM_SYM_INDEX_BASE) #define __KW_PARSER_INDEX(x) ((x) - __IVY_ASM_KW_INDEX_BASE) #define __TOK_PARSER_FALLBACK_INDEX IVY_ASM_TOK_NONE #define __SYM_PARSER_FALLBACK_INDEX IVY_ASM_SYM_NONE #define __KW_PARSER_FALLBACK_INDEX IVY_ASM_KW_NONE #define TOK_PARSER(id, func) [__TOK_PARSER_INDEX(IVY_ASM_TOK_##id)] = func #define SYM_PARSER(id, func) [__SYM_PARSER_INDEX(IVY_ASM_SYM_##id)] = func #define KW_PARSER(id, func) [__KW_PARSER_INDEX(IVY_ASM_KW_##id)] = func #define TOK_PARSER_FALLBACK(func) [__TOK_PARSER_FALLBACK_INDEX] = func #define SYM_PARSER_FALLBACK(func) [__SYM_PARSER_FALLBACK_INDEX] = func #define KW_PARSER_FALLBACK(func) [__KW_PARSER_FALLBACK_INDEX] = func struct ivy_asm_parser; struct parser_state; enum parser_state_type_id { ASM_PARSER_NONE = 0, ASM_PARSER_UNIT, ASM_PARSER_CLASS, ASM_PARSER_CONSTPOOL, ASM_PARSER_IMPORT, ASM_PARSER_BLOCK, ASM_PARSER_SELECTOR, ASM_PARSER_IDENT, ASM_PARSER_ATOM, }; typedef enum ivy_status (*token_parse_function)( struct ivy_asm_parser*, struct ivy_asm_token*); struct parser_state_type { size_t n_state_size; void (*n_init_state)(struct ivy_asm_parser*, struct parser_state*); void (*n_finish_state)(struct ivy_asm_parser*, struct parser_state*); token_parse_function n_token_parsers[__TOK_PARSER_INDEX(__IVY_ASM_TOK_INDEX_LIMIT)]; token_parse_function n_keyword_parsers[__KW_PARSER_INDEX(__IVY_ASM_KW_INDEX_LIMIT)]; token_parse_function n_symbol_parsers[__SYM_PARSER_INDEX(__IVY_ASM_SYM_INDEX_LIMIT)]; }; struct parser_state { b_queue_entry s_entry; const struct parser_state_type* s_type; ivy_assembler_attrib_table s_attrib; void* s_previous_value; }; struct ivy_asm_parser { struct ivy_assembler* p_assembler; b_queue p_state; }; extern struct parser_state* asm_parser_push_state(struct ivy_asm_parser* parser, enum parser_state_type_id type, const ivy_assembler_attrib_table attrib); extern void asm_parser_pop_state(struct ivy_asm_parser* parser, void* ret); extern struct parser_state* asm_parser_get_state(struct ivy_asm_parser* parser); #endif