summaryrefslogtreecommitdiff
path: root/sys/src/libregexp/regimpl.h
blob: 8c8ac03a71ffa6029122343eb2c1234bb6c332d6 (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
enum {
	LANY = 0,
	LBOL,
	LCLASS,
	LEND,
	LEOL,
	LLPAR,
	LOR,
	LREP,
	LRPAR,
	LRUNE,

	TANY = 0,
	TBOL,
	TCAT,
	TCLASS,
	TEOL,
	TNOTNL,
	TOR,
	TPLUS,
	TQUES,
	TRUNE,
	TSTAR,
	TSUB,

	NSUBEXPM = 32,
};

typedef struct Parselex Parselex;
typedef struct Renode Renode;

struct Parselex {
	/* Parse */
	Renode *next, *nodes;
	int sub, instrs;
	jmp_buf exitenv;
	/* Lex */
	void (*getnextr)(Parselex*);
	char *rawexp, *orig;
	Rune rune;
	int peek, peeklex, done, literal, nc;
	Rune cpairs[400+2];
};

struct Renode {
	int op;
	Renode *left;
	Rune r;
	union {
		Rune r1;
		int sub;
		Renode *right;
	};
	int nclass;
};

struct Rethread {
	Reinst *i;
	Resub sem[NSUBEXPM];
	Rethread *next;
	int gen;
};

struct Reinst {
	char op;
	int gen;
	Reinst *a;
	union {
		Rune r;
		int sub;
	};
	union {
		Rune r1;
		Reinst *b;
	};
};

static int lex(Parselex*);
static void getnextr(Parselex*);
static void getnextrlit(Parselex*);
static void getclass(Parselex*);
static Renode *e0(Parselex*);
static Renode *e1(Parselex*);
static Renode *e2(Parselex*);
static Renode *e3(Parselex*);
static Renode *buildclass(Parselex*);
static Renode *buildclassn(Parselex*);
static int pcmp(void*, void*);
static Reprog *regcomp1(char*, int, int);
static Reinst *compile(Renode*, Reprog*, int);
static Reinst *compile1(Renode*, Reinst*, int*, int);
static void prtree(Renode*, int, int);