lexer.cpp 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #include "lexer.h"
  2. #include <yql/essentials/public/issue/yql_issue.h>
  3. #include <yql/essentials/parser/proto_ast/collect_issues/collect_issues.h>
  4. #include <yql/essentials/parser/proto_ast/antlr3/proto_ast_antlr3.h>
  5. #include <yql/essentials/parser/proto_ast/antlr4/proto_ast_antlr4.h>
  6. #include <yql/essentials/parser/proto_ast/gen/v1/SQLv1Lexer.h>
  7. #include <yql/essentials/parser/proto_ast/gen/v1_ansi/SQLv1Lexer.h>
  8. #include <yql/essentials/parser/proto_ast/gen/v1_antlr4/SQLv1Antlr4Lexer.h>
  9. #include <yql/essentials/parser/proto_ast/gen/v1_ansi_antlr4/SQLv1Antlr4Lexer.h>
  10. #include <util/string/ascii.h>
  11. #if defined(_tsan_enabled_)
  12. #include <util/system/mutex.h>
  13. #endif
  14. namespace NALPDefault {
  15. extern ANTLR_UINT8 *SQLv1ParserTokenNames[];
  16. }
  17. namespace NALPAnsi {
  18. extern ANTLR_UINT8 *SQLv1ParserTokenNames[];
  19. }
  20. namespace NSQLTranslationV1 {
  21. namespace {
  22. #if defined(_tsan_enabled_)
  23. TMutex SanitizerSQLTranslationMutex;
  24. #endif
  25. using NSQLTranslation::ILexer;
  26. class TV1Lexer : public ILexer {
  27. public:
  28. explicit TV1Lexer(bool ansi, bool antlr4)
  29. : Ansi(ansi), Antlr4(antlr4)
  30. {
  31. }
  32. bool Tokenize(const TString& query, const TString& queryName, const TTokenCallback& onNextToken, NYql::TIssues& issues, size_t maxErrors) override {
  33. NYql::TIssues newIssues;
  34. #if defined(_tsan_enabled_)
  35. TGuard<TMutex> grd(SanitizerSQLTranslationMutex);
  36. #endif
  37. NSQLTranslation::TErrorCollectorOverIssues collector(newIssues, maxErrors, "");
  38. if (Ansi && !Antlr4) {
  39. NProtoAST::TLexerTokensCollector3<NALPAnsi::SQLv1Lexer> tokensCollector(query, (const char**)NALPAnsi::SQLv1ParserTokenNames, queryName);
  40. tokensCollector.CollectTokens(collector, onNextToken);
  41. } else if (!Ansi && !Antlr4) {
  42. NProtoAST::TLexerTokensCollector3<NALPDefault::SQLv1Lexer> tokensCollector(query, (const char**)NALPDefault::SQLv1ParserTokenNames, queryName);
  43. tokensCollector.CollectTokens(collector, onNextToken);
  44. } else if (Ansi && Antlr4) {
  45. NProtoAST::TLexerTokensCollector4<NALPAnsiAntlr4::SQLv1Antlr4Lexer> tokensCollector(query, queryName);
  46. tokensCollector.CollectTokens(collector, onNextToken);
  47. } else {
  48. NProtoAST::TLexerTokensCollector4<NALPDefaultAntlr4::SQLv1Antlr4Lexer> tokensCollector(query, queryName);
  49. tokensCollector.CollectTokens(collector, onNextToken);
  50. }
  51. issues.AddIssues(newIssues);
  52. return !AnyOf(newIssues.begin(), newIssues.end(), [](auto issue) { return issue.GetSeverity() == NYql::ESeverity::TSeverityIds_ESeverityId_S_ERROR; });
  53. }
  54. private:
  55. const bool Ansi;
  56. const bool Antlr4;
  57. };
  58. } // namespace
  59. NSQLTranslation::ILexer::TPtr MakeLexer(bool ansi, bool antlr4) {
  60. return NSQLTranslation::ILexer::TPtr(new TV1Lexer(ansi, antlr4));
  61. }
  62. bool IsProbablyKeyword(const NSQLTranslation::TParsedToken& token) {
  63. return AsciiEqualsIgnoreCase(token.Name, token.Content);
  64. }
  65. } // namespace NSQLTranslationV1