bp/bpeg.bpeg

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;