lang: ast: use fancy index manipulation to reduce the size of ast_node_type
This commit is contained in:
@@ -12,6 +12,21 @@ struct parser_state;
|
||||
#define PARSE_RESULT(status, flags) \
|
||||
((struct token_parse_result) {.r_status = (status), .r_flags = (flags)})
|
||||
|
||||
#define __TOK_PARSER_INDEX(x) ((x) - __IVY_TOK_INDEX_BASE)
|
||||
#define __SYM_PARSER_INDEX(x) ((x) - __IVY_SYM_INDEX_BASE)
|
||||
#define __KW_PARSER_INDEX(x) ((x) - __IVY_KW_INDEX_BASE)
|
||||
|
||||
#define __TOK_PARSER_FALLBACK_INDEX IVY_TOK_NONE
|
||||
#define __SYM_PARSER_FALLBACK_INDEX IVY_SYM_NONE
|
||||
#define __KW_PARSER_FALLBACK_INDEX IVY_KW_NONE
|
||||
|
||||
#define TOK_PARSER(id, func) [__TOK_PARSER_INDEX(IVY_TOK_##id)] = func
|
||||
#define SYM_PARSER(id, func) [__SYM_PARSER_INDEX(IVY_SYM_##id)] = func
|
||||
#define KW_PARSER(id, func) [__KW_PARSER_INDEX(IVY_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
|
||||
|
||||
enum token_parse_flags {
|
||||
PARSE_REPEAT_TOKEN = 0x01u,
|
||||
@@ -42,9 +57,10 @@ struct ast_node_type {
|
||||
size_t n_state_size;
|
||||
size_t n_node_size;
|
||||
|
||||
token_parse_function n_token_parsers[IVY_TOK_TYPE_COUNT];
|
||||
token_parse_function n_keyword_parsers[IVY_KW_TYPE_COUNT];
|
||||
token_parse_function n_symbol_parsers[IVY_SYM_TYPE_COUNT];
|
||||
token_parse_function n_token_parsers[__TOK_PARSER_INDEX(__IVY_TOK_INDEX_LIMIT)];
|
||||
token_parse_function n_keyword_parsers[__KW_PARSER_INDEX(__IVY_KW_INDEX_LIMIT)];
|
||||
token_parse_function n_symbol_parsers[__SYM_PARSER_INDEX(__IVY_SYM_INDEX_LIMIT)];
|
||||
|
||||
struct {
|
||||
token_parse_function expr_begin;
|
||||
token_parse_function expr_other;
|
||||
|
||||
Reference in New Issue
Block a user