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