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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
/*
* types.h - Datatypes used by BPEG
*/
#ifndef TYPES__H
#define TYPES__H
#include <sys/types.h>
#include "file_loader.h"
enum BPEGFlag {
BPEG_VERBOSE = 1 << 0,
BPEG_IGNORECASE = 1 << 1,
};
/*
* BPEG virtual machine opcodes (these must be kept in sync with the names in vm.c)
*/
enum VMOpcode {
VM_ANYCHAR = 1,
VM_STRING,
VM_RANGE,
VM_NOT,
VM_UPTO_AND,
VM_REPEAT,
VM_BEFORE,
VM_AFTER,
VM_CAPTURE,
VM_OTHERWISE,
VM_CHAIN,
VM_EQUAL,
VM_REPLACE,
VM_REF,
VM_BACKREF,
VM_NODENT,
};
/*
* A struct reperesenting a BPEG virtual machine operation
*/
typedef struct vm_op_s {
enum VMOpcode op;
unsigned int multiline:1, negate:1;
const char *start, *end;
// Length of the match, if constant, otherwise -1
ssize_t len;
union {
const char *s;
struct {
char low, high;
} range;
struct {
ssize_t min, max;
struct vm_op_s *sep, *repeat_pat;
} repetitions;
// TODO: use a linked list instead of a binary tree
struct {
struct vm_op_s *first, *second;
} multiple;
struct {
struct vm_op_s *replace_pat;
const char *replacement;
} replace;
struct {
struct vm_op_s *capture_pat;
char *name;
} capture;
void *backref;
struct vm_op_s *pat;
} args;
} vm_op_t;
/*
* Pattern matching result object
*/
typedef struct match_s {
// Where the match starts and ends (end is after the last character)
const char *start, *end;
union {
const char *name;
const char *replacement;
} value;
struct match_s *child, *nextsibling;
vm_op_t *op;
} match_t;
typedef struct {
const char *name;
const char *source;
file_t *file;
vm_op_t *op;
} def_t;
typedef struct {
size_t defcount, defcapacity;
def_t *definitions;
size_t backrefcount, backrefcapacity;
struct {
const char *name;
match_t *capture;
vm_op_t *op;
} *backrefs;
} grammar_t;
#endif
// vim: ts=4 sw=0 et cino=L2,l1,(0,W4,m1
|