aboutsummaryrefslogtreecommitdiff
path: root/bpeg.bpeg
blob: f5d490da500f0b7cef82fd26475e41fc57aecd57 (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
# 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;

# Special-symbol rules:
_  = *(`  / \t);
__ = *(`  / \t / \r / \n / comment);
$$ = !$.;
$  = !.;
^^ = !<$.;
^  = !<.;

hash-comment = `# *.;

# Note: comments are undefined by default in regular BPEG
comment = hash-comment;