checkpoint
[sbp.git] / tests / meta.g
1 s         ::=  ws grammar ws                  => "gram"
2 ws       !::=  w**
3 grammar   ::=  r +/ ws                        => "grammar"
4
5 r         ::=  word  ^"::=" alternatives /ws
6             |  word ^"!::=" alternatives /ws
7
8 alternatives  ::=  (conjuncts +/ (ws "|" ws)) +/ (ws ">" ws)
9
10 conjuncts     ::=  sequence
11                 |  sequence ^"&"  e*/ws   /ws
12                 |  sequence ^"&~" e*/ws   /ws
13
14 ps          ::= e*/ws                              => "ps"
15               | (e+/ws ws)? "^" quoted (ws e+/ws)? => "ps2"
16 psx         ::= ps
17               > ps ^"/" e /ws
18 sequence    ::= psx
19               | psx ^"=>" (word|quoted) /ws
20
21 ec       ::= [~\-\]\\\~]
22            | escaped
23
24 range    ::= ec          => "range"
25            | ec ^"-" ec
26
27 e        ::=  word                          => "nonTerminal"
28            |  quoted                        => "literal"
29            |    ^"()"
30            |    ^"{" sequence "}"       /ws
31            |    ^"["  range* "]"
32            |    ^"[~" range* "]"
33
34            |  (e ws ^"**" > e ws ^"*")
35            |  e ^"*/" e                 /ws
36            |  (e ws ^"++" > e ws ^"+")
37            |  e ^"+/" e                 /ws
38            |  e ^"?"                    /ws
39
40            |     "(" word         ^")"  /ws
41            >    ^"(" alternatives  ")"  /ws
42 w       !::= " "
43            | "//" ([~\n]*) "\n"
44            | "\n"
45            | "\r"
46 word     ::= [a-zA-Z0-9_]++
47 quoted   ::= "\"" (([~\"\\] | escaped)+) "\""
48            | "\"\"" => ""
49 escaped  ::= "\\n" => "\n"
50            | "\\r" => "\r"
51            | "\\" [~nr]
52
53