diff options
| author | Patrick Schönberger | 2021-08-14 14:56:12 +0200 |
|---|---|---|
| committer | Patrick Schönberger | 2021-08-14 14:56:12 +0200 |
| commit | c6ad2948bb98d42f8e0883ef82cd14cd2d5eda60 (patch) | |
| tree | 9e83d6d8f61e56f5d3425b8709314d6bdb9315a9 /antlr4-cpp-runtime-4.9.2-source/runtime/src/ListTokenSource.cpp | |
| parent | 9f94b672a5dc32da5ad01742bd4e976315a30d9c (diff) | |
| download | toc-main.tar.gz toc-main.zip | |
Diffstat (limited to 'antlr4-cpp-runtime-4.9.2-source/runtime/src/ListTokenSource.cpp')
| -rw-r--r-- | antlr4-cpp-runtime-4.9.2-source/runtime/src/ListTokenSource.cpp | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/antlr4-cpp-runtime-4.9.2-source/runtime/src/ListTokenSource.cpp b/antlr4-cpp-runtime-4.9.2-source/runtime/src/ListTokenSource.cpp new file mode 100644 index 0000000..ec93cb9 --- /dev/null +++ b/antlr4-cpp-runtime-4.9.2-source/runtime/src/ListTokenSource.cpp @@ -0,0 +1,92 @@ +/* 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<std::unique_ptr<Token>> tokens_) : ListTokenSource(std::move(tokens_), "") { +} + +ListTokenSource::ListTokenSource(std::vector<std::unique_ptr<Token>> 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<int>(lastToken->getLine()), lastToken->getCharPositionInLine()))); + } +} + +size_t ListTokenSource::getCharPositionInLine() { + if (i < tokens.size()) { + return tokens[i]->getCharPositionInLine(); + } + return 0; +} + +std::unique_ptr<Token> 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"; +} + +TokenFactory<CommonToken>* ListTokenSource::getTokenFactory() { + return _factory; +} + +void ListTokenSource::InitializeInstanceFields() { + i = 0; + _factory = CommonTokenFactory::DEFAULT.get(); +} |
