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;
};
|