;; use ABNF like grammar
;; char-val to case-sensitive
;; prose-val -> char classes
;; add peg lookaheads `!` `&`
;; add quiet `~`
;; add slice `$`
;; remove num-var
;;
;; vim:nowrap
exports [
decl-list
trivia = _
]
comment = $(";" *<^\n>) @comment
whitespace = $(*< \t\r\n>)
_ = whitespace *(comment whitespace)
ident = $(!<0-9> +(<0-9a-zA-Z_->/<^\u{00}-\u{a0}>)) @ident
number = $(+<0-9>) @number
string = $(<"> *<^\"\r\n> <">) @string
matches = $("<" *<^\x3e\r\n> ">") @matches
label = ident / string
repeat-rest = "*" [number]
repeat = "+"
/ number [repeat-rest]
/ repeat-rest
pat-expect = "@" label
pat-atom = ident !(_ "=") ; a rule reference
/ string ; keyword
/ matches ; char classes
/ "[" _ pat-choice _ "]" ; optional
/ "(" _ pat-choice _ ")" ; simple paren
pat-op = "&" pat-atom ; positive lookahead
/ "!" pat-atom ; negative lookahead
/ "~" pat-atom ; quiet
/ "$" pat-atom ; slice
/ repeat _ pat-atom
/ pat-atom
pat-list = pat-op *(_ pat-op)
pat-choice = pat-list *(_ "/" _ pat-list)
[_ pat-expect]; extra expected branch
named = ident _ "=" _
decl = named pat-choice
export = [named] ident
export-list = "exports" _ "[" _ *(export _) "]"
decl-list = _ [export-list _] +(decl _)