+/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
+ *
+ * Libmemcached Scanner and Parser
+ *
+ * Copyright (C) 2011 DataDifferental, http://datadifferential.com
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
%top{
%%
-=|, { return yytext[0];}
+=|,|[ ] { return yytext[0];}
[[:digit:]]+ { yylval->number = atoi(yytext); return (NUMBER); }
([[:digit:]]*.[:digit:]+) { yylval->double_number = atof(yytext); return (FLOAT); }
-[ \t\r\n] ; /* skip whitespace */
-
-"--SERVER" { return SERVER; }
-"--SERVERS" { return SERVERS; }
-"--TCP_NODELAY" { return TCPNODELAY; }
-"--TCP-NODELAY" { return TCPNODELAY; }
-"--VERIFY_KEY" { return VERIFY_KEY; }
-"--VERIFY-KEY" { return VERIFY_KEY; }
+[\t\r\n] ; /* skip whitespace */
+
+"--" { return DASH_OPTION; }
+
+SERVER { return SERVER; }
+SERVERS { return SERVERS; }
+
+VERIFY_KEY { return VERIFY_KEY; }
+VERIFY-KEY { return VERIFY_KEY; }
+AUTO_EJECT_HOSTS { return AUTO_EJECT_HOSTS; }
+AUTO-EJECT_HOSTS { return AUTO_EJECT_HOSTS; }
+BINARY_PROTOCOL { return BINARY_PROTOCOL; }
+BINARY-PROTOCOL { return BINARY_PROTOCOL; }
+BUFFER_REQUESTS { return BUFFER_REQUESTS; }
+BUFFER-REQUESTS { return BUFFER_REQUESTS; }
+CACHE_LOOKUPS { return CACHE_LOOKUPS; }
+CACHE-LOOKUPS { return CACHE_LOOKUPS; }
+CONNECT_TIMEOUT { return CONNECT_TIMEOUT; }
+CONNECT-TIMEOUT { return CONNECT_TIMEOUT; }
+CORK { return _CORK; }
+DISTRIBUTION { return DISTRIBUTION; }
+HASH { return HASH; }
+HASH_WITH_PREFIX_KEY { return HASH_WITH_PREFIX_KEY; }
+HASH-WITH-PREFIX_KEY { return HASH_WITH_PREFIX_KEY; }
+IO_BYTES_WATERMARK { return IO_BYTES_WATERMARK; }
+IO-BYTES-WATERMARK { return IO_BYTES_WATERMARK; }
+IO_KEY_PREFETCH { return IO_KEY_PREFETCH; }
+IO-KEY-PREFETCH { return IO_KEY_PREFETCH; }
+IO_MSG_WATERMARK { return IO_MSG_WATERMARK; }
+IO-MSG-WATERMARK { return IO_MSG_WATERMARK; }
+KETAMA { return KETAMA; }
+KETAMA_HASH { return KETAMA_HASH; }
+KETAMA-HASH { return KETAMA_HASH; }
+KETAMA_WEIGHTED { return KETAMA_WEIGHTED; }
+KETAMA-WEIGHTED { return KETAMA_WEIGHTED; }
+NOREPLY { return NOREPLY; }
+NUMBER_OF_REPLICAS { return NUMBER_OF_REPLICAS; }
+NUMBER-OF-REPLICAS { return NUMBER_OF_REPLICAS; }
+POLL_TIMEOUT { return POLL_TIMEOUT; }
+POLL-TIMEOUT { return POLL_TIMEOUT; }
+RANDOMIZE_REPLICA_READ { return RANDOMIZE_REPLICA_READ; }
+RANDOMIZE-REPLICA-READ { return RANDOMIZE_REPLICA_READ; }
+RCV_TIMEOUT { return RCV_TIMEOUT; }
+RCV-TIMEOUT { return RCV_TIMEOUT; }
+RETRY_TIMEOUT { return RETRY_TIMEOUT; }
+RETRY-TIMEOUT { return RETRY_TIMEOUT; }
+SERVER_FAILURE_LIMIT { return SERVER_FAILURE_LIMIT; }
+SERVER-FAILURE-LIMIT { return SERVER_FAILURE_LIMIT; }
+SND_TIMEOUT { return SND_TIMEOUT; }
+SND-TIMEOUT { return SND_TIMEOUT; }
+SOCKET_RECV_SIZE { return SOCKET_RECV_SIZE; }
+SOCKET-RECV-SIZE { return SOCKET_RECV_SIZE; }
+SOCKET_SEND_SIZE { return SOCKET_SEND_SIZE; }
+SOCKET-SEND-SIZE { return SOCKET_SEND_SIZE; }
+SORT_HOSTS { return SORT_HOSTS; }
+SORT-HOSTS { return SORT_HOSTS; }
+SUPPORT_CAS { return SUPPORT_CAS; }
+SUPPORT-CAS { return SUPPORT_CAS; }
+TCP_NODELAY { return _TCP_NODELAY; }
+TCP-NODELAY { return _TCP_NODELAY; }
+TCP_KEEPALIVE { return _TCP_KEEPALIVE; }
+TCP-KEEPALIVE { return _TCP_KEEPALIVE; }
+TCP_KEEPIDLE { return _TCP_KEEPIDLE; }
+TCP-KEEPIDLE { return _TCP_KEEPIDLE; }
+USER_DATA { return USER_DATA; }
+USER-DATA { return USER_DATA; }
+USE_UDP { return USE_UDP; }
+USE-UDP { return USE_UDP; }
+
+PREFIX-KEY { return PREFIX_KEY; }
+PREFIX_KEY { return PREFIX_KEY; }
+
+CONSISTENT { return CONSISTENT; }
+MODULA { return MODULA; }
+RANDOM { return RANDOM; }
+
+MD5 { return MD5; }
+CRC { return CRC; }
+FNV1_64 { return FNV1_64; }
+FNV1A_64 { return FNV1A_64; }
+FNV1_32 { return FNV1_32; }
+FNV1A_32 { return FNV1A_32; }
+HSIEH { return HSIEH; }
+MURMUR { return MURMUR; }
+JENKINS { return JENKINS; }
[[:alnum:]][[:alnum:].]*[[:alpha:]]: {
yylval->string.c_str = yytext;
yylval->string.length = yyleng;
- return SERVER_WITH_PORT;
+ return HOSTNAME_WITH_PORT;
}
-[[:alnum:]][[:alnum:].]*[[:alpha:]] {
+[[:alnum:]]+"."[[:alpha:].]+ {
yylval->string.c_str = yytext;
yylval->string.length = yyleng;
- return IDENTIFIER;
+ return HOSTNAME;
}
+
[[:digit:]]{1,3}"."[[:digit:]]{1,3}"."[[:digit:]]{1,3}"."[[:digit:]]{1,3}: {
yylval->string.c_str = yytext;
yylval->string.length = yyleng;
return IPADDRESS;
}
-. {
- std::cerr << "Near " << yytext << std::endl;
+[[:alnum:]]+ {
+ yylval->string.c_str = yytext;
+ yylval->string.length = yyleng;
+ return STRING;
+ }
+
+\"[[:alnum:]]*\" {
+ yylval->string.c_str = yytext;
+ yylval->string.length = yyleng;
+ return QUOTED_STRING;
+ }
+
+. {
return UNKNOWN;
}