1/* -*- c-basic-offset: 2 -*- */
2/*
3 Copyright(C) 2015-2016 Brazil
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License version 2.1 as published by the Free Software Foundation.
8
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Lesser General Public License for more details.
13
14 You should have received a copy of the GNU Lesser General Public
15 License along with this library; if not, write to the Free Software
16 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17*/
18
19#pragma once
20
21#include "ts_expr.h"
22#include "ts_expr_builder.h"
23#include "ts_str.h"
24#include "ts_types.h"
25
26#ifdef __cplusplus
27extern "C" {
28#endif
29
30typedef enum {
31 GRN_TS_EXPR_DUMMY_TOKEN, /* No extra data. */
32 GRN_TS_EXPR_START_TOKEN, /* No extra data. */
33 GRN_TS_EXPR_END_TOKEN, /* No extra data. */
34 GRN_TS_EXPR_CONST_TOKEN, /* +data_kind, content and buf. */
35 GRN_TS_EXPR_NAME_TOKEN, /* +name. */
36 GRN_TS_EXPR_OP_TOKEN, /* +op_type. */
37 GRN_TS_EXPR_BRIDGE_TOKEN, /* No extra data. */
38 GRN_TS_EXPR_BRACKET_TOKEN /* No extra data. */
39} grn_ts_expr_token_type;
40
41#define GRN_TS_EXPR_TOKEN_COMMON_MEMBERS\
42 grn_ts_str src; /* Source string. */\
43 grn_ts_expr_token_type type; /* Token type. */
44
45typedef struct {
46 GRN_TS_EXPR_TOKEN_COMMON_MEMBERS
47} grn_ts_expr_token;
48
49typedef grn_ts_expr_token grn_ts_expr_dummy_token;
50typedef grn_ts_expr_token grn_ts_expr_start_token;
51typedef grn_ts_expr_token grn_ts_expr_end_token;
52
53typedef struct {
54 GRN_TS_EXPR_TOKEN_COMMON_MEMBERS
55 grn_ts_data_kind data_kind; /* The data kind of the const. */
56 grn_ts_any content; /* The const. */
57 grn_ts_buf buf; /* Buffer for content.as_text. */
58} grn_ts_expr_const_token;
59
60typedef grn_ts_expr_token grn_ts_expr_name_token;
61
62typedef struct {
63 GRN_TS_EXPR_TOKEN_COMMON_MEMBERS
64 grn_ts_op_type op_type; /* Operator type. */
65} grn_ts_expr_op_token;
66
67typedef grn_ts_expr_token grn_ts_expr_bridge_token;
68typedef grn_ts_expr_token grn_ts_expr_bracket_token;
69
70typedef struct {
71 grn_ts_expr_builder *builder; /* Builder. */
72 grn_ts_buf str_buf; /* Buffer for a source string. */
73 grn_ts_expr_token **tokens; /* Tokens. */
74 size_t n_tokens; /* Number of tokens. */
75 size_t max_n_tokens; /* Maximum number of tokens. */
76 grn_ts_expr_dummy_token *dummy_tokens; /* Dummy tokens. */
77 size_t n_dummy_tokens; /* Number of dummy tokens. */
78 size_t max_n_dummy_tokens; /* Maximum number of dummy tokens. */
79 grn_ts_expr_token **stack; /* Token stack. */
80 size_t stack_depth; /* Token stack's current depth. */
81 size_t stack_size; /* Token stack's capacity. */
82} grn_ts_expr_parser;
83
84/* grn_ts_expr_parser_open() creates a parser. */
85grn_rc grn_ts_expr_parser_open(grn_ctx *ctx, grn_obj *table,
86 grn_ts_expr_parser **parser);
87
88/* grn_ts_expr_parser_close() destroys a parser. */
89grn_rc grn_ts_expr_parser_close(grn_ctx *ctx, grn_ts_expr_parser *parser);
90
91/* grn_ts_expr_parser_parse() parses a string and creates an expression. */
92grn_rc grn_ts_expr_parser_parse(grn_ctx *ctx, grn_ts_expr_parser *parser,
93 grn_ts_str str, grn_ts_expr **expr);
94
95/*
96 * grn_ts_expr_parser_split() splits comma-separated strings into the first
97 * expression and the rest.
98 * Note that if `str` is empty, this function returns GRN_END_OF_DATA.
99 */
100grn_rc grn_ts_expr_parser_split(grn_ctx *ctx, grn_ts_expr_parser *parser,
101 grn_ts_str str, grn_ts_str *first,
102 grn_ts_str *rest);
103
104#ifdef __cplusplus
105}
106#endif
107
108