71f45d79cb663c6c3a472d6aa78299101174f0c0
[awesomized/libmemcached] / libmemcached / options / scanner.l
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 %top{
22
23 #pragma GCC diagnostic ignored "-Wold-style-cast"
24 #pragma GCC diagnostic ignored "-Wunused-parameter"
25 #pragma GCC diagnostic ignored "-fpermissive"
26
27 #include <libmemcached/options/parser.h>
28 #include <libmemcached/options/string.h>
29 #include <libmemcached/options/symbol.h>
30 #include <libmemcached/options/type.h>
31
32 }
33
34
35 %{
36 #include <cstdlib>
37 #include <cstring>
38
39 #define PARAM yyget_extra(yyscanner)
40
41 static void get_lex_chars(char* buffer, int& result, int max_size, struct type_st *parser)
42 {
43 if (parser->pos >= parser->length)
44 {
45 result = YY_NULL;
46 }
47 else
48 {
49 result = parser->length - parser->pos;
50 result > (int)max_size ? result = max_size : 0;
51 memcpy(buffer, parser->buf + parser->pos, result);
52 parser->pos += result;
53 }
54 }
55
56
57 #define YY_INPUT(buffer, result, max_size) get_lex_chars(buffer, result, max_size, PARAM)
58
59 %}
60
61 %option bison-locations
62 %option bison-bridge
63 %option case-insensitive
64 %option debug
65 %option nounput
66 %option noyywrap
67 %option outfile="libmemcached/options/scanner.cc" header-file="libmemcached/options/scanner.h"
68 %option perf-report
69 %option prefix="libmemcached_"
70 %option reentrant
71
72 %%
73
74
75 =|,|[ ] { return yytext[0];}
76
77
78 [[:digit:]]+ { yylval->number = atoi(yytext); return (NUMBER); }
79
80 ([[:digit:]]*.[:digit:]+) { yylval->double_number = atof(yytext); return (FLOAT); }
81
82 [\t\r\n] ; /* skip whitespace */
83
84 ^#.*$ {
85 return COMMENT;
86 }
87
88 "--" { return DASH_OPTION; }
89
90 SERVER { return SERVER; }
91 SERVERS { return SERVERS; }
92
93 VERIFY_KEY { return VERIFY_KEY; }
94 VERIFY-KEY { return VERIFY_KEY; }
95 AUTO_EJECT_HOSTS { return AUTO_EJECT_HOSTS; }
96 AUTO-EJECT_HOSTS { return AUTO_EJECT_HOSTS; }
97 BINARY_PROTOCOL { return BINARY_PROTOCOL; }
98 BINARY-PROTOCOL { return BINARY_PROTOCOL; }
99 BUFFER_REQUESTS { return BUFFER_REQUESTS; }
100 BUFFER-REQUESTS { return BUFFER_REQUESTS; }
101 CACHE_LOOKUPS { return CACHE_LOOKUPS; }
102 CACHE-LOOKUPS { return CACHE_LOOKUPS; }
103 CONFIGURE_FILE { return CONFIGURE_FILE; }
104 CONFIGURE-FILE { return CONFIGURE_FILE; }
105 CONNECT_TIMEOUT { return CONNECT_TIMEOUT; }
106 CONNECT-TIMEOUT { return CONNECT_TIMEOUT; }
107 CORK { return _CORK; }
108 DISTRIBUTION { return DISTRIBUTION; }
109 HASH { return HASH; }
110 HASH_WITH_PREFIX_KEY { return HASH_WITH_PREFIX_KEY; }
111 HASH-WITH-PREFIX_KEY { return HASH_WITH_PREFIX_KEY; }
112 IO_BYTES_WATERMARK { return IO_BYTES_WATERMARK; }
113 IO-BYTES-WATERMARK { return IO_BYTES_WATERMARK; }
114 IO_KEY_PREFETCH { return IO_KEY_PREFETCH; }
115 IO-KEY-PREFETCH { return IO_KEY_PREFETCH; }
116 IO_MSG_WATERMARK { return IO_MSG_WATERMARK; }
117 IO-MSG-WATERMARK { return IO_MSG_WATERMARK; }
118 KETAMA { return KETAMA; }
119 KETAMA_HASH { return KETAMA_HASH; }
120 KETAMA-HASH { return KETAMA_HASH; }
121 KETAMA_WEIGHTED { return KETAMA_WEIGHTED; }
122 KETAMA-WEIGHTED { return KETAMA_WEIGHTED; }
123 NOREPLY { return NOREPLY; }
124 NUMBER_OF_REPLICAS { return NUMBER_OF_REPLICAS; }
125 NUMBER-OF-REPLICAS { return NUMBER_OF_REPLICAS; }
126 POLL_TIMEOUT { return POLL_TIMEOUT; }
127 POLL-TIMEOUT { return POLL_TIMEOUT; }
128 RANDOMIZE_REPLICA_READ { return RANDOMIZE_REPLICA_READ; }
129 RANDOMIZE-REPLICA-READ { return RANDOMIZE_REPLICA_READ; }
130 RCV_TIMEOUT { return RCV_TIMEOUT; }
131 RCV-TIMEOUT { return RCV_TIMEOUT; }
132 RETRY_TIMEOUT { return RETRY_TIMEOUT; }
133 RETRY-TIMEOUT { return RETRY_TIMEOUT; }
134 SERVER_FAILURE_LIMIT { return SERVER_FAILURE_LIMIT; }
135 SERVER-FAILURE-LIMIT { return SERVER_FAILURE_LIMIT; }
136 SND_TIMEOUT { return SND_TIMEOUT; }
137 SND-TIMEOUT { return SND_TIMEOUT; }
138 SOCKET_RECV_SIZE { return SOCKET_RECV_SIZE; }
139 SOCKET-RECV-SIZE { return SOCKET_RECV_SIZE; }
140 SOCKET_SEND_SIZE { return SOCKET_SEND_SIZE; }
141 SOCKET-SEND-SIZE { return SOCKET_SEND_SIZE; }
142 SORT_HOSTS { return SORT_HOSTS; }
143 SORT-HOSTS { return SORT_HOSTS; }
144 SUPPORT_CAS { return SUPPORT_CAS; }
145 SUPPORT-CAS { return SUPPORT_CAS; }
146 TCP_NODELAY { return _TCP_NODELAY; }
147 TCP-NODELAY { return _TCP_NODELAY; }
148 TCP_KEEPALIVE { return _TCP_KEEPALIVE; }
149 TCP-KEEPALIVE { return _TCP_KEEPALIVE; }
150 TCP_KEEPIDLE { return _TCP_KEEPIDLE; }
151 TCP-KEEPIDLE { return _TCP_KEEPIDLE; }
152 USER_DATA { return USER_DATA; }
153 USER-DATA { return USER_DATA; }
154 USE_UDP { return USE_UDP; }
155 USE-UDP { return USE_UDP; }
156
157 PREFIX-KEY { return PREFIX_KEY; }
158 PREFIX_KEY { return PREFIX_KEY; }
159
160 CONSISTENT { return CONSISTENT; }
161 MODULA { return MODULA; }
162 RANDOM { return RANDOM; }
163
164 MD5 { return MD5; }
165 CRC { return CRC; }
166 FNV1_64 { return FNV1_64; }
167 FNV1A_64 { return FNV1A_64; }
168 FNV1_32 { return FNV1_32; }
169 FNV1A_32 { return FNV1A_32; }
170 HSIEH { return HSIEH; }
171 MURMUR { return MURMUR; }
172 JENKINS { return JENKINS; }
173
174 [[:alnum:]][[:alnum:].]*[[:alpha:]]: {
175 yylval->string.c_str = yytext;
176 yylval->string.length = yyleng;
177 return HOSTNAME_WITH_PORT;
178 }
179
180 [[:alnum:]]+"."[[:alpha:].]+ {
181 yylval->string.c_str = yytext;
182 yylval->string.length = yyleng;
183 return HOSTNAME;
184 }
185
186 [[:digit:]]{1,3}"."[[:digit:]]{1,3}"."[[:digit:]]{1,3}"."[[:digit:]]{1,3}: {
187 yylval->string.c_str = yytext;
188 yylval->string.length = yyleng;
189 return IPADDRESS_WITH_PORT;
190 }
191
192 [[:digit:]]{1,3}"."[[:digit:]]{1,3}"."[[:digit:]]{1,3}"."[[:digit:]]{1,3} {
193 yylval->string.c_str = yytext;
194 yylval->string.length = yyleng;
195 return IPADDRESS;
196 }
197
198 [[:alnum:]]+ {
199 yylval->string.c_str = yytext;
200 yylval->string.length = yyleng;
201 return STRING;
202 }
203
204 \".*\" {
205 yylval->string.c_str = yytext;
206 yylval->string.length = yyleng;
207 return QUOTED_STRING;
208 }
209
210 . {
211 return UNKNOWN;
212 }
213
214 %%