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 "SqlParser.h"
|
||||
|
||||
using namespace SqlAst;
|
||||
namespace SqlAst {
|
||||
|
||||
|
||||
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
|
||||
auto select_list = parseSelectList(parser);
|
||||
ast_select->setSelectList(select_list);
|
||||
// auto select_list = parseSelectList(parser);
|
||||
// ast_select->setSelectList(select_list);
|
||||
|
||||
// parse optional from list
|
||||
|
||||
return ast_select;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ SqlParser::SqlParser(SqlLexer &lexer)
|
|||
|
||||
}
|
||||
|
||||
void SqlParser::parse()
|
||||
std::shared_ptr<SqlAst::Node> SqlParser::parse()
|
||||
{
|
||||
// Basic algo:
|
||||
// LOOP
|
||||
|
|
@ -41,6 +41,7 @@ void SqlParser::parse()
|
|||
// IF NOT try_reduce(token)
|
||||
// THEN SHIFT
|
||||
// END LOOP
|
||||
std::shared_ptr<SqlAst::Node> result;
|
||||
while (true) {
|
||||
SqlToken token = lexer.nextBasicToken();
|
||||
if (token.ok) {
|
||||
|
|
@ -57,10 +58,14 @@ void SqlParser::parse()
|
|||
break;
|
||||
}
|
||||
}
|
||||
else if (token.tokenType == BasicTokenType::End) {
|
||||
// Are we at the top level?
|
||||
return result;
|
||||
}
|
||||
}
|
||||
else {
|
||||
// error during lexical analysis, need to recover
|
||||
|
||||
throw std::runtime_error("Unrecognized input");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
#define SQLPARSER_H
|
||||
|
||||
#include "SqlLexer.h"
|
||||
#include "SqlAstNode.h"
|
||||
#include <memory>
|
||||
#include <optional>
|
||||
|
||||
|
|
@ -22,6 +23,7 @@ enum class Keyword {
|
|||
|
||||
namespace SqlAst {
|
||||
|
||||
class Node;
|
||||
class Select;
|
||||
class SelectList;
|
||||
|
||||
|
|
@ -37,7 +39,7 @@ class SqlParser
|
|||
public:
|
||||
explicit SqlParser(SqlLexer &lexer);
|
||||
|
||||
void parse();
|
||||
std::shared_ptr<SqlAst::Node> parse();
|
||||
|
||||
/** Checks to see if the next token is the expected keyword.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -28,7 +28,8 @@ SOURCES += main.cpp \
|
|||
tst_CodeBuilder.cpp \
|
||||
tst_NameManglingRules.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
|
||||
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