# 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;