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! Prefix)?
12 //Prefix = ([a-zA-Z] ".")+ "*"
13 FileName = FileNameChar+ -> [\r\n ]
14 FileNameChar = Space:: "\\ "
17 NonTerminal = Word "=" RHS /ws
18 | Word "*" ws! ^"=" ws! RHS
19 | Word "*/" Word ws! ^"=" ws! RHS
21 RHS = (Sequence +/ (ws! "|" ws!)) +/ (ws! ">" ws!)
25 PreSequence = Elements
26 | (Quoted|Word) ^"::" PreSequence /ws
27 > PreSequence ^"/" e /ws
28 | PreSequence ^"->" e /ws
30 Sequence = psx:: PreSequence
31 | Sequence ^"&" Elements /ws
32 | Sequence ^"&~" Elements /ws
40 e = (Quoted|Word) ^":" e
41 > NonTerminalReference
44 | ^"{" PreSequence "}" /ws
60 NonTerminalReference = Word
63 Quoted = "\"" ((~[\"\\] | escaped)+) "\""
67 escaped = "\n":: "\\n"
73 | "()":: w** "//" (~[\n])* "\n" ws