susumu.yata
null+****@clear*****
Sun Oct 11 19:09:00 JST 2015
susumu.yata 2015-10-11 19:09:00 +0900 (Sun, 11 Oct 2015) New Revision: 50379f176c457af5914961b3232cbf882359571c https://github.com/groonga/groonga/commit/50379f176c457af5914961b3232cbf882359571c Message: grn_ts: support parsing shift operators "<<", ">>", "<<<" and ">>>" GitHub: #416 Modified files: lib/ts.c Modified: lib/ts.c (+32 -10) =================================================================== --- lib/ts.c 2015-10-11 18:47:44 +0900 (da1f2ee) +++ lib/ts.c 2015-10-11 19:09:00 +0900 (cc96003) @@ -5618,30 +5618,52 @@ grn_ts_expr_parser_tokenize_op(grn_ctx *ctx, grn_ts_expr_parser *parser, case '+': case '-': { return grn_ts_expr_parser_tokenize_sign(ctx, parser, str, token); } -#define GRN_TS_EXPR_PARSER_TOKENIZE_OP_CASE(label, TYPE, EQUAL_TYPE)\ + case '!': { + if ((str.size >= 2) && (str.ptr[1] == '=')) { + token_str.size = 2; + op_type = GRN_TS_OP_NOT_EQUAL; + } else { + token_str.size = 1; + op_type = GRN_TS_OP_LOGICAL_NOT; + } + rc = grn_ts_expr_op_token_open(ctx, token_str, op_type, &new_token); + break; + } +#define GRN_TS_EXPR_PARSER_TOKENIZE_OP_CASE(label, TYPE_1, TYPE_2, TYPE_3,\ + TYPE_EQUAL)\ case label: {\ if ((str.size >= 2) && (str.ptr[1] == '=')) {\ token_str.size = 2;\ - op_type = GRN_TS_OP_ ## EQUAL_TYPE;\ + op_type = GRN_TS_OP_ ## TYPE_EQUAL;\ + } else if ((str.size >= 2) && (str.ptr[1] == label)) {\ + if ((str.size >= 3) && (str.ptr[2] == label)) {\ + token_str.size = 3;\ + op_type = GRN_TS_OP_ ## TYPE_3;\ + } else {\ + token_str.size = 2;\ + op_type = GRN_TS_OP_ ## TYPE_2;\ + }\ } else {\ token_str.size = 1;\ - op_type = GRN_TS_OP_ ## TYPE;\ + op_type = GRN_TS_OP_ ## TYPE_1;\ }\ rc = grn_ts_expr_op_token_open(ctx, token_str, op_type, &new_token);\ break;\ } - GRN_TS_EXPR_PARSER_TOKENIZE_OP_CASE('!', LOGICAL_NOT, NOT_EQUAL) - GRN_TS_EXPR_PARSER_TOKENIZE_OP_CASE('<', LESS, LESS_EQUAL) - GRN_TS_EXPR_PARSER_TOKENIZE_OP_CASE('>', GREATER, GREATER_EQUAL) +/* GRN_TS_EXPR_PARSER_TOKENIZE_OP_CASE('!', LOGICAL_NOT, NOT_EQUAL)*/ + GRN_TS_EXPR_PARSER_TOKENIZE_OP_CASE('<', LESS, SHIFT_ARITHMETIC_LEFT, + SHIFT_LOGICAL_LEFT, LESS_EQUAL) + GRN_TS_EXPR_PARSER_TOKENIZE_OP_CASE('>', GREATER, SHIFT_ARITHMETIC_RIGHT, + SHIFT_LOGICAL_RIGHT, GREATER_EQUAL) #undef GRN_TS_EXPR_PARSER_TOKENIZE_OP_CASE -#define GRN_TS_EXPR_PARSER_TOKENIZE_OP_CASE(label, TYPE, DOUBLE_TYPE)\ +#define GRN_TS_EXPR_PARSER_TOKENIZE_OP_CASE(label, TYPE_1, TYPE_2)\ case label: {\ - if ((str.size >= 2) && (str.ptr[1] == str.ptr[0])) {\ + if ((str.size >= 2) && (str.ptr[1] == label)) {\ token_str.size = 2;\ - op_type = GRN_TS_OP_ ## DOUBLE_TYPE;\ + op_type = GRN_TS_OP_ ## TYPE_2;\ } else {\ token_str.size = 1;\ - op_type = GRN_TS_OP_ ## TYPE;\ + op_type = GRN_TS_OP_ ## TYPE_1;\ }\ rc = grn_ts_expr_op_token_open(ctx, token_str, op_type, &new_token);\ break;\ -------------- next part -------------- HTML����������������������������...Download