mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-30 18:36:12 +01:00 
			
		
		
		
	 3f1a256234
			
		
	
	
	3f1a256234
	
	
	
		
			
			The cmake configuration step is single-threaded and already consuming
too much time. We should not make it worse by adding invocations like
MY_CHECK_CXX_COMPILER_FLAG().
Let us prefer something that works on any supported version
of GCC (4.8.5 or later) or clang, as well as recent versions
of the Intel C compiler.
This replaces commit 1fde785315
		
	
			
		
			
				
	
	
		
			293 lines
		
	
	
	
		
			5.8 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			293 lines
		
	
	
	
		
			5.8 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| /*****************************************************************************
 | |
| 
 | |
| Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved.
 | |
| 
 | |
| This program is free software; you can redistribute it and/or modify it under
 | |
| the terms of the GNU General Public License as published by the Free Software
 | |
| Foundation; version 2 of the License.
 | |
| 
 | |
| 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 General Public License for more details.
 | |
| 
 | |
| You should have received a copy of the GNU General Public License along with
 | |
| this program; if not, write to the Free Software Foundation, Inc.,
 | |
| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA
 | |
| 
 | |
| *****************************************************************************/
 | |
| 
 | |
| /**
 | |
|  * @file fts/fts0pars.y
 | |
|  * FTS parser: input file for the GNU Bison parser generator
 | |
|  *
 | |
|  * Created 2007/5/9 Sunny Bains
 | |
|  */
 | |
| 
 | |
| %{
 | |
| #include "ha_prototypes.h"
 | |
| #include "mem0mem.h"
 | |
| #include "fts0ast.h"
 | |
| #include "fts0blex.h"
 | |
| #include "fts0tlex.h"
 | |
| #include "fts0pars.h"
 | |
| #include <my_sys.h>
 | |
| extern	int fts_lexer(YYSTYPE*, fts_lexer_t*);
 | |
| extern	int fts_blexer(YYSTYPE*, yyscan_t);
 | |
| extern	int fts_tlexer(YYSTYPE*, yyscan_t);
 | |
| #ifdef __GNUC__
 | |
| # pragma GCC diagnostic ignored "-Wpragmas"
 | |
| # pragma GCC diagnostic ignored "-Wunknown-warning-option"
 | |
| # pragma GCC diagnostic ignored "-Wunused-but-set-variable"
 | |
| #endif
 | |
| extern int ftserror(const char* p);
 | |
| /* Required for reentrant parser */
 | |
| #define ftslex	fts_lexer
 | |
| 
 | |
| #define YYERROR_VERBOSE
 | |
| 
 | |
| /* For passing an argument to yyparse() */
 | |
| #define YYPARSE_PARAM state
 | |
| #define YYLEX_PARAM ((fts_ast_state_t*) state)->lexer
 | |
| 
 | |
| 
 | |
| typedef	int	(*fts_scanner)(YYSTYPE* val, yyscan_t yyscanner);
 | |
| 
 | |
| struct fts_lexer_struct {
 | |
| 	fts_scanner	scanner;
 | |
| 	void*		yyscanner;
 | |
| };
 | |
| 
 | |
| %}
 | |
| 
 | |
| %union {
 | |
| 	int			oper;
 | |
| 	fts_ast_string_t*	token;
 | |
| 	fts_ast_node_t*		node;
 | |
| };
 | |
| 
 | |
| /* Enable re-entrant parser */
 | |
| %pure_parser
 | |
| 
 | |
| %token<oper>	FTS_OPER
 | |
| %token<token>	FTS_TEXT FTS_TERM FTS_NUMB
 | |
| 
 | |
| %type<node>	prefix term text expr sub_expr expr_lst query
 | |
| 
 | |
| %nonassoc	'+' '-' '~' '<' '>'
 | |
| 
 | |
| %%
 | |
| 
 | |
| query	: expr_lst	{
 | |
| 		$$ = $1;
 | |
| 		((fts_ast_state_t*) state)->root = $$;
 | |
| 	}
 | |
| 	;
 | |
| 
 | |
| expr_lst: /* Empty */	{
 | |
| 		$$ = NULL;
 | |
| 	}
 | |
| 
 | |
| 	| expr_lst expr	{
 | |
| 		$$ = $1;
 | |
| 
 | |
| 		if (!$$) {
 | |
| 			$$ = fts_ast_create_node_list(state, $2);
 | |
| 		} else {
 | |
| 			fts_ast_add_node($$, $2);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	| expr_lst sub_expr		{
 | |
| 		$$ = $1;
 | |
| 		$$ = fts_ast_create_node_list(state, $1);
 | |
| 
 | |
| 		if (!$$) {
 | |
| 			$$ = $2;
 | |
| 		} else {
 | |
| 			fts_ast_add_node($$, $2);
 | |
| 		}
 | |
| 	}
 | |
| 	;
 | |
| 
 | |
| sub_expr: '(' expr_lst ')'		{
 | |
| 		$$ = $2;
 | |
| 
 | |
| 		if ($$) {
 | |
| 			$$ = fts_ast_create_node_subexp_list(state, $$);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	| prefix '(' expr_lst ')'	{
 | |
| 		$$ = fts_ast_create_node_list(state, $1);
 | |
| 
 | |
| 		if ($3) {
 | |
| 			fts_ast_add_node($$,
 | |
| 				fts_ast_create_node_subexp_list(state, $3));
 | |
| 		}
 | |
| 	}
 | |
| 	;
 | |
| 
 | |
| expr	: term		{
 | |
| 		$$ = $1;
 | |
| 	}
 | |
| 
 | |
| 	| text		{
 | |
| 		$$ = $1;
 | |
| 	}
 | |
| 
 | |
| 	| term '*' {
 | |
| 		fts_ast_term_set_wildcard($1);
 | |
| 	}
 | |
| 
 | |
| 	| text '@' FTS_NUMB {
 | |
| 		fts_ast_text_set_distance($1, fts_ast_string_to_ul($3, 10));
 | |
| 		fts_ast_string_free($3);
 | |
| 	}
 | |
| 
 | |
| 	| prefix term '*' {
 | |
| 		$$ = fts_ast_create_node_list(state, $1);
 | |
| 		fts_ast_add_node($$, $2);
 | |
| 		fts_ast_term_set_wildcard($2);
 | |
| 	}
 | |
| 
 | |
| 	| prefix term	{
 | |
| 		$$ = fts_ast_create_node_list(state, $1);
 | |
| 		fts_ast_add_node($$, $2);
 | |
| 	}
 | |
| 
 | |
| 	| prefix text '@' FTS_NUMB {
 | |
| 		$$ = fts_ast_create_node_list(state, $1);
 | |
| 		fts_ast_add_node($$, $2);
 | |
| 		fts_ast_text_set_distance($2, fts_ast_string_to_ul($4, 10));
 | |
| 		fts_ast_string_free($4);
 | |
| 	}
 | |
| 
 | |
| 	| prefix text {
 | |
| 		$$ = fts_ast_create_node_list(state, $1);
 | |
| 		fts_ast_add_node($$, $2);
 | |
| 	}
 | |
| 	;
 | |
| 
 | |
| prefix	: '-'		{
 | |
| 		$$ = fts_ast_create_node_oper(state, FTS_IGNORE);
 | |
| 	}
 | |
| 
 | |
| 	| '+'		{
 | |
| 		$$ = fts_ast_create_node_oper(state, FTS_EXIST);
 | |
| 	}
 | |
| 
 | |
| 	| '~'		{
 | |
| 		$$ = fts_ast_create_node_oper(state, FTS_NEGATE);
 | |
| 	}
 | |
| 
 | |
| 	| '<'		{
 | |
| 		$$ = fts_ast_create_node_oper(state, FTS_DECR_RATING);
 | |
| 	}
 | |
| 
 | |
| 	| '>'		{
 | |
| 		$$ = fts_ast_create_node_oper(state, FTS_INCR_RATING);
 | |
| 	}
 | |
| 	;
 | |
| 
 | |
| term	: FTS_TERM	{
 | |
| 		$$  = fts_ast_create_node_term(state, $1);
 | |
| 		fts_ast_string_free($1);
 | |
| 	}
 | |
| 
 | |
| 	| FTS_NUMB	{
 | |
| 		$$  = fts_ast_create_node_term(state, $1);
 | |
| 		fts_ast_string_free($1);
 | |
| 	}
 | |
| 
 | |
| 	/* Ignore leading '*' */
 | |
| 	| '*' term {
 | |
| 		$$  = $2;
 | |
| 	}
 | |
| 	;
 | |
| 
 | |
| text	: FTS_TEXT	{
 | |
| 		$$  = fts_ast_create_node_text(state, $1);
 | |
| 		fts_ast_string_free($1);
 | |
| 	}
 | |
| 	;
 | |
| %%
 | |
| 
 | |
| /********************************************************************
 | |
| */
 | |
| int
 | |
| ftserror(
 | |
| /*=====*/
 | |
| 	const char*	p)
 | |
| {
 | |
| 	fprintf(stderr, "%s\n", p);
 | |
| 	return(0);
 | |
| }
 | |
| 
 | |
| /********************************************************************
 | |
| Create a fts_lexer_t instance.*/
 | |
| fts_lexer_t*
 | |
| fts_lexer_create(
 | |
| /*=============*/
 | |
| 	ibool		boolean_mode,
 | |
| 	const byte*	query,
 | |
| 	ulint		query_len)
 | |
| {
 | |
| 	fts_lexer_t*	fts_lexer = static_cast<fts_lexer_t*>(
 | |
| 		ut_malloc_nokey(sizeof(fts_lexer_t)));
 | |
| 
 | |
| 	if (boolean_mode) {
 | |
| 		fts0blex_init(&fts_lexer->yyscanner);
 | |
| 		fts0b_scan_bytes((char*) query, (int) query_len, fts_lexer->yyscanner);
 | |
| 		fts_lexer->scanner = fts_blexer;
 | |
| 		/* FIXME: Debugging */
 | |
| 		/* fts0bset_debug(1 , fts_lexer->yyscanner); */
 | |
| 	} else {
 | |
| 		fts0tlex_init(&fts_lexer->yyscanner);
 | |
| 		fts0t_scan_bytes((char*) query, (int) query_len, fts_lexer->yyscanner);
 | |
| 		fts_lexer->scanner = fts_tlexer;
 | |
| 	}
 | |
| 
 | |
| 	return(fts_lexer);
 | |
| }
 | |
| 
 | |
| /********************************************************************
 | |
| Free an fts_lexer_t instance.*/
 | |
| void
 | |
| 
 | |
| fts_lexer_free(
 | |
| /*===========*/
 | |
| 	fts_lexer_t*	fts_lexer)
 | |
| {
 | |
| 	if (fts_lexer->scanner == fts_blexer) {
 | |
| 		fts0blex_destroy(fts_lexer->yyscanner);
 | |
| 	} else {
 | |
| 		fts0tlex_destroy(fts_lexer->yyscanner);
 | |
| 	}
 | |
| 
 | |
| 	ut_free(fts_lexer);
 | |
| }
 | |
| 
 | |
| /********************************************************************
 | |
| Call the appropaiate scanner.*/
 | |
| int
 | |
| fts_lexer(
 | |
| /*======*/
 | |
| 	YYSTYPE*	val,
 | |
| 	fts_lexer_t*	fts_lexer)
 | |
| {
 | |
| 	fts_scanner func_ptr;
 | |
| 
 | |
| 	func_ptr = fts_lexer->scanner;
 | |
| 
 | |
| 	return(func_ptr(val, fts_lexer->yyscanner));
 | |
| }
 | |
| 
 | |
| /********************************************************************
 | |
| Parse the query.*/
 | |
| int
 | |
| fts_parse(
 | |
| /*======*/
 | |
| 	fts_ast_state_t*	state)
 | |
| {
 | |
| 	return(ftsparse(state));
 | |
| }
 |