110964f90f33671d255319d8b195f691c07b2edb
[sbp.git] / tests / meta.g
1 s         ::=  Grammar ws                  => "gram"
2 w       !::= " "
3            | "\n"
4            | "\r"
5 ws       !::=  w** | w** "//" (~[\n]*) "\n" !ws
6 wp       !::=  w++
7 Grammar   ::=  r +/ ws                        => "grammar"
8
9 r         ::=  word  ^"::=" alternatives /ws
10             |  word ^"!::=" alternatives /ws
11
12 alternatives  ::=  (Conjuncts +/ (!ws "|" !ws)) +/ (!ws ">" !ws)
13
14 Conjuncts  ::=  Sequence
15              |  Sequence ^"&"  e*/ws   /ws
16              |  Sequence ^"&~" e*/ws   /ws
17
18 ps         ::= e*/ws                              => "ps"
19              | (e+/ws !ws)? "^" Quoted (!ws e+/ws)? => "ps2"
20 psy        ::= ps
21              | ps wp ^"/" !ws e
22 psx        ::= psy                   => "psy"
23 //             | e "<-" psy        /ws => "psyl"
24              |        psy "->" e /ws => "psyr"
25 //             | e "<-" psy "->" e /ws => "psylr"
26 Sequence   ::= Quoted => "qprod"
27              > psx => "psx"
28              | psx  "=>" ^"[]"         /ws
29              | psx ^"=>" (word|Quoted) /ws
30
31 ec       ::= ~[\-\]\\]
32            | escaped
33
34 Range    ::= ec          => "range"
35            | ec ^"-" ec
36
37 e        ::=  word                          => "nonTerminal"
38            |  Quoted                        => "literal"
39            |    ^"()"
40            |    ^"{" Sequence "}"       /ws
41            |    ^"["  Range* "]"
42
43            |  (e ^"++"    /ws > e ^"+"    /ws)
44            |  (e ^"++/" e /ws > e ^"+/" e /ws)
45            |  (e ^"**"    /ws > e ^"*"    /ws)
46            |  (e ^"**/" e /ws > e ^"*/" e /ws)
47            |  ^"!" e                    /ws
48            |  e ^"?"                    /ws
49
50            |     "(" word         ^")"  /ws
51            >    ^"(" alternatives  ")"  /ws
52            |    ^"~" e
53
54 word     ::= [a-zA-Z0-9_]++
55 Quoted   ::= "\"" ((~[\"\\] | escaped)+) "\""
56            | "\"\"" => ""
57 escaped  ::= "\\n" => "\n"
58            | "\\r" => "\r"
59            | "\\" ~[nr]
60
61