/* 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 "CommonToken.h" #include "CharStream.h" #include "ListTokenSource.h" using namespace antlr4; ListTokenSource::ListTokenSource(std::vector> tokens_) : ListTokenSource(std::move(tokens_), "") { } ListTokenSource::ListTokenSource(std::vector> tokens_, const std::string &sourceName_) : tokens(std::move(tokens_)), sourceName(sourceName_) { InitializeInstanceFields(); if (tokens.empty()) { throw "tokens cannot be null"; } // Check if there is an eof token and create one if not. if (tokens.back()->getType() != Token::EOF) { Token *lastToken = tokens.back().get(); size_t start = INVALID_INDEX; size_t previousStop = lastToken->getStopIndex(); if (previousStop != INVALID_INDEX) { start = previousStop + 1; } size_t stop = std::max(INVALID_INDEX, start - 1); tokens.emplace_back((_factory->create({ this, getInputStream() }, Token::EOF, "EOF", Token::DEFAULT_CHANNEL, start, stop, static_cast(lastToken->getLine()), lastToken->getCharPositionInLine()))); } } size_t ListTokenSource::getCharPositionInLine() { if (i < tokens.size()) { return tokens[i]->getCharPositionInLine(); } return 0; } std::unique_ptr ListTokenSource::nextToken() { if (i < tokens.size()) { return std::move(tokens[i++]); } return nullptr; } size_t ListTokenSource::getLine() const { if (i < tokens.size()) { return tokens[i]->getLine(); } return 1; } CharStream *ListTokenSource::getInputStream() { if (i < tokens.size()) { return tokens[i]->getInputStream(); } else if (!tokens.empty()) { return tokens.back()->getInputStream(); } // no input stream information is available return nullptr; } std::string ListTokenSource::getSourceName() { if (sourceName != "") { return sourceName; } CharStream *inputStream = getInputStream(); if (inputStream != nullptr) { return inputStream->getSourceName(); } return "List"; } Ref> ListTokenSource::getTokenFactory() { return _factory; } void ListTokenSource::InitializeInstanceFields() { i = 0; _factory = CommonTokenFactory::DEFAULT; }