#ifndef __HF__PARSER_H__ #define __HF__PARSER_H__ #include #include "hashmap.h" #include "lexer.h" enum hf__node_type { HF__NODE_TYPE__NUMBER, HF__NODE_TYPE__CHAR, HF__NODE_TYPE__WORD, HF__NODE_TYPE__WORD_DEF, HF__NODE_TYPE__DASH_COMMENT, HF__NODE_TYPE__PAREN_COMMENT, HF__NODE_TYPE__DUP, HF__NODE_TYPE__DROP, HF__NODE_TYPE__SWAP, HF__NODE_TYPE__OVER, HF__NODE_TYPE__ROT, HF__NODE_TYPE__ADD, HF__NODE_TYPE__SUB, HF__NODE_TYPE__EQ, HF__NODE_TYPE__LT, HF__NODE_TYPE__GT, HF__NODE_TYPE__AND, HF__NODE_TYPE__OR, HF__NODE_TYPE__INVERT, HF__NODE_TYPE__DOT, HF__NODE_TYPE__EMIT, HF__NODE_TYPE__SPACE, HF__NODE_TYPE__SPACES, HF__NODE_TYPE__CR, HF__NODE_TYPE__CRS, HF__NODE_TYPE__DEBUG, HF__NODE_TYPE__ABORT, HF__NODE_TYPE__EXIT, __HF__NODE_TYPE__N, }; struct hf__node_value__word { unsigned long hash; char *value; }; struct hf__node_value__word_def { struct hf__node_value__word name; struct hf__node *body; size_t body_len; }; union hf__node_value { int number; char ch; struct hf__node_value__word word; struct hf__node_value__word_def *word_def; char *comment; }; struct hf__node { enum hf__node_type type; union hf__node_value value; bool is_owner; }; struct hf__parser { struct hf__hashmap keyword_map; bool keyword_map_is_init; }; #define HF__PARSER__KEYWORD_MAP_CAP 23 extern void hf__parser__init_keyword_map(struct hf__hashmap *const map, size_t cap); extern void hf__parser__node_array_push(struct hf__node **arr, size_t *const len, size_t *const cap, struct hf__node item); extern struct hf__result hf__parse(struct hf__parser *const parser, const char *const src, const struct hf__token *const tokens, const size_t tokens_len, struct hf__node **nodes, size_t *const len, size_t *const cap); #endif