#include "grammar.h" #include namespace NSQLComplete { class TSqlGrammar: public ISqlGrammar { public: TSqlGrammar(const NSQLReflect::TLexerGrammar& grammar) : Parser_(MakeDummyParser()) , AllTokens_(ComputeAllTokens()) , KeywordTokens_(ComputeKeywordTokens(grammar)) , PunctuationTokens_(ComputePunctuationTokens(grammar)) { } const antlr4::dfa::Vocabulary& GetVocabulary() const override { return Parser_->getVocabulary(); } const std::unordered_set& GetAllTokens() const override { return AllTokens_; } const std::unordered_set& GetKeywordTokens() const override { return KeywordTokens_; } const std::unordered_set& GetPunctuationTokens() const override { return PunctuationTokens_; } const std::string& SymbolizedRule(TRuleId rule) const override { return Parser_->getRuleNames().at(rule); } private: static THolder MakeDummyParser() { return MakeHolder(nullptr); } std::unordered_set ComputeAllTokens() { const auto& vocabulary = GetVocabulary(); std::unordered_set allTokens; for (size_t type = 1; type <= vocabulary.getMaxTokenType(); ++type) { allTokens.emplace(type); } return allTokens; } std::unordered_set ComputeKeywordTokens( const NSQLReflect::TLexerGrammar& grammar) { const auto& vocabulary = GetVocabulary(); auto keywordTokens = GetAllTokens(); std::erase_if(keywordTokens, [&](TTokenId token) { return !grammar.KeywordNames.contains(vocabulary.getSymbolicName(token)); }); keywordTokens.erase(TOKEN_EOF); return keywordTokens; } std::unordered_set ComputePunctuationTokens( const NSQLReflect::TLexerGrammar& grammar) { const auto& vocabulary = GetVocabulary(); auto punctuationTokens = GetAllTokens(); std::erase_if(punctuationTokens, [&](TTokenId token) { return !grammar.PunctuationNames.contains(vocabulary.getSymbolicName(token)); }); return punctuationTokens; } const THolder Parser_; const std::unordered_set AllTokens_; const std::unordered_set KeywordTokens_; const std::unordered_set PunctuationTokens_; }; const ISqlGrammar& GetSqlGrammar() { const static TSqlGrammar DefaultSqlGrammar(NSQLReflect::LoadLexerGrammar()); return DefaultSqlGrammar; } } // namespace NSQLComplete