parser.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #include "check_runner.h"
  2. #include <yql/essentials/sql/v1/lexer/lexer.h>
  3. #include <yql/essentials/sql/v1/lexer/antlr4/lexer.h>
  4. #include <yql/essentials/sql/v1/lexer/antlr4_ansi/lexer.h>
  5. #include <yql/essentials/sql/v1/proto_parser/proto_parser.h>
  6. #include <yql/essentials/sql/v1/proto_parser/antlr4/proto_parser.h>
  7. #include <yql/essentials/sql/v1/proto_parser/antlr4_ansi/proto_parser.h>
  8. #include <yql/essentials/sql/settings/translation_settings.h>
  9. #include <yql/essentials/parser/pg_wrapper/interface/raw_parser.h>
  10. namespace NYql {
  11. namespace NFastCheck {
  12. namespace {
  13. class TParserRunner : public ICheckRunner {
  14. public:
  15. TString GetCheckName() const final {
  16. return "parser";
  17. }
  18. TCheckResponse Run(const TChecksRequest& request) final {
  19. switch (request.Syntax) {
  20. case ESyntax::SExpr:
  21. return RunSExpr(request);
  22. case ESyntax::PG:
  23. return RunPg(request);
  24. case ESyntax::YQL:
  25. return RunYql(request);
  26. }
  27. }
  28. private:
  29. TCheckResponse RunSExpr(const TChecksRequest& request) {
  30. TAstParseResult res = ParseAst(request.Program);
  31. return TCheckResponse{
  32. .CheckName = GetCheckName(),
  33. .Success = res.IsOk(),
  34. .Issues = res.Issues
  35. };
  36. }
  37. class TPGParseEventsHandler : public IPGParseEvents {
  38. public:
  39. TPGParseEventsHandler(TCheckResponse& res)
  40. : Res_(res)
  41. {}
  42. void OnResult(const List* raw) final {
  43. Y_UNUSED(raw);
  44. Res_.Success = true;
  45. }
  46. void OnError(const TIssue& issue) final {
  47. Res_.Issues.AddIssue(issue);
  48. }
  49. private:
  50. TCheckResponse& Res_;
  51. };
  52. TCheckResponse RunPg(const TChecksRequest& request) {
  53. TCheckResponse res {.CheckName = GetCheckName()};
  54. TPGParseEventsHandler handler(res);
  55. PGParse(request.Program, handler);
  56. return res;
  57. }
  58. TCheckResponse RunYql(const TChecksRequest& request) {
  59. TCheckResponse res {.CheckName = GetCheckName()};
  60. NSQLTranslation::TTranslationSettings settings;
  61. settings.SyntaxVersion = request.SyntaxVersion;
  62. settings.AnsiLexer = request.IsAnsiLexer;
  63. settings.Antlr4Parser = true;
  64. settings.File = request.File;
  65. if (!ParseTranslationSettings(request.Program, settings, res.Issues)) {
  66. return res;
  67. }
  68. NSQLTranslationV1::TLexers lexers;
  69. lexers.Antlr4 = NSQLTranslationV1::MakeAntlr4LexerFactory();
  70. lexers.Antlr4Ansi = NSQLTranslationV1::MakeAntlr4AnsiLexerFactory();
  71. auto lexer = NSQLTranslationV1::MakeLexer(lexers, settings.AnsiLexer, true);
  72. auto onNextToken = [&](NSQLTranslation::TParsedToken&& token) {
  73. Y_UNUSED(token);
  74. };
  75. if (lexer->Tokenize(request.Program, request.File, onNextToken, res.Issues, NSQLTranslation::SQL_MAX_PARSER_ERRORS)) {
  76. google::protobuf::Arena arena;
  77. NSQLTranslationV1::TParsers parsers;
  78. parsers.Antlr4 = NSQLTranslationV1::MakeAntlr4ParserFactory();
  79. parsers.Antlr4Ansi = NSQLTranslationV1::MakeAntlr4AnsiParserFactory();
  80. auto msg = NSQLTranslationV1::SqlAST(parsers, request.Program, request.File, res.Issues, NSQLTranslation::SQL_MAX_PARSER_ERRORS,
  81. settings.AnsiLexer, true, &arena);
  82. if (msg) {
  83. res.Success = true;
  84. }
  85. }
  86. return res;
  87. }
  88. };
  89. }
  90. std::unique_ptr<ICheckRunner> MakeParserRunner() {
  91. return std::make_unique<TParserRunner>();
  92. }
  93. }
  94. }