81 lines
2.1 KiB
C++
81 lines
2.1 KiB
C++
|
|
#include "SQLParser.h"
|
|
#include "parser/bison_parser.h"
|
|
#include "parser/flex_lexer.h"
|
|
#include <stdio.h>
|
|
#include <string>
|
|
|
|
namespace hsql {
|
|
|
|
SQLParser::SQLParser() {
|
|
fprintf(stderr, "SQLParser only has static methods atm! Do not initialize!\n");
|
|
}
|
|
|
|
// static
|
|
bool SQLParser::parse(const std::string& sql, SQLParserResult* result) {
|
|
yyscan_t scanner;
|
|
YY_BUFFER_STATE state;
|
|
|
|
if (hsql_lex_init(&scanner)) {
|
|
// Couldn't initialize the lexer.
|
|
fprintf(stderr, "SQLParser: Error when initializing lexer!\n");
|
|
return false;
|
|
}
|
|
const char* text = sql.c_str();
|
|
state = hsql__scan_string(text, scanner);
|
|
|
|
// Parse the tokens.
|
|
// If parsing fails, the result will contain an error object.
|
|
int ret = hsql_parse(result, scanner);
|
|
bool success = (ret == 0);
|
|
result->setIsValid(success);
|
|
|
|
hsql__delete_buffer(state, scanner);
|
|
hsql_lex_destroy(scanner);
|
|
|
|
return true;
|
|
}
|
|
|
|
// static
|
|
bool SQLParser::parseSQLString(const char* sql, SQLParserResult* result) {
|
|
return parse(sql, result);
|
|
}
|
|
|
|
bool SQLParser::parseSQLString(const std::string& sql, SQLParserResult* result) {
|
|
return parse(sql, result);
|
|
}
|
|
|
|
// static
|
|
bool SQLParser::tokenize(const std::string& sql, std::vector<int16_t>* tokens) {
|
|
// Initialize the scanner.
|
|
yyscan_t scanner;
|
|
if (hsql_lex_init(&scanner)) {
|
|
fprintf(stderr, "SQLParser: Error when initializing lexer!\n");
|
|
return false;
|
|
}
|
|
|
|
YY_BUFFER_STATE state;
|
|
state = hsql__scan_string(sql.c_str(), scanner);
|
|
|
|
YYSTYPE yylval;
|
|
YYLTYPE yylloc;
|
|
|
|
// Step through the string until EOF is read.
|
|
// Note: hsql_lex returns int, but we know that its range is within 16 bit.
|
|
int16_t token = hsql_lex(&yylval, &yylloc, scanner);
|
|
while (token != 0) {
|
|
tokens->push_back(token);
|
|
token = hsql_lex(&yylval, &yylloc, scanner);
|
|
|
|
if (token == SQL_IDENTIFIER || token == SQL_STRING) {
|
|
free(yylval.sval);
|
|
}
|
|
}
|
|
|
|
hsql__delete_buffer(state, scanner);
|
|
hsql_lex_destroy(scanner);
|
|
return true;
|
|
}
|
|
|
|
} // namespace hsql
|