/* retoor */ #ifndef LOREX_AST_H #define LOREX_AST_H #include #include typedef enum { AST_CHAR, AST_DOT, AST_CONCAT, AST_ALTER, AST_STAR, AST_PLUS, AST_QUESTION, AST_GROUP, AST_ANCHOR_START, AST_ANCHOR_END, AST_BRACKET, AST_QUANTIFIER, AST_CLASS_DIGIT, AST_CLASS_WORD, AST_CLASS_SPACE, AST_CLASS_NDIGIT, AST_CLASS_NWORD, AST_CLASS_NSPACE } ast_type_t; typedef struct { char start; char end; } char_range_t; typedef struct { char_range_t *ranges; size_t count; size_t capacity; bool negated; unsigned char bitmap[32]; bool bitmap_valid; } bracket_class_t; typedef struct { int min; int max; bool greedy; } quantifier_t; typedef struct ast_node ast_node_t; struct ast_node { ast_type_t type; char value; ast_node_t *left; ast_node_t *right; int group_id; bracket_class_t *bracket; quantifier_t quant; }; ast_node_t *ast_create_char(char c); ast_node_t *ast_create_dot(void); ast_node_t *ast_create_concat(ast_node_t *left, ast_node_t *right); ast_node_t *ast_create_alter(ast_node_t *left, ast_node_t *right); ast_node_t *ast_create_star(ast_node_t *child, bool greedy); ast_node_t *ast_create_plus(ast_node_t *child, bool greedy); ast_node_t *ast_create_question(ast_node_t *child, bool greedy); ast_node_t *ast_create_group(ast_node_t *child, int group_id); ast_node_t *ast_create_anchor_start(void); ast_node_t *ast_create_anchor_end(void); ast_node_t *ast_create_bracket(bracket_class_t *bracket); ast_node_t *ast_create_quantifier(ast_node_t *child, int min, int max, bool greedy); ast_node_t *ast_create_class(ast_type_t type); void ast_free(ast_node_t *node); bracket_class_t *bracket_create(void); void bracket_add_char(bracket_class_t *bracket, char c); void bracket_add_range(bracket_class_t *bracket, char start, char end); void bracket_free(bracket_class_t *bracket); bool bracket_matches(bracket_class_t *bracket, char c); #endif