| /* Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. |
| * Use of this file is governed by the BSD 3-clause license that |
| * can be found in the LICENSE.txt file in the project root. |
| */ |
| |
| #include "Token.h" |
| |
| #include "Vocabulary.h" |
| |
| using namespace antlr4::dfa; |
| |
| const Vocabulary Vocabulary::EMPTY_VOCABULARY; |
| |
| Vocabulary::Vocabulary(const std::vector<std::string> &literalNames, const std::vector<std::string> &symbolicNames) |
| : Vocabulary(literalNames, symbolicNames, {}) { |
| } |
| |
| Vocabulary::Vocabulary(const std::vector<std::string> &literalNames, |
| const std::vector<std::string> &symbolicNames, const std::vector<std::string> &displayNames) |
| : _literalNames(literalNames), _symbolicNames(symbolicNames), _displayNames(displayNames), |
| _maxTokenType(std::max(_displayNames.size(), std::max(_literalNames.size(), _symbolicNames.size())) - 1) { |
| // See note here on -1 part: https://github.com/antlr/antlr4/pull/1146 |
| } |
| |
| Vocabulary::~Vocabulary() = default; |
| |
| Vocabulary Vocabulary::fromTokenNames(const std::vector<std::string> &tokenNames) { |
| if (tokenNames.empty()) { |
| return EMPTY_VOCABULARY; |
| } |
| |
| std::vector<std::string> literalNames = tokenNames; |
| std::vector<std::string> symbolicNames = tokenNames; |
| std::locale locale; |
| for (size_t i = 0; i < tokenNames.size(); i++) { |
| const std::string& tokenName = tokenNames[i]; |
| if (tokenName.empty()) { |
| continue; |
| } else if (tokenName.front() == '\'') { |
| symbolicNames[i].clear(); |
| } else if (std::isupper(tokenName.front(), locale)) { |
| literalNames[i].clear(); |
| } else { |
| // wasn't a literal or symbolic name |
| literalNames[i].clear(); |
| symbolicNames[i].clear(); |
| } |
| } |
| |
| return Vocabulary(literalNames, symbolicNames, tokenNames); |
| } |
| |
| size_t Vocabulary::getMaxTokenType() const { |
| return _maxTokenType; |
| } |
| |
| std::string Vocabulary::getLiteralName(size_t tokenType) const { |
| if (tokenType < _literalNames.size()) { |
| return _literalNames[tokenType]; |
| } |
| |
| return ""; |
| } |
| |
| std::string Vocabulary::getSymbolicName(size_t tokenType) const { |
| if (tokenType == Token::EOF) { |
| return "EOF"; |
| } |
| |
| if (tokenType < _symbolicNames.size()) { |
| return _symbolicNames[tokenType]; |
| } |
| |
| return ""; |
| } |
| |
| std::string Vocabulary::getDisplayName(size_t tokenType) const { |
| if (tokenType < _displayNames.size()) { |
| std::string displayName = _displayNames[tokenType]; |
| if (!displayName.empty()) { |
| return displayName; |
| } |
| } |
| |
| std::string literalName = getLiteralName(tokenType); |
| if (!literalName.empty()) { |
| return literalName; |
| } |
| |
| std::string symbolicName = getSymbolicName(tokenType); |
| if (!symbolicName.empty()) { |
| return symbolicName; |
| } |
| |
| return std::to_string(tokenType); |
| } |