1 // use 'a'-'z' or 'a-z' instead of [a-z]?
3 // #include (with renaming?)
7 Grammar = Declaration +/ ws
9 Declaration = NonTerminal
10 | ^"#import" ws! FileName (ws! "as" ws! Word)?
12 FileName = FileNameChar+ -> [\r\n ]
13 FileNameChar = Space:: "\\ "
16 NonTerminal = Word "=" RHS /ws
17 | Word "*" ws! ^"=" ws! RHS
18 | Word "*/" Word ws! ^"=" ws! RHS
20 RHS = (Sequence +/ (ws! "|" ws!)) +/ (ws! ">" ws!)
24 PreSequence = Elements
25 | (Quoted|Word) ^"::" PreSequence /ws
26 > PreSequence ^"/" e /ws
27 | PreSequence ^"->" e /ws
29 Sequence = psx:: PreSequence
30 | Sequence ^"&" Elements /ws
31 | Sequence ^"&~" Elements /ws
39 e = (Quoted|Word) ^":" e
40 > NonTerminalReference
43 | ^"{" PreSequence "}" /ws
59 NonTerminalReference = Word
61 Word = [.a-zA-Z0-9_]++
62 Quoted = "\"" ((~[\"\\] | escaped)+) "\""
66 escaped = "\n":: "\\n"
72 | "()":: w** "//" (~[\n])* "\n" ws