Skip to content

Commit 1213d16

Browse files
committed
Introduced lexer & parser interfaces
commit_hash:fee365c90a176dd33a967cee20994b21d530080c
1 parent 408888e commit 1213d16

36 files changed

+766
-155
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
#include "lexer.h"
2+
#include <yql/essentials/public/issue/yql_issue.h>
3+
4+
#include <util/string/builder.h>
5+
6+
namespace NSQLTranslation {
7+
8+
namespace {
9+
10+
class TDummyLexer : public ILexer {
11+
public:
12+
TDummyLexer(const TString& name)
13+
: Name_(name)
14+
{}
15+
16+
bool Tokenize(const TString& query, const TString& queryName, const TTokenCallback& onNextToken, NYql::TIssues& issues, size_t maxErrors) final {
17+
Y_UNUSED(query);
18+
Y_UNUSED(queryName);
19+
Y_UNUSED(onNextToken);
20+
Y_UNUSED(maxErrors);
21+
issues.AddIssue(NYql::TIssue({}, TStringBuilder() << "Lexer " << Name_ << " is not supported"));
22+
return false;
23+
}
24+
25+
private:
26+
const TString Name_;
27+
};
28+
29+
class TDummyFactory: public ILexerFactory {
30+
public:
31+
TDummyFactory(const TString& name)
32+
: Name_(name)
33+
{}
34+
35+
ILexer::TPtr MakeLexer() const final {
36+
return MakeHolder<TDummyLexer>(Name_);
37+
}
38+
39+
private:
40+
const TString Name_;
41+
};
42+
43+
}
44+
45+
TLexerFactoryPtr MakeDummyLexerFactory(const TString& name) {
46+
return MakeIntrusive<TDummyFactory>(name);
47+
}
48+
49+
}

yql/essentials/parser/lexer_common/lexer.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,5 +39,16 @@ using TParsedTokenList = TVector<TParsedToken>;
3939
IOutputStream& OutputTokens(IOutputStream& out, TParsedTokenList::const_iterator begin, TParsedTokenList::const_iterator end);
4040
bool Tokenize(ILexer& lexer, const TString& query, const TString& queryName, TParsedTokenList& tokens, NYql::TIssues& issues, size_t maxErrors);
4141

42+
class ILexerFactory : public TThrRefBase {
43+
public:
44+
virtual ~ILexerFactory() = default;
45+
46+
virtual ILexer::TPtr MakeLexer() const = 0;
47+
};
48+
49+
using TLexerFactoryPtr = TIntrusivePtr<ILexerFactory>;
50+
51+
TLexerFactoryPtr MakeDummyLexerFactory(const TString& name);
52+
4253
}
4354

yql/essentials/parser/lexer_common/ya.make

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ PEERDIR(
77
SRCS(
88
tokens.cpp
99
lexer.h
10+
lexer.cpp
1011
hints.cpp
1112
hints.h
1213
parse_hints_impl.cpp

yql/essentials/parser/proto_ast/common.h

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,5 +65,24 @@ namespace NProtoAST {
6565
IOutputStream& Err;
6666
TString Name;
6767
};
68-
6968
} // namespace NProtoAST
69+
70+
namespace NSQLTranslation {
71+
class IParser {
72+
public:
73+
virtual ~IParser() = default;
74+
75+
virtual google::protobuf::Message* Parse(
76+
const TString& query, const TString& queryName, NProtoAST::IErrorCollector& err,
77+
google::protobuf::Arena* arena) = 0;
78+
};
79+
80+
class IParserFactory : public TThrRefBase {
81+
public:
82+
virtual ~IParserFactory() = default;
83+
84+
virtual std::unique_ptr<IParser> MakeParser() const = 0;
85+
};
86+
87+
using TParserFactoryPtr = TIntrusivePtr<IParserFactory>;
88+
} // namespace NSQLTranslation
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#include "lexer.h"
2+
#include <yql/essentials/parser/proto_ast/gen/v1/SQLv1Lexer.h>
3+
#include <yql/essentials/public/issue/yql_issue.h>
4+
#include <yql/essentials/parser/proto_ast/collect_issues/collect_issues.h>
5+
#include <yql/essentials/parser/proto_ast/antlr3/proto_ast_antlr3.h>
6+
7+
namespace NALPDefault {
8+
extern ANTLR_UINT8 *SQLv1ParserTokenNames[];
9+
}
10+
11+
namespace NSQLTranslationV1 {
12+
13+
namespace {
14+
15+
class TLexer: public NSQLTranslation::ILexer {
16+
public:
17+
bool Tokenize(const TString& query, const TString& queryName, const TTokenCallback& onNextToken, NYql::TIssues& issues, size_t maxErrors) final {
18+
NYql::TIssues newIssues;
19+
NSQLTranslation::TErrorCollectorOverIssues collector(newIssues, maxErrors, queryName);
20+
NProtoAST::TLexerTokensCollector3<NALPDefault::SQLv1Lexer> tokensCollector(query, (const char**)NALPDefault::SQLv1ParserTokenNames, queryName);
21+
tokensCollector.CollectTokens(collector, onNextToken);
22+
issues.AddIssues(newIssues);
23+
return !AnyOf(newIssues.begin(), newIssues.end(), [](auto issue) { return issue.GetSeverity() == NYql::ESeverity::TSeverityIds_ESeverityId_S_ERROR; });
24+
}
25+
};
26+
27+
class TFactory: public NSQLTranslation::ILexerFactory {
28+
public:
29+
THolder<NSQLTranslation::ILexer> MakeLexer() const final {
30+
return MakeHolder<TLexer>();
31+
}
32+
};
33+
34+
}
35+
36+
NSQLTranslation::TLexerFactoryPtr MakeAntlr3LexerFactory() {
37+
return MakeIntrusive<TFactory>();
38+
}
39+
40+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#pragma once
2+
#include <yql/essentials/parser/lexer_common/lexer.h>
3+
4+
namespace NSQLTranslationV1 {
5+
6+
NSQLTranslation::TLexerFactoryPtr MakeAntlr3LexerFactory();
7+
8+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
LIBRARY()
2+
3+
PEERDIR(
4+
yql/essentials/parser/lexer_common
5+
yql/essentials/public/issue
6+
yql/essentials/parser/proto_ast/collect_issues
7+
yql/essentials/parser/proto_ast/gen/v1
8+
)
9+
10+
SRCS(
11+
lexer.cpp
12+
)
13+
14+
END()
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#include "lexer.h"
2+
#include <yql/essentials/parser/proto_ast/gen/v1_ansi/SQLv1Lexer.h>
3+
#include <yql/essentials/public/issue/yql_issue.h>
4+
#include <yql/essentials/parser/proto_ast/collect_issues/collect_issues.h>
5+
#include <yql/essentials/parser/proto_ast/antlr3/proto_ast_antlr3.h>
6+
7+
namespace NALPAnsi {
8+
extern ANTLR_UINT8 *SQLv1ParserTokenNames[];
9+
}
10+
11+
namespace NSQLTranslationV1 {
12+
13+
namespace {
14+
15+
class TLexer: public NSQLTranslation::ILexer {
16+
public:
17+
bool Tokenize(const TString& query, const TString& queryName, const TTokenCallback& onNextToken, NYql::TIssues& issues, size_t maxErrors) final {
18+
NYql::TIssues newIssues;
19+
NSQLTranslation::TErrorCollectorOverIssues collector(newIssues, maxErrors, queryName);
20+
NProtoAST::TLexerTokensCollector3<NALPAnsi::SQLv1Lexer> tokensCollector(query, (const char**)NALPAnsi::SQLv1ParserTokenNames, queryName);
21+
tokensCollector.CollectTokens(collector, onNextToken);
22+
issues.AddIssues(newIssues);
23+
return !AnyOf(newIssues.begin(), newIssues.end(), [](auto issue) { return issue.GetSeverity() == NYql::ESeverity::TSeverityIds_ESeverityId_S_ERROR; });
24+
}
25+
};
26+
27+
class TFactory: public NSQLTranslation::ILexerFactory {
28+
public:
29+
THolder<NSQLTranslation::ILexer> MakeLexer() const final {
30+
return MakeHolder<TLexer>();
31+
}
32+
};
33+
34+
}
35+
36+
NSQLTranslation::TLexerFactoryPtr MakeAntlr3AnsiLexerFactory() {
37+
return MakeIntrusive<TFactory>();
38+
}
39+
40+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#pragma once
2+
#include <yql/essentials/parser/lexer_common/lexer.h>
3+
4+
namespace NSQLTranslationV1 {
5+
6+
NSQLTranslation::TLexerFactoryPtr MakeAntlr3AnsiLexerFactory();
7+
8+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
LIBRARY()
2+
3+
PEERDIR(
4+
yql/essentials/parser/lexer_common
5+
yql/essentials/public/issue
6+
yql/essentials/parser/proto_ast/collect_issues
7+
yql/essentials/parser/proto_ast/gen/v1_ansi
8+
)
9+
10+
SRCS(
11+
lexer.cpp
12+
)
13+
14+
END()

0 commit comments

Comments
 (0)