|
/* 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
|