Some work on parser, not used yet.
This commit is contained in:
parent
3b482c1c73
commit
39ac8ef02d
5 changed files with 50 additions and 9 deletions
|
|
@ -2,16 +2,19 @@
|
||||||
#include "SqlAstSelectList.h"
|
#include "SqlAstSelectList.h"
|
||||||
#include "SqlParser.h"
|
#include "SqlParser.h"
|
||||||
|
|
||||||
using namespace SqlAst;
|
namespace SqlAst {
|
||||||
|
|
||||||
|
|
||||||
std::shared_ptr<SqlAst::Select> parseSelect(SqlParser &parser)
|
std::shared_ptr<SqlAst::Select> parseSelect(SqlParser &parser)
|
||||||
{
|
{
|
||||||
std::shared_ptr<SqlAst::Select> ast_select = std::make_shared<SqlAst::Select>();
|
auto ast_select = std::make_shared<SqlAst::Select>();
|
||||||
// parse select list of expression + aliasses, required
|
// parse select list of expression + aliasses, required
|
||||||
auto select_list = parseSelectList(parser);
|
// auto select_list = parseSelectList(parser);
|
||||||
ast_select->setSelectList(select_list);
|
// ast_select->setSelectList(select_list);
|
||||||
|
|
||||||
// parse optional from list
|
// parse optional from list
|
||||||
|
|
||||||
return ast_select;
|
return ast_select;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,7 @@ SqlParser::SqlParser(SqlLexer &lexer)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SqlParser::parse()
|
std::shared_ptr<SqlAst::Node> SqlParser::parse()
|
||||||
{
|
{
|
||||||
// Basic algo:
|
// Basic algo:
|
||||||
// LOOP
|
// LOOP
|
||||||
|
|
@ -41,6 +41,7 @@ void SqlParser::parse()
|
||||||
// IF NOT try_reduce(token)
|
// IF NOT try_reduce(token)
|
||||||
// THEN SHIFT
|
// THEN SHIFT
|
||||||
// END LOOP
|
// END LOOP
|
||||||
|
std::shared_ptr<SqlAst::Node> result;
|
||||||
while (true) {
|
while (true) {
|
||||||
SqlToken token = lexer.nextBasicToken();
|
SqlToken token = lexer.nextBasicToken();
|
||||||
if (token.ok) {
|
if (token.ok) {
|
||||||
|
|
@ -57,10 +58,14 @@ void SqlParser::parse()
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (token.tokenType == BasicTokenType::End) {
|
||||||
|
// Are we at the top level?
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// error during lexical analysis, need to recover
|
// error during lexical analysis, need to recover
|
||||||
|
throw std::runtime_error("Unrecognized input");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
#define SQLPARSER_H
|
#define SQLPARSER_H
|
||||||
|
|
||||||
#include "SqlLexer.h"
|
#include "SqlLexer.h"
|
||||||
|
#include "SqlAstNode.h"
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
|
|
||||||
|
|
@ -22,6 +23,7 @@ enum class Keyword {
|
||||||
|
|
||||||
namespace SqlAst {
|
namespace SqlAst {
|
||||||
|
|
||||||
|
class Node;
|
||||||
class Select;
|
class Select;
|
||||||
class SelectList;
|
class SelectList;
|
||||||
|
|
||||||
|
|
@ -37,7 +39,7 @@ class SqlParser
|
||||||
public:
|
public:
|
||||||
explicit SqlParser(SqlLexer &lexer);
|
explicit SqlParser(SqlLexer &lexer);
|
||||||
|
|
||||||
void parse();
|
std::shared_ptr<SqlAst::Node> parse();
|
||||||
|
|
||||||
/** Checks to see if the next token is the expected keyword.
|
/** Checks to see if the next token is the expected keyword.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,8 @@ SOURCES += main.cpp \
|
||||||
tst_CodeBuilder.cpp \
|
tst_CodeBuilder.cpp \
|
||||||
tst_NameManglingRules.cpp \
|
tst_NameManglingRules.cpp \
|
||||||
tst_TypeMappings.cpp \
|
tst_TypeMappings.cpp \
|
||||||
tst_Range.cpp
|
tst_Range.cpp \
|
||||||
|
tst_SqlParser.cpp
|
||||||
|
|
||||||
win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../../core/release/ -lcore
|
win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../../core/release/ -lcore
|
||||||
else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../../core/debug/ -lcore
|
else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../../core/debug/ -lcore
|
||||||
|
|
|
||||||
30
tests/pglabtests/tst_SqlParser.cpp
Normal file
30
tests/pglabtests/tst_SqlParser.cpp
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
#include <gmock/gmock-matchers.h>
|
||||||
|
#include "SqlLexer.h"
|
||||||
|
#include "SqlParser.h"
|
||||||
|
#include "SqlAstSelect.h"
|
||||||
|
#include "PrintTo_Qt.h"
|
||||||
|
|
||||||
|
using namespace testing;
|
||||||
|
|
||||||
|
|
||||||
|
TEST(SqlParser, emptyFile)
|
||||||
|
{
|
||||||
|
QString input;
|
||||||
|
SqlLexer lexer(input, LexerState::Null);
|
||||||
|
SqlParser parser(lexer);
|
||||||
|
auto res = parser.parse();
|
||||||
|
|
||||||
|
ASSERT_TRUE(res == nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(SqlParser, select)
|
||||||
|
{
|
||||||
|
QString input("SELECT");
|
||||||
|
SqlLexer lexer(input, LexerState::Null);
|
||||||
|
SqlParser parser(lexer);
|
||||||
|
auto res = parser.parse();
|
||||||
|
|
||||||
|
ASSERT_TRUE(res != nullptr);
|
||||||
|
ASSERT_EQ(typeid(*res), typeid(SqlAst::Select));
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue