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