lexer.cpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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/settings/translation_settings.h>
  6. namespace NYql {
  7. namespace NFastCheck {
  8. namespace {
  9. class TLexerRunner : public ICheckRunner {
  10. public:
  11. TString GetCheckName() const final {
  12. return "lexer";
  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. Y_UNUSED(request);
  27. // no separate check for lexer here
  28. return TCheckResponse{.CheckName = GetCheckName(), .Success = true};
  29. }
  30. TCheckResponse RunPg(const TChecksRequest& request) {
  31. Y_UNUSED(request);
  32. // no separate check for lexer here
  33. return TCheckResponse{.CheckName = GetCheckName(), .Success = true};
  34. }
  35. TCheckResponse RunYql(const TChecksRequest& request) {
  36. TCheckResponse res {.CheckName = GetCheckName()};
  37. NSQLTranslation::TTranslationSettings settings;
  38. settings.SyntaxVersion = request.SyntaxVersion;
  39. settings.AnsiLexer = request.IsAnsiLexer;
  40. settings.File = request.File;
  41. if (!ParseTranslationSettings(request.Program, settings, res.Issues)) {
  42. return res;
  43. }
  44. NSQLTranslationV1::TLexers lexers;
  45. lexers.Antlr4 = NSQLTranslationV1::MakeAntlr4LexerFactory();
  46. lexers.Antlr4Ansi = NSQLTranslationV1::MakeAntlr4AnsiLexerFactory();
  47. auto lexer = NSQLTranslationV1::MakeLexer(lexers, settings.AnsiLexer, true);
  48. auto onNextToken = [&](NSQLTranslation::TParsedToken&& token) {
  49. Y_UNUSED(token);
  50. };
  51. if (lexer->Tokenize(request.Program, request.File, onNextToken, res.Issues, NSQLTranslation::SQL_MAX_PARSER_ERRORS)) {
  52. res.Success = true;
  53. }
  54. return res;
  55. }
  56. };
  57. }
  58. std::unique_ptr<ICheckRunner> MakeLexerRunner() {
  59. return std::make_unique<TLexerRunner>();
  60. }
  61. }
  62. }