blob: 6bd62da3620646267ef74e61bb462a847c1621fd (
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
|
# This is a file defining the BPEG grammar using BPEG syntax
grammar;
grammar = __ @[main-pattern]extended-pat __ (*def % (__`;__)) ?(__ `;) __;
def = @[name]ref __ `= __ @[definition]extended-pat;
# This is used for command line arguments:
string-grammar = *(`\ pat ?`; / .);
pat = empty / dot / string / char-range / char / escape-range / escape / no / anything-but
/ upto-and / repeat / after / before / capture / replace / ref / parens;
empty = `/ >(__ (`}/`}));
dot = `.;
string = (
`" @[s]*(escape / ~`") `"
/ `' @[s]*(escape / ~`') `'
);
char-range = `` @[low]. `- @[high].;
char = `` @[s].;
escape-range = `\ @[low]escape-sequence `- @[high]escape-sequence;
escape = `\ @[s]escape-sequence;
escape-sequence = (
1-3 `0-7
/ `x 2 (`0-9/`a-f/`A-F)
/`a/`b/`e/`n/`r/`t/`v / . / \n
);
no = `! _ @pat;
anything-but = `~ ?`~ _ @pat;
upto-and = `& ?`& _ @pat;
repeat = (
@[min]int _ `- _ @[max]int
/ @[min]{=>"0"} @[max]int _ `-
/ @[min]int _ `+ @[max](/)
/ @[min] @[max]int
/ `+ @[min]{=>"1"} @[max](/)
/ `* @[min]{=>"0"} @[max](/)
/ `? @[min]{=>"0"} @[max]{=>"1"}
) _ @[repeat-pat]pat ?( __ `% __ @[sep]pat);
after = `< _ pat;
before = `> _ pat;
capture = `@ ?(_ `[ @[capture-name]ref `]) _ @[capture]pat;
replace = `{ __ (
?(@[replace-pat]extended-pat __) "=>" ?(__ @[replacement]string)
) __ `};
ref = @[name](
"^^" / "^" / "__" / "_" / "$$" / "$" /
(`a-z/`A-Z) *(`a-z/`A-Z/`0-9/`-));
parens = `( __ extended-pat __ `);
chain = +@pat % (__);
otherwise = +@(chain/pat) % (__`/__);
extended-pat = otherwise / chain / pat;
_ = *(` / \t);
__ = *(` / \t / \r / \n / comment);
hash-comment = `# *.;
# Note: comments are undefined by default in regular BPEG
comment = hash-comment;
|