chore: update c, h, md files
CI / build (push) Waiting to run
CI / test (push) Blocked by required conditions
CI / valgrind (push) Blocked by required conditions
CI / coverage (push) Blocked by required conditions

This commit is contained in:
2026-01-04 00:04:48 +01:00
commit 3d9c4aa00b
26 changed files with 4459 additions and 0 deletions
+80
View File
@@ -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
+52
View File
@@ -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
+45
View File
@@ -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
+26
View File
@@ -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
+69
View File
@@ -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
+20
View File
@@ -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
+7
View File
@@ -0,0 +1,7 @@
/* retoor <retoor@molodetz.nl> */
#ifndef LOREG_REPL_H
#define LOREG_REPL_H
void repl_run(void);
#endif