checkpoint
[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  ::=  (conjuncts +/ (ws "|" ws)) +/ (ws ">" ws)
8
9 conjuncts   ::=  sequence
10               |  sequence ^"&"  e*/ws   /ws
11               |  sequence ^"&~" e*/ws   /ws
12
13 ps          ::= e*/ws                              => "ps"
14               | (e+/ws ws)? "^" quoted (ws e+/ws)? => "ps2"
15 psx         ::= ps
16               > ps ^"/" e /ws
17 sequence    ::= psx
18               | psx ^"=>" (word|quoted) /ws
19
20 ec       ::= [~\-\]\\\~]
21            | escaped
22
23 range    ::= ec          => "range"
24            | ec ^"-" ec
25
26 e        ::=  word                          => "nonTerminal"
27            |  quoted                        => "literal"
28            |    ^"()"
29            |    ^"{" sequence "}"       /ws
30            |    ^"["  range* "]"
31            |    ^"[~" range* "]"
32
33            |  (e ws ^"**" > e ws ^"*")
34            |  e ^"*/" e                 /ws
35            |  (e ws ^"++" > e ws ^"+")
36            |  e ^"+/" e                 /ws
37            |  e ^"?"                    /ws
38
39            |     "(" word         ^")"  /ws
40            >    ^"(" alternatives  ")"  /ws
41
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