Merge in all changes related to being able to read configuration files.
[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 CONNECT_TIMEOUT { return CONNECT_TIMEOUT; }
104 CONNECT-TIMEOUT { return CONNECT_TIMEOUT; }
105 CORK { return _CORK; }
106 DISTRIBUTION { return DISTRIBUTION; }
107 HASH { return HASH; }
108 HASH_WITH_PREFIX_KEY { return HASH_WITH_PREFIX_KEY; }
109 HASH-WITH-PREFIX_KEY { return HASH_WITH_PREFIX_KEY; }
110 IO_BYTES_WATERMARK { return IO_BYTES_WATERMARK; }
111 IO-BYTES-WATERMARK { return IO_BYTES_WATERMARK; }
112 IO_KEY_PREFETCH { return IO_KEY_PREFETCH; }
113 IO-KEY-PREFETCH { return IO_KEY_PREFETCH; }
114 IO_MSG_WATERMARK { return IO_MSG_WATERMARK; }
115 IO-MSG-WATERMARK { return IO_MSG_WATERMARK; }
116 KETAMA { return KETAMA; }
117 KETAMA_HASH { return KETAMA_HASH; }
118 KETAMA-HASH { return KETAMA_HASH; }
119 KETAMA_WEIGHTED { return KETAMA_WEIGHTED; }
120 KETAMA-WEIGHTED { return KETAMA_WEIGHTED; }
121 NOREPLY { return NOREPLY; }
122 NUMBER_OF_REPLICAS { return NUMBER_OF_REPLICAS; }
123 NUMBER-OF-REPLICAS { return NUMBER_OF_REPLICAS; }
124 POLL_TIMEOUT { return POLL_TIMEOUT; }
125 POLL-TIMEOUT { return POLL_TIMEOUT; }
126 RANDOMIZE_REPLICA_READ { return RANDOMIZE_REPLICA_READ; }
127 RANDOMIZE-REPLICA-READ { return RANDOMIZE_REPLICA_READ; }
128 RCV_TIMEOUT { return RCV_TIMEOUT; }
129 RCV-TIMEOUT { return RCV_TIMEOUT; }
130 RETRY_TIMEOUT { return RETRY_TIMEOUT; }
131 RETRY-TIMEOUT { return RETRY_TIMEOUT; }
132 SERVER_FAILURE_LIMIT { return SERVER_FAILURE_LIMIT; }
133 SERVER-FAILURE-LIMIT { return SERVER_FAILURE_LIMIT; }
134 SND_TIMEOUT { return SND_TIMEOUT; }
135 SND-TIMEOUT { return SND_TIMEOUT; }
136 SOCKET_RECV_SIZE { return SOCKET_RECV_SIZE; }
137 SOCKET-RECV-SIZE { return SOCKET_RECV_SIZE; }
138 SOCKET_SEND_SIZE { return SOCKET_SEND_SIZE; }
139 SOCKET-SEND-SIZE { return SOCKET_SEND_SIZE; }
140 SORT_HOSTS { return SORT_HOSTS; }
141 SORT-HOSTS { return SORT_HOSTS; }
142 SUPPORT_CAS { return SUPPORT_CAS; }
143 SUPPORT-CAS { return SUPPORT_CAS; }
144 TCP_NODELAY { return _TCP_NODELAY; }
145 TCP-NODELAY { return _TCP_NODELAY; }
146 TCP_KEEPALIVE { return _TCP_KEEPALIVE; }
147 TCP-KEEPALIVE { return _TCP_KEEPALIVE; }
148 TCP_KEEPIDLE { return _TCP_KEEPIDLE; }
149 TCP-KEEPIDLE { return _TCP_KEEPIDLE; }
150 USER_DATA { return USER_DATA; }
151 USER-DATA { return USER_DATA; }
152 USE_UDP { return USE_UDP; }
153 USE-UDP { return USE_UDP; }
154
155 PREFIX-KEY { return PREFIX_KEY; }
156 PREFIX_KEY { return PREFIX_KEY; }
157
158 CONSISTENT { return CONSISTENT; }
159 MODULA { return MODULA; }
160 RANDOM { return RANDOM; }
161
162 MD5 { return MD5; }
163 CRC { return CRC; }
164 FNV1_64 { return FNV1_64; }
165 FNV1A_64 { return FNV1A_64; }
166 FNV1_32 { return FNV1_32; }
167 FNV1A_32 { return FNV1A_32; }
168 HSIEH { return HSIEH; }
169 MURMUR { return MURMUR; }
170 JENKINS { return JENKINS; }
171
172 [[:alnum:]][[:alnum:].]*[[:alpha:]]: {
173 yylval->string.c_str = yytext;
174 yylval->string.length = yyleng;
175 return HOSTNAME_WITH_PORT;
176 }
177
178 [[:alnum:]]+"."[[:alpha:].]+ {
179 yylval->string.c_str = yytext;
180 yylval->string.length = yyleng;
181 return HOSTNAME;
182 }
183
184 [[:digit:]]{1,3}"."[[:digit:]]{1,3}"."[[:digit:]]{1,3}"."[[:digit:]]{1,3}: {
185 yylval->string.c_str = yytext;
186 yylval->string.length = yyleng;
187 return IPADDRESS_WITH_PORT;
188 }
189
190 [[:digit:]]{1,3}"."[[:digit:]]{1,3}"."[[:digit:]]{1,3}"."[[:digit:]]{1,3} {
191 yylval->string.c_str = yytext;
192 yylval->string.length = yyleng;
193 return IPADDRESS;
194 }
195
196 [[:alnum:]]+ {
197 yylval->string.c_str = yytext;
198 yylval->string.length = yyleng;
199 return STRING;
200 }
201
202 \".*\" {
203 yylval->string.c_str = yytext;
204 yylval->string.length = yyleng;
205 return QUOTED_STRING;
206 }
207
208 . {
209 return UNKNOWN;
210 }
211
212 %%