From 39ac8ef02d765b461650d59a4e835ae862199d47 Mon Sep 17 00:00:00 2001 From: eelke Date: Mon, 28 Jan 2019 20:53:10 +0100 Subject: [PATCH] Some work on parser, not used yet. --- core/SqlAstSelect.cpp | 11 +++++++---- core/SqlParser.cpp | 9 +++++++-- core/SqlParser.h | 4 +++- tests/pglabtests/pglabtests.pro | 5 +++-- tests/pglabtests/tst_SqlParser.cpp | 30 ++++++++++++++++++++++++++++++ 5 files changed, 50 insertions(+), 9 deletions(-) create mode 100644 tests/pglabtests/tst_SqlParser.cpp diff --git a/core/SqlAstSelect.cpp b/core/SqlAstSelect.cpp index dcf7a5a..001bedd 100644 --- a/core/SqlAstSelect.cpp +++ b/core/SqlAstSelect.cpp @@ -2,16 +2,19 @@ #include "SqlAstSelectList.h" #include "SqlParser.h" -using namespace SqlAst; +namespace SqlAst { + std::shared_ptr parseSelect(SqlParser &parser) { - std::shared_ptr ast_select = std::make_shared(); + auto ast_select = std::make_shared(); // 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; } + +} diff --git a/core/SqlParser.cpp b/core/SqlParser.cpp index e14e7f0..38354bd 100644 --- a/core/SqlParser.cpp +++ b/core/SqlParser.cpp @@ -33,7 +33,7 @@ SqlParser::SqlParser(SqlLexer &lexer) } -void SqlParser::parse() +std::shared_ptr SqlParser::parse() { // Basic algo: // LOOP @@ -41,6 +41,7 @@ void SqlParser::parse() // IF NOT try_reduce(token) // THEN SHIFT // END LOOP + std::shared_ptr 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"); } } } diff --git a/core/SqlParser.h b/core/SqlParser.h index 621675b..b5e9dad 100644 --- a/core/SqlParser.h +++ b/core/SqlParser.h @@ -2,6 +2,7 @@ #define SQLPARSER_H #include "SqlLexer.h" +#include "SqlAstNode.h" #include #include @@ -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 parse(); /** Checks to see if the next token is the expected keyword. * diff --git a/tests/pglabtests/pglabtests.pro b/tests/pglabtests/pglabtests.pro index c19bbc9..004c52b 100644 --- a/tests/pglabtests/pglabtests.pro +++ b/tests/pglabtests/pglabtests.pro @@ -15,7 +15,7 @@ error( "Couldn't find the common.pri file!" ) } -HEADERS += +HEADERS += SOURCES += main.cpp \ tst_ExplainJsonParser.cpp \ @@ -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 diff --git a/tests/pglabtests/tst_SqlParser.cpp b/tests/pglabtests/tst_SqlParser.cpp new file mode 100644 index 0000000..9ce07df --- /dev/null +++ b/tests/pglabtests/tst_SqlParser.cpp @@ -0,0 +1,30 @@ +#include +#include +#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)); +}