93 lines
1.9 KiB
C
93 lines
1.9 KiB
C
#ifndef __HF__PARSER_H__
|
|
#define __HF__PARSER_H__
|
|
|
|
#include <stddef.h>
|
|
|
|
#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
|