mirror of https://gitee.com/bigwinds/arangodb
Merge branch 'aql2' of ssh://github.com/triAGENS/ArangoDB into aql2
This commit is contained in:
commit
00b9106dd3
|
@ -70,8 +70,15 @@ UnitTests/geo_suite
|
||||||
arangod/Ahuacatl/ahuacatl-grammar.c
|
arangod/Ahuacatl/ahuacatl-grammar.c
|
||||||
arangod/Ahuacatl/ahuacatl-grammar.cpp
|
arangod/Ahuacatl/ahuacatl-grammar.cpp
|
||||||
arangod/Ahuacatl/ahuacatl-grammar.h
|
arangod/Ahuacatl/ahuacatl-grammar.h
|
||||||
|
arangod/Ahuacatl/ahuacatl-grammar.hpp
|
||||||
arangod/Ahuacatl/ahuacatl-grammar.output
|
arangod/Ahuacatl/ahuacatl-grammar.output
|
||||||
arangod/Ahuacatl/ahuacatl-tokens.cpp
|
arangod/Ahuacatl/ahuacatl-tokens.cpp
|
||||||
|
arangod/Aql/grammar.c
|
||||||
|
arangod/Aql/grammar.cpp
|
||||||
|
arangod/Aql/grammar.h
|
||||||
|
arangod/Aql/grammar.hpp
|
||||||
|
arangod/Aql/grammar.output
|
||||||
|
arangod/Aql/tokens.cpp
|
||||||
bin/
|
bin/
|
||||||
etc/arangodb/*.conf
|
etc/arangodb/*.conf
|
||||||
js/common/bootstrap/errors.js
|
js/common/bootstrap/errors.js
|
||||||
|
|
|
@ -39,7 +39,16 @@ using namespace triagens::aql;
|
||||||
/// @brief create the parser
|
/// @brief create the parser
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
Parser::Parser () {
|
Parser::Parser (Query* query)
|
||||||
|
: _query(query),
|
||||||
|
_scanner(nullptr),
|
||||||
|
_buffer(query->queryString()),
|
||||||
|
_remainingLength(query->queryLength()),
|
||||||
|
_offset(0),
|
||||||
|
_marker(nullptr) {
|
||||||
|
|
||||||
|
//Aqlllex_init(&context->_parser->_scanner);
|
||||||
|
//Aqlset_extra(context, context->_parser->_scanner);
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -47,6 +56,7 @@ Parser::Parser () {
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
Parser::~Parser () {
|
Parser::~Parser () {
|
||||||
|
// Aqllex_destroy(parser->_scanner);
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
|
@ -31,10 +31,13 @@
|
||||||
#define ARANGODB_AQL_PARSER_H 1
|
#define ARANGODB_AQL_PARSER_H 1
|
||||||
|
|
||||||
#include "Basics/Common.h"
|
#include "Basics/Common.h"
|
||||||
|
#include "Aql/Query.h"
|
||||||
|
|
||||||
namespace triagens {
|
namespace triagens {
|
||||||
namespace aql {
|
namespace aql {
|
||||||
|
|
||||||
|
class Query;
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// --SECTION-- class Parser
|
// --SECTION-- class Parser
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
@ -55,7 +58,7 @@ namespace triagens {
|
||||||
/// @brief create the parser
|
/// @brief create the parser
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
Parser ();
|
Parser (Query*);
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
/// @brief destroy the parser
|
/// @brief destroy the parser
|
||||||
|
@ -69,23 +72,105 @@ namespace triagens {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief return the scanner
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
inline void* scanner () const {
|
||||||
|
return _scanner;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief a pointer to the start of the query string
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
inline char const* queryString () const {
|
||||||
|
return _query->queryString();
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief return the remaining length of the query string to process
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
inline size_t remainingLength () const {
|
||||||
|
return _remainingLength;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief return the current marker position
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
inline char const* marker () const {
|
||||||
|
return _marker;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief set the current marker position
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
inline void marker (char const* marker) {
|
||||||
|
_marker = marker;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief return the current parse position
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
inline size_t offset () const {
|
||||||
|
return _offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief adjust the current parse position
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
inline void increaseOffset (int offset) {
|
||||||
|
_offset += (size_t) offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief fill the output buffer with a fragment of the query
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void fillBuffer (char* result,
|
||||||
|
size_t length) {
|
||||||
|
memcpy(result, _buffer, length);
|
||||||
|
_buffer += length;
|
||||||
|
_remainingLength -= length;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief register a string
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
char* registerString (char const* p,
|
||||||
|
size_t length,
|
||||||
|
bool mustEscape) {
|
||||||
|
// TODO
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief set the query type
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void type (QueryType type) {
|
||||||
|
_query->type(type);
|
||||||
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// --SECTION-- private variables
|
// --SECTION-- private variables
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
void* _scanner; // the lexer generated by flex
|
Query* _query; // the query object
|
||||||
char* _buffer; // the currently procssed part of the query string
|
|
||||||
size_t _length; // remaining length of the query string, modified during parsing
|
|
||||||
size_t _queryLength; // overall length of the query string, not modified
|
|
||||||
|
|
||||||
|
void* _scanner; // the lexer generated by flex
|
||||||
// TODO: check if these are still required
|
char const* _buffer; // the currently processed part of the query string
|
||||||
// TRI_vector_pointer_t _scopes;
|
size_t _remainingLength; // remaining length of the query string, modified during parsing
|
||||||
// TRI_vector_pointer_t _stack;
|
size_t _offset; // current parse position
|
||||||
// char* _marker; // used temporarily during parsing
|
char const* _marker; // a position used temporarily during parsing
|
||||||
// size_t _offset; // current parse position
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,7 +49,7 @@ Query::Query (TRI_vocbase_t* vocbase,
|
||||||
: _vocbase(vocbase),
|
: _vocbase(vocbase),
|
||||||
_queryString(queryString),
|
_queryString(queryString),
|
||||||
_queryLength(queryLength),
|
_queryLength(queryLength),
|
||||||
_queryType(QUERY_READ),
|
_type(AQL_QUERY_READ),
|
||||||
_bindParameters(bindParameters),
|
_bindParameters(bindParameters),
|
||||||
_error() {
|
_error() {
|
||||||
}
|
}
|
||||||
|
@ -101,7 +101,7 @@ void Query::explain () {
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void Query::parseQuery () {
|
void Query::parseQuery () {
|
||||||
Parser parser;
|
Parser parser(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -48,11 +48,11 @@ namespace triagens {
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
enum QueryType {
|
enum QueryType {
|
||||||
QUERY_READ,
|
AQL_QUERY_READ,
|
||||||
QUERY_REMOVE,
|
AQL_QUERY_REMOVE,
|
||||||
QUERY_INSERT,
|
AQL_QUERY_INSERT,
|
||||||
QUERY_UPDATE,
|
AQL_QUERY_UPDATE,
|
||||||
QUERY_REPLACE
|
AQL_QUERY_REPLACE
|
||||||
};
|
};
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
@ -84,6 +84,38 @@ namespace triagens {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief get the query type
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
inline QueryType type () const {
|
||||||
|
return _type;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief set the query type
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void type (QueryType type) {
|
||||||
|
_type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief get the query string
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
char const* queryString () const {
|
||||||
|
return _queryString;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief get the length of the query string
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
size_t queryLength () const {
|
||||||
|
return _queryLength;
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
/// @brief execute an AQL query - TODO: implement and determine return type
|
/// @brief execute an AQL query - TODO: implement and determine return type
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -124,7 +156,7 @@ namespace triagens {
|
||||||
|
|
||||||
char const* _queryString;
|
char const* _queryString;
|
||||||
size_t const _queryLength;
|
size_t const _queryLength;
|
||||||
QueryType _queryType;
|
QueryType _type;
|
||||||
|
|
||||||
struct TRI_json_s* _bindParameters;
|
struct TRI_json_s* _bindParameters;
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,427 @@
|
||||||
|
|
||||||
|
%option reentrant
|
||||||
|
%option 8bit
|
||||||
|
%option prefix="Aql"
|
||||||
|
%option bison-locations
|
||||||
|
%option bison-bridge
|
||||||
|
%option yylineno
|
||||||
|
%option noyywrap nounput batch
|
||||||
|
%x BACKTICK
|
||||||
|
%x SINGLE_QUOTE
|
||||||
|
%x DOUBLE_QUOTE
|
||||||
|
%x COMMENT_SINGLE
|
||||||
|
%x COMMENT_MULTI
|
||||||
|
|
||||||
|
%{
|
||||||
|
#include "Basics/Common.h"
|
||||||
|
|
||||||
|
// introduce the namespace here, otherwise following references to
|
||||||
|
// the namespace in auto-generated headers might fail
|
||||||
|
|
||||||
|
namespace triagens {
|
||||||
|
namespace aql {
|
||||||
|
class Query;
|
||||||
|
class Parser;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#include "Aql/grammar.h"
|
||||||
|
#include "Aql/Parser.h"
|
||||||
|
|
||||||
|
#define YY_EXTRA_TYPE triagens::aql::Parser*
|
||||||
|
|
||||||
|
#define YY_USER_ACTION yylloc->first_line = yylineno; yylloc->first_column = yycolumn; yylloc->last_column = (int) (yycolumn + yyleng - 1); yycolumn += (int) yyleng; yyextra->increaseOffset(yyleng);
|
||||||
|
|
||||||
|
#define YY_NO_INPUT 1
|
||||||
|
|
||||||
|
#define YY_INPUT(resultBuffer, resultState, maxBytesToRead) { \
|
||||||
|
size_t length = yyextra->remainingLength(); \
|
||||||
|
if (length > maxBytesToRead) { \
|
||||||
|
length = maxBytesToRead; \
|
||||||
|
} \
|
||||||
|
if (length > 0) { \
|
||||||
|
yyextra->fillBuffer(resultBuffer, length); \
|
||||||
|
resultState = length; \
|
||||||
|
} \
|
||||||
|
else { \
|
||||||
|
resultState = YY_NULL; \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
%}
|
||||||
|
|
||||||
|
%%
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------------
|
||||||
|
* language keywords
|
||||||
|
* --------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
(?i:FOR) {
|
||||||
|
return T_FOR;
|
||||||
|
}
|
||||||
|
|
||||||
|
(?i:LET) {
|
||||||
|
return T_LET;
|
||||||
|
}
|
||||||
|
|
||||||
|
(?i:FILTER) {
|
||||||
|
return T_FILTER;
|
||||||
|
}
|
||||||
|
|
||||||
|
(?i:RETURN) {
|
||||||
|
return T_RETURN;
|
||||||
|
}
|
||||||
|
|
||||||
|
(?i:COLLECT) {
|
||||||
|
return T_COLLECT;
|
||||||
|
}
|
||||||
|
|
||||||
|
(?i:SORT) {
|
||||||
|
return T_SORT;
|
||||||
|
}
|
||||||
|
|
||||||
|
(?i:LIMIT) {
|
||||||
|
return T_LIMIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
(?i:ASC) {
|
||||||
|
return T_ASC;
|
||||||
|
}
|
||||||
|
|
||||||
|
(?i:DESC) {
|
||||||
|
return T_DESC;
|
||||||
|
}
|
||||||
|
|
||||||
|
(?i:IN) {
|
||||||
|
return T_IN;
|
||||||
|
}
|
||||||
|
|
||||||
|
(?i:INTO) {
|
||||||
|
return T_INTO;
|
||||||
|
}
|
||||||
|
|
||||||
|
(?i:WITH) {
|
||||||
|
return T_WITH;
|
||||||
|
}
|
||||||
|
|
||||||
|
(?i:REMOVE) {
|
||||||
|
return T_REMOVE;
|
||||||
|
}
|
||||||
|
|
||||||
|
(?i:INSERT) {
|
||||||
|
return T_INSERT;
|
||||||
|
}
|
||||||
|
|
||||||
|
(?i:UPDATE) {
|
||||||
|
return T_UPDATE;
|
||||||
|
}
|
||||||
|
|
||||||
|
(?i:REPLACE) {
|
||||||
|
return T_REPLACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------------
|
||||||
|
* predefined type literals
|
||||||
|
* --------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
(?i:NULL) {
|
||||||
|
return T_NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
(?i:TRUE) {
|
||||||
|
return T_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
(?i:FALSE) {
|
||||||
|
return T_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------------
|
||||||
|
* operators
|
||||||
|
* --------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
"==" {
|
||||||
|
return T_EQ;
|
||||||
|
}
|
||||||
|
|
||||||
|
"!=" {
|
||||||
|
return T_NE;
|
||||||
|
}
|
||||||
|
|
||||||
|
">=" {
|
||||||
|
return T_GE;
|
||||||
|
}
|
||||||
|
|
||||||
|
">" {
|
||||||
|
return T_GT;
|
||||||
|
}
|
||||||
|
|
||||||
|
"<=" {
|
||||||
|
return T_LE;
|
||||||
|
}
|
||||||
|
|
||||||
|
"<" {
|
||||||
|
return T_LT;
|
||||||
|
}
|
||||||
|
|
||||||
|
"=" {
|
||||||
|
return T_ASSIGN;
|
||||||
|
}
|
||||||
|
|
||||||
|
"!" {
|
||||||
|
return T_NOT;
|
||||||
|
}
|
||||||
|
|
||||||
|
"&&" {
|
||||||
|
return T_AND;
|
||||||
|
}
|
||||||
|
|
||||||
|
"||" {
|
||||||
|
return T_OR;
|
||||||
|
}
|
||||||
|
|
||||||
|
"+" {
|
||||||
|
return T_PLUS;
|
||||||
|
}
|
||||||
|
|
||||||
|
"-" {
|
||||||
|
return T_MINUS;
|
||||||
|
}
|
||||||
|
|
||||||
|
"*" {
|
||||||
|
return T_TIMES;
|
||||||
|
}
|
||||||
|
|
||||||
|
"/" {
|
||||||
|
return T_DIV;
|
||||||
|
}
|
||||||
|
|
||||||
|
"%" {
|
||||||
|
return T_MOD;
|
||||||
|
}
|
||||||
|
|
||||||
|
"?" {
|
||||||
|
return T_QUESTION;
|
||||||
|
}
|
||||||
|
|
||||||
|
"::" {
|
||||||
|
return T_SCOPE;
|
||||||
|
}
|
||||||
|
|
||||||
|
":" {
|
||||||
|
return T_COLON;
|
||||||
|
}
|
||||||
|
|
||||||
|
"[*]" {
|
||||||
|
return T_EXPAND;
|
||||||
|
}
|
||||||
|
|
||||||
|
".." {
|
||||||
|
return T_RANGE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------------
|
||||||
|
* punctuation
|
||||||
|
* --------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
"," {
|
||||||
|
return T_COMMA;
|
||||||
|
}
|
||||||
|
|
||||||
|
"(" {
|
||||||
|
return T_OPEN;
|
||||||
|
}
|
||||||
|
|
||||||
|
")" {
|
||||||
|
return T_CLOSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
"{" {
|
||||||
|
return T_DOC_OPEN;
|
||||||
|
}
|
||||||
|
|
||||||
|
"}" {
|
||||||
|
return T_DOC_CLOSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
"[" {
|
||||||
|
return T_LIST_OPEN;
|
||||||
|
}
|
||||||
|
|
||||||
|
"]" {
|
||||||
|
return T_LIST_CLOSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------------
|
||||||
|
* literals
|
||||||
|
* --------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
([a-zA-Z][_a-zA-Z0-9]*|_+[a-zA-Z]+[_a-zA-Z0-9]*) {
|
||||||
|
/* unquoted string */
|
||||||
|
yylval->strval = yyextra->registerString(yytext, yyleng, false);
|
||||||
|
return T_STRING;
|
||||||
|
}
|
||||||
|
|
||||||
|
<INITIAL>` {
|
||||||
|
/* string enclosed in backticks */
|
||||||
|
yyextra->marker(yyextra->queryString() + yyextra->offset());
|
||||||
|
BEGIN(BACKTICK);
|
||||||
|
}
|
||||||
|
|
||||||
|
<BACKTICK>` {
|
||||||
|
/* end of backtick-enclosed string */
|
||||||
|
BEGIN(INITIAL);
|
||||||
|
yylval->strval = yyextra->registerString(yyextra->marker(), yyextra->offset() - (yyextra->marker() - yyextra->queryString()) - 1, true);
|
||||||
|
return T_STRING;
|
||||||
|
}
|
||||||
|
|
||||||
|
<BACKTICK>\\. {
|
||||||
|
/* character escaped by backslash */
|
||||||
|
BEGIN(BACKTICK);
|
||||||
|
}
|
||||||
|
|
||||||
|
<BACKTICK>\n {
|
||||||
|
/* newline character inside backtick */
|
||||||
|
BEGIN(BACKTICK);
|
||||||
|
}
|
||||||
|
|
||||||
|
<BACKTICK>. {
|
||||||
|
/* any character (except newline) inside backtick */
|
||||||
|
BEGIN(BACKTICK);
|
||||||
|
}
|
||||||
|
|
||||||
|
<INITIAL>\" {
|
||||||
|
yyextra->marker(yyextra->queryString() + yyextra->offset());
|
||||||
|
BEGIN(DOUBLE_QUOTE);
|
||||||
|
}
|
||||||
|
|
||||||
|
<DOUBLE_QUOTE>\" {
|
||||||
|
/* end of quote-enclosed string */
|
||||||
|
BEGIN(INITIAL);
|
||||||
|
yylval->strval = yyextra->registerString(yyextra->marker(), yyextra->offset() - (yyextra->marker() - yyextra->queryString()) - 1, true);
|
||||||
|
return T_QUOTED_STRING;
|
||||||
|
}
|
||||||
|
|
||||||
|
<DOUBLE_QUOTE>\\. {
|
||||||
|
/* character escaped by backslash */
|
||||||
|
BEGIN(DOUBLE_QUOTE);
|
||||||
|
}
|
||||||
|
|
||||||
|
<DOUBLE_QUOTE>\n {
|
||||||
|
/* newline character inside quote */
|
||||||
|
BEGIN(DOUBLE_QUOTE);
|
||||||
|
}
|
||||||
|
|
||||||
|
<DOUBLE_QUOTE>. {
|
||||||
|
/* any character (except newline) inside quote */
|
||||||
|
BEGIN(DOUBLE_QUOTE);
|
||||||
|
}
|
||||||
|
|
||||||
|
<INITIAL>' {
|
||||||
|
yyextra->marker(yyextra->queryString() + yyextra->offset());
|
||||||
|
BEGIN(SINGLE_QUOTE);
|
||||||
|
}
|
||||||
|
|
||||||
|
<SINGLE_QUOTE>' {
|
||||||
|
/* end of quote-enclosed string */
|
||||||
|
BEGIN(INITIAL);
|
||||||
|
yylval->strval = yyextra->registerString(yyextra->marker(), yyextra->offset() - (yyextra->marker() - yyextra->queryString()) - 1, true);
|
||||||
|
return T_QUOTED_STRING;
|
||||||
|
}
|
||||||
|
|
||||||
|
<SINGLE_QUOTE>\\. {
|
||||||
|
/* character escaped by backslash */
|
||||||
|
BEGIN(SINGLE_QUOTE);
|
||||||
|
}
|
||||||
|
|
||||||
|
<SINGLE_QUOTE>\n {
|
||||||
|
/* newline character inside quote */
|
||||||
|
BEGIN(SINGLE_QUOTE);
|
||||||
|
}
|
||||||
|
|
||||||
|
<SINGLE_QUOTE>. {
|
||||||
|
/* any character (except newline) inside quote */
|
||||||
|
BEGIN(SINGLE_QUOTE);
|
||||||
|
}
|
||||||
|
|
||||||
|
(0|[1-9][0-9]*) {
|
||||||
|
/* a numeric integer value */
|
||||||
|
yylval->strval = yyextra->registerString(yytext, yyleng, false);
|
||||||
|
return T_INTEGER;
|
||||||
|
}
|
||||||
|
|
||||||
|
(0|[1-9][0-9]*)(\.[0-9]+([eE]([\-\+])?[0-9]+)?) {
|
||||||
|
/* a numeric double value */
|
||||||
|
yylval->strval = yyextra->registerString(yytext, yyleng, false);
|
||||||
|
return T_DOUBLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------------
|
||||||
|
* bind parameters
|
||||||
|
* --------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
@@?[a-zA-Z0-9][a-zA-Z0-9_]* {
|
||||||
|
/* bind parameters must start with a @
|
||||||
|
if followed by another @, this is a collection name parameter */
|
||||||
|
yylval->strval = yyextra->registerString(yytext + 1, yyleng - 1, false);
|
||||||
|
return T_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------------
|
||||||
|
* whitespace etc.
|
||||||
|
* --------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
[ \t\r\n]+ {
|
||||||
|
/* whitespace is ignored */
|
||||||
|
}
|
||||||
|
|
||||||
|
<INITIAL>"//" {
|
||||||
|
BEGIN(COMMENT_SINGLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
<COMMENT_SINGLE>\r?\n {
|
||||||
|
yylineno++;
|
||||||
|
BEGIN(INITIAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
<COMMENT_SINGLE>\r {
|
||||||
|
yylineno++;
|
||||||
|
BEGIN(INITIAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
<COMMENT_SINGLE>[^*\r\n]+ {
|
||||||
|
// eat comment in chunks
|
||||||
|
}
|
||||||
|
|
||||||
|
<INITIAL>"/*" {
|
||||||
|
BEGIN(COMMENT_MULTI);
|
||||||
|
}
|
||||||
|
|
||||||
|
<COMMENT_MULTI>"*/" {
|
||||||
|
BEGIN(INITIAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
<COMMENT_MULTI>[^*\r\n]+ {
|
||||||
|
// eat comment in chunks
|
||||||
|
}
|
||||||
|
|
||||||
|
<COMMENT_MULTI>"*" {
|
||||||
|
// eat the lone star
|
||||||
|
}
|
||||||
|
|
||||||
|
<COMMENT_MULTI>\r?\n {
|
||||||
|
yylineno++;
|
||||||
|
}
|
||||||
|
|
||||||
|
<COMMENT_MULTI>\r {
|
||||||
|
yylineno++;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
. {
|
||||||
|
/* anything else is returned as it is */
|
||||||
|
return (int) yytext[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
%%
|
||||||
|
|
|
@ -58,9 +58,11 @@ add_executable(
|
||||||
Ahuacatl/ahuacatl-tokens.cpp
|
Ahuacatl/ahuacatl-tokens.cpp
|
||||||
Ahuacatl/ahuacatl-variable.cpp
|
Ahuacatl/ahuacatl-variable.cpp
|
||||||
Aql/ExecutionPlan.cpp
|
Aql/ExecutionPlan.cpp
|
||||||
|
Aql/grammar.cpp
|
||||||
Aql/Parser.cpp
|
Aql/Parser.cpp
|
||||||
Aql/Query.cpp
|
Aql/Query.cpp
|
||||||
Aql/QueryError.cpp
|
Aql/QueryError.cpp
|
||||||
|
Aql/tokens.cpp
|
||||||
BitIndexes/bitarray.cpp
|
BitIndexes/bitarray.cpp
|
||||||
BitIndexes/bitarrayIndex.cpp
|
BitIndexes/bitarrayIndex.cpp
|
||||||
CapConstraint/cap-constraint.cpp
|
CapConstraint/cap-constraint.cpp
|
||||||
|
|
|
@ -39,13 +39,15 @@ arangod_libarangod_a_SOURCES = \
|
||||||
arangod/Ahuacatl/ahuacatl-tokens.cpp \
|
arangod/Ahuacatl/ahuacatl-tokens.cpp \
|
||||||
arangod/Ahuacatl/ahuacatl-variable.cpp \
|
arangod/Ahuacatl/ahuacatl-variable.cpp \
|
||||||
arangod/Aql/ExecutionPlan.cpp \
|
arangod/Aql/ExecutionPlan.cpp \
|
||||||
|
arangod/Aql/grammar.cpp \
|
||||||
arangod/Aql/Parser.cpp \
|
arangod/Aql/Parser.cpp \
|
||||||
arangod/Aql/Query.cpp \
|
arangod/Aql/Query.cpp \
|
||||||
arangod/Aql/QueryError.cpp \
|
arangod/Aql/QueryError.cpp \
|
||||||
|
arangod/Aql/tokens.cpp \
|
||||||
arangod/BitIndexes/bitarray.cpp \
|
arangod/BitIndexes/bitarray.cpp \
|
||||||
arangod/BitIndexes/bitarrayIndex.cpp \
|
arangod/BitIndexes/bitarrayIndex.cpp \
|
||||||
arangod/CapConstraint/cap-constraint.cpp \
|
arangod/CapConstraint/cap-constraint.cpp \
|
||||||
arangod/Cluster/AgencyComm.cpp \
|
arangod/Cluster/AgencyComm.cpp \
|
||||||
arangod/Cluster/ApplicationCluster.cpp \
|
arangod/Cluster/ApplicationCluster.cpp \
|
||||||
arangod/Cluster/ClusterComm.cpp \
|
arangod/Cluster/ClusterComm.cpp \
|
||||||
arangod/Cluster/ClusterInfo.cpp \
|
arangod/Cluster/ClusterInfo.cpp \
|
||||||
|
@ -166,20 +168,25 @@ endif
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
FLEXXX_FILES += \
|
FLEXXX_FILES += \
|
||||||
arangod/Ahuacatl/ahuacatl-tokens.cpp
|
arangod/Ahuacatl/ahuacatl-tokens.cpp \
|
||||||
|
arangod/Aql/tokens.cpp
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
### @brief bison
|
### @brief bison
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
BISON_FILES += \
|
BISON_FILES += \
|
||||||
arangod/Ahuacatl/ahuacatl-grammar.cpp
|
arangod/Ahuacatl/ahuacatl-grammar.cpp \
|
||||||
|
arangod/Aql/grammar.cpp
|
||||||
|
|
||||||
if ENABLE_MAINTAINER_MODE
|
if ENABLE_MAINTAINER_MODE
|
||||||
|
|
||||||
CLEANUP += \
|
CLEANUP += \
|
||||||
arangod/Ahuacatl/ahuacatl-grammar.h \
|
arangod/Ahuacatl/ahuacatl-grammar.h \
|
||||||
arangod/Ahuacatl/ahuacatl-grammar.cpp
|
arangod/Ahuacatl/ahuacatl-grammar.cpp \
|
||||||
|
arangod/Aql/grammar.h \
|
||||||
|
arangod/Aql/grammar.cpp
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
Loading…
Reference in New Issue