79 lines
2.7 KiB
C
79 lines
2.7 KiB
C
#ifndef _PARSE_PARSE_H_
|
|
#define _PARSE_PARSE_H_
|
|
|
|
#include <blue/core/queue.h>
|
|
#include <ivy/asm/assembler.h>
|
|
#include <ivy/asm/lex.h>
|
|
|
|
#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
|