71 lines
1.9 KiB
Plaintext
71 lines
1.9 KiB
Plaintext
# This is a file defining the BPEG grammar using BPEG syntax
|
|
|
|
Grammar = __ *Def%(__`;__) ?(`;__);
|
|
Def = @[name]Ref __ `= __ @[definition]extended-pat;
|
|
|
|
# This is used for command line arguments:
|
|
String-pattern = *(`\ pat ?`; / .);
|
|
|
|
pat = suffixed-pat / simple-pat;
|
|
simple-pat = Empty / Upto / Dot / String / Char-range / Char / Escape-range / Escape / No / Anything-but
|
|
/ Repeat / After / Before / Capture / Replace / Ref / parens;
|
|
suffixed-pat = Eq-pat;
|
|
|
|
Eq-pat = @[first]simple-pat "==" @[second]pat;
|
|
|
|
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 = 2-3`. ?>(_@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;
|