Improved on the error messages in the parser.
[awesomized/libmemcached] / libmemcached / options / parser.yy
index 8cd16d538f287cfb2d2518ad01faef065e50d1c8..7c94f987aa09fe45fcf873c35e5c03b740bb31fa 100644 (file)
  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+%error-verbose
+%debug
+%defines
+%expect 0
+%output "libmemcached/options/parser.cc"
+%defines "libmemcached/options/parser.h"
+%lex-param { yyscan_t *scanner }
+%name-prefix="libmemcached_"
+%parse-param { Context *parser }
+%parse-param { yyscan_t *scanner }
+%locations
+%pure-parser
+%require "2.2"
+%start statement
+%verbose
+
 %{
 
+#include <config.h>
+
 #include <stdint.h>
 #include <iostream>
+#include <sstream>
+#include <string>
 
-#include <libmemcached/options/type.h>
+#include <libmemcached/options/context.h>
 #include <libmemcached/options/string.h>
 #include <libmemcached/options/symbol.h>
 
 #pragma GCC diagnostic ignored "-Wold-style-cast"
 #include <libmemcached/options/scanner.h>
 
-inline void libmemcached_error(YYLTYPE *locp, type_st *parser, yyscan_t *scanner, const char *str)
+int libmemcached_lex(YYSTYPE* lvalp, YYLTYPE* llocp, void* scanner);
+
+inline void libmemcached_error(YYLTYPE *locp, Context *context, yyscan_t *scanner, const char *error)
 {
   memcached_string_t local_string;
-  local_string.size= strlen(str);
-  local_string.c_str= str;
-  memcached_set_error(parser->memc, MEMCACHED_FAILURE, &local_string);
+  std::cerr << " Error " << error << std::endl;
+  local_string.size= strlen(context->begin);
+  local_string.c_str= context->begin;
+  memcached_set_error(context->memc, MEMCACHED_PARSE_ERROR, &local_string);
 }
 
-
 %}
 
-%error-verbose
-%debug
-%defines
-%expect 0
-%output "libmemcached/options/parser.cc"
-%defines "libmemcached/options/parser.h"
-%lex-param { yyscan_t *scanner }
-%name-prefix="libmemcached_"
-%parse-param { type_st *parser }
-%parse-param { yyscan_t *scanner }
-%locations
-%pure-parser
-%require "2.2"
-%start statement
-%verbose
-
+%token COMMENT
+%token CONFIGURE_FILE
+%token EMPTY_LINE
 %token SERVER
 %token SERVERS
 %token UNKNOWN
@@ -143,44 +152,95 @@ statement:
           { }
         | statement ' ' DASH_OPTION expression
           { }
+        | COMMENT
+          { }
+        | EMPTY_LINE
+          { }
         ;
 
 
 expression:
           SERVER '=' server
           { 
-            (void) memcached_server_add_parsed(parser->memc, $3.c_str, $3.length, $3.port, 0);
+            if (memcached_server_add_parsed(parser->memc, $3.c_str, $3.length, $3.port, 0) != MEMCACHED_SUCCESS)
+              YYERROR;
           }
         | SERVERS '=' server_list
           {
           }
+        | CONFIGURE_FILE '=' string
+          {
+            memcached_set_configuration_file(parser->memc, $3.c_str, $3.length);
+          }
         | behaviors
         ;
 
 behaviors:
           PREFIX_KEY '=' string
           {
-            memcached_callback_set(parser->memc, MEMCACHED_CALLBACK_PREFIX_KEY, std::string($3.c_str, $3.length).c_str());
+            memcached_return_t rc;
+            if ((rc= memcached_callback_set(parser->memc, MEMCACHED_CALLBACK_PREFIX_KEY, std::string($3.c_str, $3.length).c_str())) != MEMCACHED_SUCCESS)
+            {
+              std::stringstream ss;
+              ss << "--PREFIX-KEY" << $3;
+              memcached_set_error_string(parser->memc, rc, ss.str().c_str(), ss.str().length());
+              YYERROR;
+            }
           }
         | DISTRIBUTION '=' distribution
           {
-            memcached_behavior_set(parser->memc, MEMCACHED_BEHAVIOR_DISTRIBUTION, $3);
+            memcached_return_t rc;
+            if ((rc= memcached_behavior_set(parser->memc, MEMCACHED_BEHAVIOR_DISTRIBUTION, $3)) != MEMCACHED_SUCCESS)
+            {
+              std::stringstream ss;
+              ss << "--DISTRIBUTION=" << libmemcached_string_distribution($3);
+              memcached_set_error_string(parser->memc, rc, ss.str().c_str(), ss.str().length());
+              YYERROR;
+            }
           }
         | HASH '=' hash
           {
-            memcached_behavior_set(parser->memc, MEMCACHED_BEHAVIOR_DISTRIBUTION, $3);
+            memcached_return_t rc;
+            if ((rc= memcached_behavior_set(parser->memc, MEMCACHED_BEHAVIOR_HASH, $3)) != MEMCACHED_SUCCESS)
+            {
+              std::stringstream ss;
+              ss << "--HASH=" << libmemcached_string_hash($3);
+              memcached_set_error_string(parser->memc, rc, ss.str().c_str(), ss.str().length());
+              YYERROR; 
+            }
           }
         | KETAMA_HASH '=' hash
           {
-            memcached_behavior_set(parser->memc, MEMCACHED_BEHAVIOR_KETAMA_HASH, $3);
+            memcached_return_t rc;
+            if ((rc= memcached_behavior_set(parser->memc, MEMCACHED_BEHAVIOR_KETAMA_HASH, $3)) != MEMCACHED_SUCCESS)
+            {
+              std::stringstream ss;
+              ss << "--KETAMA-HASH=" << libmemcached_string_hash($3);
+              memcached_set_error_string(parser->memc, rc, ss.str().c_str(), ss.str().length());
+              YYERROR;
+            }
           }
         | behavior_number '=' NUMBER
           {
-            memcached_behavior_set(parser->memc, $1, $3);
+            memcached_return_t rc;
+            if ((rc= memcached_behavior_set(parser->memc, $1, $3)) != MEMCACHED_SUCCESS)
+            {
+              std::stringstream ss;
+              ss << "--" << libmemcached_string_behavior($1) << "=" << $3;
+              memcached_set_error_string(parser->memc, rc, ss.str().c_str(), ss.str().length());
+              YYERROR;
+            }
           }
         | behavior_boolean
           {
-            memcached_behavior_set(parser->memc, $1, true);
+            memcached_return_t rc;
+            if ((rc= memcached_behavior_set(parser->memc, $1, true)) != MEMCACHED_SUCCESS)
+            {
+              std::stringstream ss;
+              ss << "--" << libmemcached_string_behavior($1);
+              memcached_set_error_string(parser->memc, rc, ss.str().c_str(), ss.str().length());
+              YYERROR;
+            }
           }
         |  USER_DATA
           {
@@ -312,11 +372,25 @@ behavior_boolean:
 server_list:
            server
           {
-            (void) memcached_server_add_parsed(parser->memc, $1.c_str, $1.length, $1.port, 0);
+            memcached_return_t rc;
+            if ((rc= memcached_server_add_parsed(parser->memc, $1.c_str, $1.length, $1.port, 0)) != MEMCACHED_SUCCESS)
+            {
+              std::stringstream ss;
+              ss << "--SERVER=" << $1;
+              memcached_set_error_string(parser->memc, rc, ss.str().c_str(), ss.str().length());
+              YYERROR;
+            }
           }
         | server_list ',' server
           {
-            (void) memcached_server_add_parsed(parser->memc, $3.c_str, $3.length, $3.port, 0);
+            memcached_return_t rc;
+            if ((rc= memcached_server_add_parsed(parser->memc, $3.c_str, $3.length, $3.port, 0)) != MEMCACHED_SUCCESS)
+            {
+              std::stringstream ss;
+              ss << "--SERVERS=" << $3;
+              memcached_set_error_string(parser->memc, rc, ss.str().c_str(), ss.str().length());
+              YYERROR;
+            }
           }
         ;