05e7ccb641157496bbc79090dbb0e4208a96d436
[sip-router] / cfg.y
1 /*
2  * $Id$
3  *
4  *  cfg grammar
5  */
6
7 %{
8
9 %}
10
11 %union {
12         int intval;
13         char* strval;
14 }
15
16 /* terminals */
17
18
19 /* keywors */
20 %token FORWARD
21 %token SEND
22 %token DROP
23 %token LOG
24 %token ERROR
25 %token ROUTE
26 %token METHOD
27 %token URI
28 %token SRCIP
29 %token DSTIP
30
31 /* config vars. */
32 %token DEBUG
33 %token FORK
34 %token LOGSTDERROR
35 %token LISTEN
36 %token DNS
37 %token REV_DNS
38
39
40 /* operators */
41 %nonassoc EQUAL
42 %nonassoc EQUAL_T
43 %nonassoc MATCH
44 %left NOT
45 %left AND
46 %left OR
47
48 /* values */
49 %token NUMBER
50 %token ID
51 %token STRING
52
53 /* other */
54 %token COMMA
55 %token SEMICOLON
56 %token RPAREN
57 %token LPAREN
58 %token LBRACE
59 %token RBRACE
60 %token LBRACK
61 %token RBRACK
62 %token SLASH
63 %token DOT
64 %token CR
65
66
67 /*non-terminals */
68
69
70
71 %%
72
73
74 cfg:    statements
75         ;
76
77 statements:     statements statement {printf("got <> <>\n");}
78                         | statement {printf("got a statement<>\n"); }
79         ;
80
81 statement:      assign_stm CR
82                         | route_stm CR
83                         | CR    /* null statement*/
84         ;
85
86 assign_stm:     DEBUG EQUAL NUMBER |
87                         FORK  EQUAL NUMBER |
88                         LOGSTDERROR EQUAL NUMBER |
89                         DNS EQUAL NUMBER |
90                         REV_DNS EQUAL NUMBER |
91                         LISTEN EQUAL ipv4 |
92                         LISTEN EQUAL ID |
93                         LISTEN EQUAL STRING 
94         ;
95
96
97 ipv4:   NUMBER DOT NUMBER DOT NUMBER DOT NUMBER
98         ;
99
100 route_stm:      ROUTE LBRACE rules RBRACE |
101                         ROUTE LBRACK NUMBER RBRACK LBRACE rules RBRACE
102         ;
103
104 rules:  rules rule |
105                 rule
106          ;
107
108 rule:   condition       actions CR
109                 | CR  /* null rule */
110         ;
111
112 condition:      exp_elem |
113                         LPAREN exp RPAREN
114         ;
115
116 exp:    exp AND condition |
117                 exp OR  condition |
118                 NOT condition |
119                 condition
120         ;
121
122 exp_elem:       METHOD EQUAL_T STRING |
123                         METHOD EQUAL_T ID |
124                         METHOD MATCH STRING |
125                         METHOD MATCH ID |
126                         URI EQUAL_T STRING |
127                         URI EQUAL_T ID |
128                         URI MATCH STRING |
129                         URI MATCH ID |
130                         SRCIP EQUAL_T net4 |
131                         SRCIP EQUAL_T STRING |
132                         SRCIP EQUAL_T host |
133                         SRCIP MATCH STRING 
134                         DSTIP EQUAL_T net4 |
135                         DSTIP EQUAL_T STRING |
136                         DSTIP MATCH STRING
137         ;
138
139 net4:   ipv4 SLASH ipv4 |
140                 ipv4 SLASH NUMBER |
141                 ipv4
142         ;
143
144 host:   ID |
145                 host DOT ID
146         ;
147
148
149 actions:        actions action |
150                         action
151         ;
152
153 action:         cmd SEMICOLON |
154                         SEMICOLON /* null action */
155
156 cmd:            FORWARD LPAREN host RPAREN |
157                         FORWARD LPAREN STRING RPAREN |
158                         FORWARD LPAREN ipv4 RPAREN |
159                         SEND LPAREN host RPAREN |
160                         SEND LPAREN STRING RPAREN |
161                         SEND LPAREN ipv4 RPAREN |
162                         DROP LPAREN RPAREN |
163                         DROP |
164                         LOG LPAREN STRING RPAREN |
165                         ERROR LPAREN STRING COMMA STRING RPAREN |
166                         ROUTE LPAREN NUMBER RPAREN
167         ;
168
169
170 %%
171
172 extern int line;
173 extern int column;
174 yyerror(char* s)
175 {
176         fprintf(stderr, "parse error (%d,%d): %s\n", line, column, s);
177 }
178
179 int main(int argc, char ** argv)
180 {
181         if (yyparse()!=0)
182                 fprintf(stderr, "parsing error\n");
183 }