Some work on parser, not used yet.

This commit is contained in:
eelke 2019-01-28 20:53:10 +01:00
parent 3b482c1c73
commit 39ac8ef02d
5 changed files with 50 additions and 9 deletions

View file

@ -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;
}
}

View file

@ -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");
}
}
}

View file

@ -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.
*

View file

@ -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

View 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));
}