[Groonga-commit] groonga/groonga at c3520a0 [master] grn_ts: add grn_ts_expr_parser_analyze_token()

Back to archive index

susumu.yata null+****@clear*****
Thu Sep 17 17:19:44 JST 2015


susumu.yata	2015-09-17 17:19:44 +0900 (Thu, 17 Sep 2015)

  New Revision: c3520a050cff7dd721bb39d0f1ab22ecdb71a4f7
  https://github.com/groonga/groonga/commit/c3520a050cff7dd721bb39d0f1ab22ecdb71a4f7

  Message:
    grn_ts: add grn_ts_expr_parser_analyze_token()
    
    GitHub: #400

  Modified files:
    lib/ts.c

  Modified: lib/ts.c (+71 -69)
===================================================================
--- lib/ts.c    2015-09-17 17:14:05 +0900 (439f7d4)
+++ lib/ts.c    2015-09-17 17:19:44 +0900 (c10c336)
@@ -4475,86 +4475,88 @@ grn_ts_expr_parser_tokenize(grn_ctx *ctx, grn_ts_expr_parser *parser,
   return GRN_SUCCESS;
 }
 
-/* grn_ts_expr_parser_analyze() analyzes tokens. */
+/* grn_ts_expr_parser_analyze_token() analyzes a token. */
 static grn_rc
-grn_ts_expr_parser_analyze(grn_ctx *ctx, grn_ts_expr_parser *parser) {
-  // TODO: Analyze as an expression of Infix Notation!
-  size_t i;
-  for (i = 1; i < (parser->n_tokens - 1); i++) {
-    grn_rc rc;
-    grn_ts_expr_token *token = parser->tokens[i];
-    switch (token->type) {
-      case GRN_TS_EXPR_CONST_TOKEN: {
-        grn_ts_expr_const_token *const_token;
-        const_token = (grn_ts_expr_const_token *)token;
-        switch (const_token->data_kind) {
-          case GRN_TS_BOOL: {
-            rc = grn_ts_expr_push_bool(ctx, parser->expr,
+grn_ts_expr_parser_analyze_token(grn_ctx *ctx, grn_ts_expr_parser *parser,
+                                 grn_ts_expr_token *token) {
+  switch (token->type) {
+    case GRN_TS_EXPR_START_TOKEN:
+    case GRN_TS_EXPR_END_TOKEN: {
+      return GRN_SUCCESS;
+    }
+    case GRN_TS_EXPR_CONST_TOKEN: {
+      grn_ts_expr_const_token *const_token;
+      const_token = (grn_ts_expr_const_token *)token;
+      switch (const_token->data_kind) {
+        case GRN_TS_BOOL: {
+          return grn_ts_expr_push_bool(ctx, parser->expr,
                                        const_token->content.as_bool);
-            break;
-          }
-          case GRN_TS_INT: {
-            rc = grn_ts_expr_push_int(ctx, parser->expr,
+        }
+        case GRN_TS_INT: {
+          return grn_ts_expr_push_int(ctx, parser->expr,
                                       const_token->content.as_int);
-            break;
-          }
-          case GRN_TS_FLOAT: {
-            rc = grn_ts_expr_push_float(ctx, parser->expr,
+        }
+        case GRN_TS_FLOAT: {
+          return grn_ts_expr_push_float(ctx, parser->expr,
                                         const_token->content.as_float);
-            break;
-          }
-          case GRN_TS_TEXT: {
-            rc = grn_ts_expr_push_text(ctx, parser->expr,
+        }
+        case GRN_TS_TEXT: {
+          return grn_ts_expr_push_text(ctx, parser->expr,
                                        const_token->content.as_text);
-            break;
-          }
-          default: {
-            rc = GRN_OBJECT_CORRUPT;
-            break;
-          }
         }
-        break;
+        default: {
+          return GRN_OBJECT_CORRUPT;
+        }
       }
-      case GRN_TS_EXPR_NAME_TOKEN: {
-        grn_ts_expr_name_token *name_token = (grn_ts_expr_name_token *)token;
-        grn_ts_str name = name_token->src;
-        if ((name.size == GRN_COLUMN_NAME_ID_LEN) &&
-            !memcmp(name.ptr, GRN_COLUMN_NAME_ID, GRN_COLUMN_NAME_ID_LEN)) {
-          rc = grn_ts_expr_push_id(ctx, parser->expr);
-        } else if ((name.size == GRN_COLUMN_NAME_KEY_LEN) &&
-                   !memcmp(name.ptr, GRN_COLUMN_NAME_KEY,
-                           GRN_COLUMN_NAME_KEY_LEN)) {
-          rc = grn_ts_expr_push_key(ctx, parser->expr);
-        } else if ((name.size == GRN_COLUMN_NAME_VALUE_LEN) &&
-                   !memcmp(name.ptr, GRN_COLUMN_NAME_VALUE,
-                           GRN_COLUMN_NAME_VALUE_LEN)) {
-          rc = grn_ts_expr_push_value(ctx, parser->expr);
-        } else if ((name.size == GRN_COLUMN_NAME_SCORE_LEN) &&
-                   !memcmp(name.ptr, GRN_COLUMN_NAME_SCORE,
-                           GRN_COLUMN_NAME_SCORE_LEN)) {
-          rc = grn_ts_expr_push_score(ctx, parser->expr);
+    }
+    case GRN_TS_EXPR_NAME_TOKEN: {
+      grn_ts_expr_name_token *name_token = (grn_ts_expr_name_token *)token;
+      grn_ts_str name = name_token->src;
+      if ((name.size == GRN_COLUMN_NAME_ID_LEN) &&
+          !memcmp(name.ptr, GRN_COLUMN_NAME_ID, GRN_COLUMN_NAME_ID_LEN)) {
+        return grn_ts_expr_push_id(ctx, parser->expr);
+      } else if ((name.size == GRN_COLUMN_NAME_KEY_LEN) &&
+                 !memcmp(name.ptr, GRN_COLUMN_NAME_KEY,
+                         GRN_COLUMN_NAME_KEY_LEN)) {
+        return grn_ts_expr_push_key(ctx, parser->expr);
+      } else if ((name.size == GRN_COLUMN_NAME_VALUE_LEN) &&
+                 !memcmp(name.ptr, GRN_COLUMN_NAME_VALUE,
+                         GRN_COLUMN_NAME_VALUE_LEN)) {
+        return grn_ts_expr_push_value(ctx, parser->expr);
+      } else if ((name.size == GRN_COLUMN_NAME_SCORE_LEN) &&
+                 !memcmp(name.ptr, GRN_COLUMN_NAME_SCORE,
+                         GRN_COLUMN_NAME_SCORE_LEN)) {
+        return grn_ts_expr_push_score(ctx, parser->expr);
+      } else {
+        grn_obj *column = grn_obj_column(ctx, parser->expr->curr_table,
+                                         name.ptr, name.size);
+        if (!column) {
+          return GRN_INVALID_ARGUMENT;
         } else {
-          grn_obj *column = grn_obj_column(ctx, parser->expr->curr_table,
-                                           name.ptr, name.size);
-          if (!column) {
-            rc = GRN_INVALID_ARGUMENT;
-          } else {
-            rc = grn_ts_expr_push_column(ctx, parser->expr, column);
-            grn_obj_unlink(ctx, column);
-          }
+          grn_rc rc = grn_ts_expr_push_column(ctx, parser->expr, column);
+          grn_obj_unlink(ctx, column);
+          return rc;
         }
-        break;
-      }
-      case GRN_TS_EXPR_OP_TOKEN: {
-        grn_ts_expr_op_token *op_token = (grn_ts_expr_op_token *)token;
-        rc = grn_ts_expr_push_operator(ctx, parser->expr, op_token->op_type);
-        break;
-      }
-      default: {
-        rc = GRN_INVALID_ARGUMENT;
-        break;
       }
     }
+    case GRN_TS_EXPR_OP_TOKEN: {
+      grn_ts_expr_op_token *op_token = (grn_ts_expr_op_token *)token;
+      return grn_ts_expr_push_operator(ctx, parser->expr, op_token->op_type);
+    }
+    default: {
+      return GRN_INVALID_ARGUMENT;
+    }
+  }
+}
+
+/* grn_ts_expr_parser_analyze() analyzes tokens. */
+static grn_rc
+grn_ts_expr_parser_analyze(grn_ctx *ctx, grn_ts_expr_parser *parser) {
+  /* Copy the number of tokens because new tokens will be added. */
+  size_t i, n_tokens = parser->n_tokens;
+  for (i = 0; i < n_tokens; i++) {
+    grn_rc rc;
+    rc = grn_ts_expr_parser_analyze_token(ctx, parser, parser->tokens[i]);
     if (rc != GRN_SUCCESS) {
       return rc;
     }
-------------- next part --------------
HTML����������������������������...
Download 



More information about the Groonga-commit mailing list
Back to archive index