parser.cpp 2.9 KB

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