-s = gram:: !ws Grammar ws
-Grammar = grammar:: NonTerminal +/ ws
-NonTerminal = word !wp ^"=" !wp RHS
+s = ws grammar:Grammar ws
+Grammar = NonTerminal +/ ws
+NonTerminal = Word ^"=" RHS /ws
-RHS = (Conjuncts +/ (!ws "|" !ws)) +/ (!ws ">" !ws)
+RHS = (Sequence +/ (!ws "|" !ws)) +/ (!ws ">" !ws)
-Conjuncts = Sequence
- | Sequence ^"&" Elements /ws
- | Sequence ^"&~" Elements /ws
Elements = e*/ws
PreSequence = ps:: Elements
- | PreSequence !wp ^"/" !ws e
- | PreSequence ^"->" e /ws
- | (Quoted|word) ^"::" PreSequence /ws
- | PreSequence ^"=>" ("[]"|"()"|word|Quoted) /ws
+ | (Quoted|Word) ^"::" PreSequence /ws
+ > PreSequence ^"/" e /ws
+ | PreSequence ^"->" e /ws
+
Sequence = psx:: PreSequence
+ | Sequence ^"&" Elements /ws
+ | Sequence ^"&~" Elements /ws
ec = ~[\-\]\\]
| escaped
Range = range:: ec
| ec ^"-" ec
-e = (Quoted|word) ^":" e
- > nonTerminal:: word
+e = (Quoted|Word) ^":" e
+ > nonTerminal:: Word
| literal:: Quoted
| ^"()"
| ^"{" Sequence "}" /ws
| e ^"*/" e /ws
| ^"!" e /ws
| e ^"?" /ws
- | ^"^" Quoted /ws
-
- | "(" word ^")" /ws
+ | ^"^" Quoted
+ | "(" Word ^")" /ws
> ^"(" RHS ")" /ws
| ^"~" e
+ > "^^":: "^" e
-word = [a-zA-Z0-9_]++
+Word = [a-zA-Z0-9_]++
Quoted = "\"" ((~[\"\\] | escaped)+) "\""
| "":: "\"\""
escaped = "\n":: "\\n"
| "\r":: "\\r"
| "\\" ~[nr]
-
w = " " | "\n" | "\r"
-ws = w** => ()
- | w** "//" ~[\n]* "\n" ws => ()
+ws = "()":: w**
+ | "()":: w** "//" ~[\n]* "\n" ws
wp = w++