/* retoor <retoor@molodetz.nl> */
#ifndef LOREX_AST_H
#define LOREX_AST_H
#include <stdbool.h>
#include <stddef.h>
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