| /* 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 "TokenSource.h" |
| #include "CharStream.h" |
| #include "Recognizer.h" |
| #include "Vocabulary.h" |
| |
| #include "misc/Interval.h" |
| |
| #include "support/StringUtils.h" |
| #include "support/CPPUtils.h" |
| |
| #include "CommonToken.h" |
| |
| using namespace antlr4; |
| using namespace antlr4::misc; |
| |
| using namespace antlrcpp; |
| |
| const std::pair<TokenSource*, CharStream*> CommonToken::EMPTY_SOURCE; |
| |
| CommonToken::CommonToken(size_t type) { |
| InitializeInstanceFields(); |
| _type = type; |
| } |
| |
| CommonToken::CommonToken(std::pair<TokenSource*, CharStream*> source, size_t type, size_t channel, size_t start, size_t stop) { |
| InitializeInstanceFields(); |
| _source = source; |
| _type = type; |
| _channel = channel; |
| _start = start; |
| _stop = stop; |
| if (_source.first != nullptr) { |
| _line = static_cast<int>(source.first->getLine()); |
| _charPositionInLine = source.first->getCharPositionInLine(); |
| } |
| } |
| |
| CommonToken::CommonToken(size_t type, const std::string &text) { |
| InitializeInstanceFields(); |
| _type = type; |
| _channel = DEFAULT_CHANNEL; |
| _text = text; |
| _source = EMPTY_SOURCE; |
| } |
| |
| CommonToken::CommonToken(Token *oldToken) { |
| InitializeInstanceFields(); |
| _type = oldToken->getType(); |
| _line = oldToken->getLine(); |
| _index = oldToken->getTokenIndex(); |
| _charPositionInLine = oldToken->getCharPositionInLine(); |
| _channel = oldToken->getChannel(); |
| _start = oldToken->getStartIndex(); |
| _stop = oldToken->getStopIndex(); |
| |
| if (is<CommonToken *>(oldToken)) { |
| _text = (static_cast<CommonToken *>(oldToken))->_text; |
| _source = (static_cast<CommonToken *>(oldToken))->_source; |
| } else { |
| _text = oldToken->getText(); |
| _source = { oldToken->getTokenSource(), oldToken->getInputStream() }; |
| } |
| } |
| |
| size_t CommonToken::getType() const { |
| return _type; |
| } |
| |
| void CommonToken::setLine(size_t line) { |
| _line = line; |
| } |
| |
| std::string CommonToken::getText() const { |
| if (!_text.empty()) { |
| return _text; |
| } |
| |
| CharStream *input = getInputStream(); |
| if (input == nullptr) { |
| return ""; |
| } |
| size_t n = input->size(); |
| if (_start < n && _stop < n) { |
| return input->getText(misc::Interval(_start, _stop)); |
| } else { |
| return "<EOF>"; |
| } |
| } |
| |
| void CommonToken::setText(const std::string &text) { |
| _text = text; |
| } |
| |
| size_t CommonToken::getLine() const { |
| return _line; |
| } |
| |
| size_t CommonToken::getCharPositionInLine() const { |
| return _charPositionInLine; |
| } |
| |
| void CommonToken::setCharPositionInLine(size_t charPositionInLine) { |
| _charPositionInLine = charPositionInLine; |
| } |
| |
| size_t CommonToken::getChannel() const { |
| return _channel; |
| } |
| |
| void CommonToken::setChannel(size_t channel) { |
| _channel = channel; |
| } |
| |
| void CommonToken::setType(size_t type) { |
| _type = type; |
| } |
| |
| size_t CommonToken::getStartIndex() const { |
| return _start; |
| } |
| |
| void CommonToken::setStartIndex(size_t start) { |
| _start = start; |
| } |
| |
| size_t CommonToken::getStopIndex() const { |
| return _stop; |
| } |
| |
| void CommonToken::setStopIndex(size_t stop) { |
| _stop = stop; |
| } |
| |
| size_t CommonToken::getTokenIndex() const { |
| return _index; |
| } |
| |
| void CommonToken::setTokenIndex(size_t index) { |
| _index = index; |
| } |
| |
| antlr4::TokenSource *CommonToken::getTokenSource() const { |
| return _source.first; |
| } |
| |
| antlr4::CharStream *CommonToken::getInputStream() const { |
| return _source.second; |
| } |
| |
| std::string CommonToken::toString() const { |
| return toString(nullptr); |
| } |
| |
| std::string CommonToken::toString(Recognizer *r) const { |
| std::stringstream ss; |
| |
| std::string channelStr; |
| if (_channel > 0) { |
| channelStr = ",channel=" + std::to_string(_channel); |
| } |
| std::string txt = getText(); |
| if (!txt.empty()) { |
| antlrcpp::replaceAll(txt, "\n", "\\n"); |
| antlrcpp::replaceAll(txt, "\r", "\\r"); |
| antlrcpp::replaceAll(txt, "\t", "\\t"); |
| } else { |
| txt = "<no text>"; |
| } |
| |
| std::string typeString = std::to_string(symbolToNumeric(_type)); |
| if (r != nullptr) |
| typeString = r->getVocabulary().getDisplayName(_type); |
| |
| ss << "[@" << symbolToNumeric(getTokenIndex()) << "," << symbolToNumeric(_start) << ":" << symbolToNumeric(_stop) |
| << "='" << txt << "',<" << typeString << ">" << channelStr << "," << _line << ":" |
| << getCharPositionInLine() << "]"; |
| |
| return ss.str(); |
| } |
| |
| void CommonToken::InitializeInstanceFields() { |
| _type = 0; |
| _line = 0; |
| _charPositionInLine = INVALID_INDEX; |
| _channel = DEFAULT_CHANNEL; |
| _index = INVALID_INDEX; |
| _start = 0; |
| _stop = 0; |
| _source = EMPTY_SOURCE; |
| } |