1 s ::= Grammar ws => "gram"
6 | w** "//" (~[\n]*) "\n" ws => ()
8 Grammar ::= r +/ ws => "grammar"
10 r ::= word ^"::=" alternatives /ws
11 | word ^"!::=" alternatives /ws
13 alternatives ::= (Conjuncts +/ (!ws "|" !ws)) +/ (!ws ">" !ws)
15 Conjuncts ::= Sequence
16 | Sequence ^"&" e*/ws /ws
17 | Sequence ^"&~" e*/ws /ws
20 | (e+/ws !ws)? "^" Quoted (!ws e+/ws)? => "ps2"
24 // | e "<-" psy /ws => "psyl"
25 | psy "->" e /ws => "psyr"
26 // | e "<-" psy "->" e /ws => "psylr"
27 Sequence ::= Quoted => "qprod"
30 | psx ^"=>" ("()"|word|Quoted) /ws
35 Range ::= ec => "range"
38 e ::= word => "nonTerminal"
41 | ^"{" Sequence "}" /ws
44 | (e ^"++" /ws > e ^"+" /ws)
45 | (e ^"++/" e /ws > e ^"+/" e /ws)
46 | (e ^"**" /ws > e ^"*" /ws)
47 | (e ^"**/" e /ws > e ^"*/" e /ws)
52 > ^"(" alternatives ")" /ws
55 word ::= [a-zA-Z0-9_]++
56 Quoted ::= "\"" ((~[\"\\] | escaped)+) "\""
58 escaped ::= "\\n" => "\n"