resolved some conflicts, added CommandLine
[sbp.git] / tests / meta.g
1 // use 'a'-'z' or 'a-z' instead of [a-z]?
2 // EOF token?
3 // #include (with renaming?)
4
5 s             =  ws! Grammar ws!
6
7 Grammar       =  Declaration +/ ws
8
9 Declaration   =  NonTerminal
10               |  ^"#import" ws! FileName (ws! "as" ws! Word)?
11
12 FileName      = FileNameChar+ -> [\r\n ]
13 FileNameChar  = Space:: "\\ "
14               | ~[\r\n ]
15
16 NonTerminal   =  Word           "="     RHS /ws
17               |  Word  "*" ws! ^"=" ws! RHS
18               |  Word  "*/" Word ws! ^"=" ws! RHS
19        
20 RHS           =  (Sequence +/ (ws! "|" ws!)) +/ (ws! ">" ws!)
21
22 Elements      =  e*/ws
23
24 PreSequence   =  Elements
25               |  (Quoted|Word)   ^"::" PreSequence /ws
26               >  PreSequence     ^"/"      e       /ws
27               |  PreSequence     ^"->"     e       /ws
28
29 Sequence      = psx:: PreSequence
30               |       Sequence ^"&"  Elements /ws
31               |       Sequence ^"&~" Elements /ws
32
33 ec            = ~[\-\]\\]
34               | escaped
35
36 Range         = ec
37               | ec "-" ec
38
39 e             =                (Quoted|Word) ^":" e
40               >                NonTerminalReference
41               |                Literal
42               |                  ^"()"
43               |                  ^"{" PreSequence "}"    /ws
44               |                  ^"["  Range* "]"
45               |                e ^"++"                   /ws -> ~[/]
46               |                e ^"+"                    /ws -> ~[+]
47               |                e ^"++/" e                /ws        
48               |                e ^"+/"  e                /ws        
49               |                e ^"**"                   /ws -> ~[/]
50               |                e ^"*"                    /ws -> ~[*]
51               |                e ^"**/" e                /ws        
52               |                e ^"*/"  e                /ws        
53               |                     e ^"!"
54               |                e ^"?"                    /ws
55               |                  ^"^"   Quoted
56               >                  ^"(" RHS  ")"           /ws
57               |                  ^"~" e
58               |                  ^"\\{"
59               |                  ^"\\}"
60
61 NonTerminalReference = Word
62 Literal              = Quoted
63 Word                 = [.a-zA-Z0-9_]++
64 Quoted               = "\"" ((~[\"\\] | escaped)+) "\""
65                      | EmptyString
66                        EmptyString = "\"\""
67
68 escaped    = "\n":: "\\n"
69            | "\r":: "\\r"
70            |        "\\" ~[nr]
71
72 w             = " " | "\n" | "\r"
73 ws            =  w**
74               |  w** "//" (~[\n])*! "\n" ws!
75 wp            =  w++