aboutsummaryrefslogtreecommitdiff
path: root/src/libsre/sre.h
blob: a7ace1a24b5e5d8e54946a3b3b691a940364fb43 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#pragma once

#include <u.h>
#include <libn.h>

enum
{
    Toperator = RuneMask + 1,
    Tstart    = Toperator,
    Trparen,
    Tlparen,
    Tor,
    Tcat,
    Tstar,
    Tplus,
    Tqmark,

    Tany = Toperator << 1,
    Tnop,
    Tbol,
    Teol,
    Tcclass,
    Tnclass,
    Tend,

    isoptor = Toperator,
    isopand = Toperator << 1,
};

typedef struct Class Class;
typedef struct State State;
typedef struct Patch Patch;
typedef struct Node Node;

typedef struct Parser  Parser;
typedef struct Machine Machine;

struct Class
{
    rune *end;
    rune span[64];
};

struct State 
{
    int type;
    union {
        State *l;
    };
    union {
        State *r;
        State *out;
    };
};

struct Patch
{
    State *s;
    Patch *link;
};

struct Node
{
    State *beg;
    State *end;
};

struct Parser
{
    Machine *mach;
    byte    *re;
    int     wasopand : 1;
    int     *optor, optorstk[1000];
    Node    *node,  nodestk[1000];
};

struct Machine
{
    /* memory buffers */
    struct {
        void *heap;
        memยทReallocator;
    };
    State *state, statestk[1000];

    struct {
        int   cap;
        int   len;
        Class *c;
    } class;

    State *entry;
};