00ad06312e06c290caf731d5007e0eb5ece53836
[m6w6/libmemcached] / libmemcached / options / parser.yy
1 /* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
2 *
3 * Libmemcached Scanner and Parser
4 *
5 * Copyright (C) 2011 DataDifferental, http://datadifferential.com
6 *
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU Affero General Public License as
9 * published by the Free Software Foundation, either version 3 of the
10 * License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU Affero General Public License for more details.
16 *
17 * You should have received a copy of the GNU Affero General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 */
20
21 %{
22
23 #include <stdint.h>
24 #include <iostream>
25
26 #include <libmemcached/options/type.h>
27 #include <libmemcached/options/string.h>
28 #include <libmemcached/options/symbol.h>
29
30 #pragma GCC diagnostic ignored "-Wold-style-cast"
31 #include <libmemcached/options/scanner.h>
32
33 inline void libmemcached_error(YYLTYPE *locp, type_st *parser, yyscan_t *scanner, const char *str)
34 {
35 memcached_string_t local_string;
36 local_string.size= strlen(str);
37 local_string.c_str= str;
38 memcached_set_error(parser->memc, MEMCACHED_FAILURE, &local_string);
39 }
40
41
42 %}
43
44 %error-verbose
45 %debug
46 %defines
47 %expect 0
48 %output "libmemcached/options/parser.cc"
49 %defines "libmemcached/options/parser.h"
50 %lex-param { yyscan_t *scanner }
51 %name-prefix="libmemcached_"
52 %parse-param { type_st *parser }
53 %parse-param { yyscan_t *scanner }
54 %locations
55 %pure-parser
56 %require "2.2"
57 %start statement
58 %verbose
59
60 %token COMMENT
61 %token CONFIGURE_FILE
62 %token EMPTY_LINE
63 %token SERVER
64 %token SERVERS
65 %token UNKNOWN
66
67 %token DASH_OPTION
68
69 /* All behavior options */
70 %token AUTO_EJECT_HOSTS
71 %token BINARY_PROTOCOL
72 %token BUFFER_REQUESTS
73 %token CACHE_LOOKUPS
74 %token CONNECT_TIMEOUT
75 %token _CORK
76 %token DISTRIBUTION
77 %token HASH
78 %token HASH_WITH_PREFIX_KEY
79 %token IO_BYTES_WATERMARK
80 %token IO_KEY_PREFETCH
81 %token IO_MSG_WATERMARK
82 %token KETAMA
83 %token KETAMA_HASH
84 %token KETAMA_WEIGHTED
85 %token NOREPLY
86 %token NUMBER_OF_REPLICAS
87 %token POLL_TIMEOUT
88 %token RANDOMIZE_REPLICA_READ
89 %token RCV_TIMEOUT
90 %token RETRY_TIMEOUT
91 %token SERVER_FAILURE_LIMIT
92 %token SND_TIMEOUT
93 %token SOCKET_RECV_SIZE
94 %token SOCKET_SEND_SIZE
95 %token SORT_HOSTS
96 %token SUPPORT_CAS
97 %token _TCP_NODELAY
98 %token _TCP_KEEPALIVE
99 %token _TCP_KEEPIDLE
100 %token USER_DATA
101 %token USE_UDP
102 %token VERIFY_KEY
103
104 /* Callbacks */
105 %token PREFIX_KEY
106
107 /* Hash types */
108 %token MD5
109 %token CRC
110 %token FNV1_64
111 %token FNV1A_64
112 %token FNV1_32
113 %token FNV1A_32
114 %token HSIEH
115 %token MURMUR
116 %token JENKINS
117
118 /* Distributions */
119 %token CONSISTENT
120 %token MODULA
121 %token RANDOM
122
123 %nonassoc ','
124 %nonassoc '='
125
126 %token <number> NUMBER
127 %token <number> FLOAT
128 %token <string> HOSTNAME
129 %token <string> HOSTNAME_WITH_PORT
130 %token <string> IPADDRESS
131 %token <string> IPADDRESS_WITH_PORT
132 %token <string> STRING
133 %token <string> QUOTED_STRING
134
135 %type <server> server
136 %type <string> string
137 %type <distribution> distribution
138 %type <hash> hash
139 %type <behavior> behavior_boolean
140 %type <behavior> behavior_number
141
142 %%
143
144 statement:
145 DASH_OPTION expression
146 { }
147 | statement ' ' DASH_OPTION expression
148 { }
149 | COMMENT
150 { }
151 | EMPTY_LINE
152 { }
153 ;
154
155
156 expression:
157 SERVER '=' server
158 {
159 (void) memcached_server_add_parsed(parser->memc, $3.c_str, $3.length, $3.port, 0);
160 }
161 | SERVERS '=' server_list
162 {
163 }
164 | CONFIGURE_FILE '=' string
165 {
166 memcached_set_configuration_file(parser->memc, $3.c_str, $3.length);
167 }
168 | behaviors
169 ;
170
171 behaviors:
172 PREFIX_KEY '=' string
173 {
174 memcached_callback_set(parser->memc, MEMCACHED_CALLBACK_PREFIX_KEY, std::string($3.c_str, $3.length).c_str());
175 }
176 | DISTRIBUTION '=' distribution
177 {
178 memcached_behavior_set(parser->memc, MEMCACHED_BEHAVIOR_DISTRIBUTION, $3);
179 }
180 | HASH '=' hash
181 {
182 memcached_behavior_set(parser->memc, MEMCACHED_BEHAVIOR_DISTRIBUTION, $3);
183 }
184 | KETAMA_HASH '=' hash
185 {
186 memcached_behavior_set(parser->memc, MEMCACHED_BEHAVIOR_KETAMA_HASH, $3);
187 }
188 | behavior_number '=' NUMBER
189 {
190 memcached_behavior_set(parser->memc, $1, $3);
191 }
192 | behavior_boolean
193 {
194 memcached_behavior_set(parser->memc, $1, true);
195 }
196 | USER_DATA
197 {
198 }
199 ;
200
201 behavior_number:
202 CONNECT_TIMEOUT
203 {
204 $$= MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT;
205 }
206 | IO_MSG_WATERMARK
207 {
208 $$= MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK;
209 }
210 | IO_BYTES_WATERMARK
211 {
212 $$= MEMCACHED_BEHAVIOR_IO_BYTES_WATERMARK;
213 }
214 | IO_KEY_PREFETCH
215 {
216 $$= MEMCACHED_BEHAVIOR_IO_KEY_PREFETCH;
217 }
218 | NUMBER_OF_REPLICAS
219 {
220 $$= MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS;
221 }
222 | POLL_TIMEOUT
223 {
224 $$= MEMCACHED_BEHAVIOR_POLL_TIMEOUT;
225 }
226 | RCV_TIMEOUT
227 {
228 $$= MEMCACHED_BEHAVIOR_RCV_TIMEOUT;
229 }
230 | RETRY_TIMEOUT
231 {
232 $$= MEMCACHED_BEHAVIOR_RETRY_TIMEOUT;
233 }
234 | SERVER_FAILURE_LIMIT
235 {
236 $$= MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT;
237 }
238 | SND_TIMEOUT
239 {
240 $$= MEMCACHED_BEHAVIOR_SND_TIMEOUT;
241 }
242 | SOCKET_RECV_SIZE
243 {
244 $$= MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE;
245 }
246 | SOCKET_SEND_SIZE
247 {
248 $$= MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE;
249 }
250 ;
251
252 behavior_boolean:
253 AUTO_EJECT_HOSTS
254 {
255 $$= MEMCACHED_BEHAVIOR_AUTO_EJECT_HOSTS;
256 }
257 | BINARY_PROTOCOL
258 {
259 $$= MEMCACHED_BEHAVIOR_BINARY_PROTOCOL;
260 }
261 | BUFFER_REQUESTS
262 {
263 $$= MEMCACHED_BEHAVIOR_BUFFER_REQUESTS;
264 }
265 | CACHE_LOOKUPS
266 {
267 $$= MEMCACHED_BEHAVIOR_CACHE_LOOKUPS;
268 }
269 | _CORK
270 {
271 $$= MEMCACHED_BEHAVIOR_CORK;
272 }
273 | HASH_WITH_PREFIX_KEY
274 {
275 $$= MEMCACHED_BEHAVIOR_HASH_WITH_PREFIX_KEY;
276 }
277 | KETAMA
278 {
279 $$= MEMCACHED_BEHAVIOR_KETAMA;
280 }
281 | KETAMA_WEIGHTED
282 {
283 $$= MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED;
284 }
285 | NOREPLY
286 {
287 $$= MEMCACHED_BEHAVIOR_NOREPLY;
288 }
289 | RANDOMIZE_REPLICA_READ
290 {
291 $$= MEMCACHED_BEHAVIOR_RANDOMIZE_REPLICA_READ;
292 }
293 | SORT_HOSTS
294 {
295 $$= MEMCACHED_BEHAVIOR_SORT_HOSTS;
296 }
297 | SUPPORT_CAS
298 {
299 $$= MEMCACHED_BEHAVIOR_SUPPORT_CAS;
300 }
301 | _TCP_NODELAY
302 {
303 $$= MEMCACHED_BEHAVIOR_TCP_NODELAY;
304 }
305 | _TCP_KEEPALIVE
306 {
307 $$= MEMCACHED_BEHAVIOR_TCP_KEEPALIVE;
308 }
309 | _TCP_KEEPIDLE
310 {
311 $$= MEMCACHED_BEHAVIOR_TCP_KEEPIDLE;
312 }
313 | USE_UDP
314 {
315 $$= MEMCACHED_BEHAVIOR_USE_UDP;
316 }
317 | VERIFY_KEY
318 {
319 $$= MEMCACHED_BEHAVIOR_VERIFY_KEY;
320 }
321
322
323 server_list:
324 server
325 {
326 (void) memcached_server_add_parsed(parser->memc, $1.c_str, $1.length, $1.port, 0);
327 }
328 | server_list ',' server
329 {
330 (void) memcached_server_add_parsed(parser->memc, $3.c_str, $3.length, $3.port, 0);
331 }
332 ;
333
334 server:
335 HOSTNAME_WITH_PORT NUMBER
336 {
337 $$.c_str= $1.c_str;
338 $$.length= $1.length -1;
339 $$.port= $2;
340 }
341 | HOSTNAME
342 {
343 $$.c_str= $1.c_str;
344 $$.length= $1.length;
345 $$.port= MEMCACHED_DEFAULT_PORT;
346 }
347 | STRING /* a match can be against "localhost" which is just a string */
348 {
349 $$.c_str= $1.c_str;
350 $$.length= $1.length;
351 $$.port= MEMCACHED_DEFAULT_PORT;
352 }
353 | IPADDRESS_WITH_PORT NUMBER
354 {
355 $$.c_str= $1.c_str;
356 $$.length= $1.length -1;
357 $$.port= $2;
358 }
359 | IPADDRESS
360 {
361 $$.c_str= $1.c_str;
362 $$.length= $1.length;
363 $$.port= MEMCACHED_DEFAULT_PORT;
364 }
365 ;
366
367 hash:
368 MD5
369 {
370 $$= MEMCACHED_HASH_MD5;
371 }
372 | CRC
373 {
374 $$= MEMCACHED_HASH_CRC;
375 }
376 | FNV1_64
377 {
378 $$= MEMCACHED_HASH_FNV1_64;
379 }
380 | FNV1A_64
381 {
382 $$= MEMCACHED_HASH_FNV1A_64;
383 }
384 | FNV1_32
385 {
386 $$= MEMCACHED_HASH_FNV1_32;
387 }
388 | FNV1A_32
389 {
390 $$= MEMCACHED_HASH_FNV1A_32;
391 }
392 | HSIEH
393 {
394 $$= MEMCACHED_HASH_HSIEH;
395 }
396 | MURMUR
397 {
398 $$= MEMCACHED_HASH_MURMUR;
399 }
400 | JENKINS
401 {
402 $$= MEMCACHED_HASH_JENKINS;
403 }
404 ;
405
406 string:
407 STRING
408 {
409 $$= $1;
410 }
411 | QUOTED_STRING
412 {
413 $$.c_str= $1.c_str +1;
414 $$.length= $1.length -2;
415 }
416 ;
417
418 distribution:
419 CONSISTENT
420 {
421 $$= MEMCACHED_DISTRIBUTION_CONSISTENT;
422 }
423 | MODULA
424 {
425 $$= MEMCACHED_DISTRIBUTION_MODULA;
426 }
427 | RANDOM
428 {
429 $$= MEMCACHED_DISTRIBUTION_RANDOM;
430 }
431 ;