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