chore: update c, h, md files
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
/* retoor <retoor@molodetz.nl> */
|
||||
#ifndef LOREG_AST_H
|
||||
#define LOREG_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;
|
||||
} 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
|
||||
@@ -0,0 +1,52 @@
|
||||
/* retoor <retoor@molodetz.nl> */
|
||||
#ifndef LOREG_LEXER_H
|
||||
#define LOREG_LEXER_H
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
typedef enum {
|
||||
TOKEN_CHAR,
|
||||
TOKEN_DOT,
|
||||
TOKEN_STAR,
|
||||
TOKEN_PLUS,
|
||||
TOKEN_QUESTION,
|
||||
TOKEN_PIPE,
|
||||
TOKEN_LPAREN,
|
||||
TOKEN_RPAREN,
|
||||
TOKEN_LBRACKET,
|
||||
TOKEN_RBRACKET,
|
||||
TOKEN_CARET,
|
||||
TOKEN_DOLLAR,
|
||||
TOKEN_LBRACE,
|
||||
TOKEN_RBRACE,
|
||||
TOKEN_BACKSLASH,
|
||||
TOKEN_DASH,
|
||||
TOKEN_CLASS_DIGIT,
|
||||
TOKEN_CLASS_WORD,
|
||||
TOKEN_CLASS_SPACE,
|
||||
TOKEN_CLASS_NDIGIT,
|
||||
TOKEN_CLASS_NWORD,
|
||||
TOKEN_CLASS_NSPACE,
|
||||
TOKEN_EOF
|
||||
} token_type_t;
|
||||
|
||||
typedef struct {
|
||||
token_type_t type;
|
||||
char value;
|
||||
size_t position;
|
||||
} token_t;
|
||||
|
||||
typedef struct {
|
||||
const char *pattern;
|
||||
size_t length;
|
||||
size_t position;
|
||||
bool in_bracket;
|
||||
} lexer_t;
|
||||
|
||||
void lexer_init(lexer_t *lexer, const char *pattern);
|
||||
token_t lexer_next(lexer_t *lexer);
|
||||
token_t lexer_peek(lexer_t *lexer);
|
||||
bool lexer_eof(lexer_t *lexer);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,45 @@
|
||||
/* retoor <retoor@molodetz.nl> */
|
||||
#ifndef LOREG_H
|
||||
#define LOREG_H
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#define LOREG_VERSION "1.0.0"
|
||||
#define LOREG_MAX_STATES 4096
|
||||
#define LOREG_MAX_GROUPS 32
|
||||
|
||||
typedef enum {
|
||||
LOREG_OK = 0,
|
||||
LOREG_ERR_INVALID_PATTERN,
|
||||
LOREG_ERR_UNBALANCED_PAREN,
|
||||
LOREG_ERR_EMPTY_GROUP,
|
||||
LOREG_ERR_INVALID_QUANTIFIER,
|
||||
LOREG_ERR_INVALID_ESCAPE,
|
||||
LOREG_ERR_OUT_OF_MEMORY,
|
||||
LOREG_ERR_STATE_OVERFLOW
|
||||
} loreg_error_t;
|
||||
|
||||
typedef struct {
|
||||
size_t start;
|
||||
size_t end;
|
||||
bool matched;
|
||||
} loreg_group_t;
|
||||
|
||||
typedef struct {
|
||||
bool matched;
|
||||
size_t match_start;
|
||||
size_t match_end;
|
||||
loreg_group_t groups[LOREG_MAX_GROUPS];
|
||||
size_t group_count;
|
||||
} loreg_match_t;
|
||||
|
||||
typedef struct loreg_regex loreg_regex_t;
|
||||
|
||||
loreg_regex_t *loreg_compile(const char *pattern, loreg_error_t *error);
|
||||
void loreg_free(loreg_regex_t *regex);
|
||||
bool loreg_match(loreg_regex_t *regex, const char *text, loreg_match_t *result);
|
||||
bool loreg_search(loreg_regex_t *regex, const char *text, loreg_match_t *result);
|
||||
const char *loreg_error_string(loreg_error_t error);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,26 @@
|
||||
/* retoor <retoor@molodetz.nl> */
|
||||
#ifndef LOREG_MATCHER_H
|
||||
#define LOREG_MATCHER_H
|
||||
|
||||
#include "nfa.h"
|
||||
#include "loreg.h"
|
||||
|
||||
typedef struct {
|
||||
nfa_state_t **states;
|
||||
size_t count;
|
||||
size_t capacity;
|
||||
size_t *group_starts;
|
||||
size_t *group_ends;
|
||||
int group_count;
|
||||
} state_set_t;
|
||||
|
||||
state_set_t *state_set_create(size_t initial_capacity, int group_count);
|
||||
void state_set_free(state_set_t *set);
|
||||
void state_set_clear(state_set_t *set);
|
||||
void state_set_add(state_set_t *set, nfa_state_t *state);
|
||||
bool state_set_contains(state_set_t *set, nfa_state_t *state);
|
||||
|
||||
bool nfa_match(nfa_t *nfa, const char *text, size_t start_pos, loreg_match_t *result);
|
||||
bool nfa_search(nfa_t *nfa, const char *text, loreg_match_t *result);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,69 @@
|
||||
/* retoor <retoor@molodetz.nl> */
|
||||
#ifndef LOREG_NFA_H
|
||||
#define LOREG_NFA_H
|
||||
|
||||
#include "ast.h"
|
||||
#include "loreg.h"
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#define EPSILON '\0'
|
||||
#define NFA_MAX_TRANSITIONS 256
|
||||
|
||||
typedef struct nfa_state nfa_state_t;
|
||||
|
||||
typedef enum {
|
||||
TRANS_CHAR,
|
||||
TRANS_EPSILON,
|
||||
TRANS_DOT,
|
||||
TRANS_BRACKET,
|
||||
TRANS_CLASS_DIGIT,
|
||||
TRANS_CLASS_WORD,
|
||||
TRANS_CLASS_SPACE,
|
||||
TRANS_CLASS_NDIGIT,
|
||||
TRANS_CLASS_NWORD,
|
||||
TRANS_CLASS_NSPACE,
|
||||
TRANS_GROUP_START,
|
||||
TRANS_GROUP_END,
|
||||
TRANS_ANCHOR_START,
|
||||
TRANS_ANCHOR_END
|
||||
} transition_type_t;
|
||||
|
||||
typedef struct {
|
||||
transition_type_t type;
|
||||
char value;
|
||||
nfa_state_t *target;
|
||||
bracket_class_t *bracket;
|
||||
int group_id;
|
||||
} transition_t;
|
||||
|
||||
struct nfa_state {
|
||||
int id;
|
||||
bool accepting;
|
||||
transition_t *transitions;
|
||||
size_t trans_count;
|
||||
size_t trans_capacity;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
nfa_state_t *start;
|
||||
nfa_state_t *accept;
|
||||
} nfa_fragment_t;
|
||||
|
||||
typedef struct {
|
||||
nfa_state_t **states;
|
||||
size_t state_count;
|
||||
size_t capacity;
|
||||
nfa_state_t *start;
|
||||
int group_count;
|
||||
} nfa_t;
|
||||
|
||||
nfa_t *nfa_create(void);
|
||||
void nfa_free(nfa_t *nfa);
|
||||
nfa_state_t *nfa_add_state(nfa_t *nfa);
|
||||
void nfa_add_transition(nfa_state_t *from, nfa_state_t *to, transition_type_t type, char value);
|
||||
void nfa_add_bracket_transition(nfa_state_t *from, nfa_state_t *to, bracket_class_t *bracket);
|
||||
void nfa_add_group_transition(nfa_state_t *from, nfa_state_t *to, transition_type_t type, int group_id);
|
||||
nfa_t *nfa_from_ast(ast_node_t *ast, loreg_error_t *error);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,20 @@
|
||||
/* retoor <retoor@molodetz.nl> */
|
||||
#ifndef LOREG_PARSER_H
|
||||
#define LOREG_PARSER_H
|
||||
|
||||
#include "ast.h"
|
||||
#include "lexer.h"
|
||||
#include "loreg.h"
|
||||
|
||||
typedef struct {
|
||||
lexer_t lexer;
|
||||
token_t current;
|
||||
loreg_error_t error;
|
||||
int group_count;
|
||||
} parser_t;
|
||||
|
||||
void parser_init(parser_t *parser, const char *pattern);
|
||||
ast_node_t *parser_parse(parser_t *parser);
|
||||
loreg_error_t parser_get_error(parser_t *parser);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,7 @@
|
||||
/* retoor <retoor@molodetz.nl> */
|
||||
#ifndef LOREG_REPL_H
|
||||
#define LOREG_REPL_H
|
||||
|
||||
void repl_run(void);
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user