checkpoint
[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! Prefix)?
11
12 //Prefix        = ([a-zA-Z] ".")+ "*"
13 FileName      = FileNameChar+ -> [\r\n ]
14 FileNameChar  = Space:: "\\ "
15               | ~[\r\n ]
16
17 NonTerminal   =  Word           "="     RHS /ws
18               |  Word  "*" ws! ^"=" ws! RHS
19               |  Word  "*/" Word ws! ^"=" ws! RHS
20        
21 RHS           =  (Sequence +/ (ws! "|" ws!)) +/ (ws! ">" ws!)
22
23 Elements      =  e*/ws
24
25 PreSequence   =  Elements
26               |  (Quoted|Word)   ^"::" PreSequence /ws
27               >  PreSequence     ^"/"      e       /ws
28               |  PreSequence     ^"->"     e       /ws
29
30 Sequence      = psx:: PreSequence
31               |       Sequence ^"&"  Elements /ws
32               |       Sequence ^"&~" Elements /ws
33
34 ec            = ~[\-\]\\]
35               | escaped
36
37 Range         = ec
38               | ec ^"-" ec
39
40 e             =                (Quoted|Word) ^":" e
41               >                NonTerminalReference
42               |                Literal
43               |                  ^"()"
44               |                  ^"{" PreSequence "}"    /ws
45               |                  ^"["  Range* "]"
46               |                e ^"++"                   /ws -> ~[/]
47               |                e ^"+"                    /ws -> ~[+]
48               |                e ^"++/" e                /ws        
49               |                e ^"+/"  e                /ws        
50               |                e ^"**"                   /ws -> ~[/]
51               |                e ^"*"                    /ws -> ~[*]
52               |                e ^"**/" e                /ws        
53               |                e ^"*/"  e                /ws        
54               |                     e ^"!"
55               |                e ^"?"                    /ws
56               |                  ^"^"   Quoted
57               >                  ^"(" RHS  ")"           /ws
58               |                  ^"~" e
59
60 NonTerminalReference = Word
61 Literal              = Quoted
62 Word                 = [.a-zA-Z0-9_]++
63 Quoted               = "\"" ((~[\"\\] | escaped)+) "\""
64                      | EmptyString
65                        EmptyString = "\"\""
66
67 escaped    = "\n":: "\\n"
68            | "\r":: "\\r"
69            |        "\\" ~[nr]
70
71 w             = " " | "\n" | "\r"
72 ws            =  "()":: w**
73               |  "()":: w** "//" (~[\n])* "\n" ws
74 wp            =  w++