| /* 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. |
| */ |
| |
| #pragma once |
| |
| #include "TokenSource.h" |
| #include "CommonTokenFactory.h" |
| |
| namespace antlr4 { |
| |
| /// Provides an implementation of <seealso cref="TokenSource"/> as a wrapper around a list |
| /// of <seealso cref="Token"/> objects. |
| /// |
| /// If the final token in the list is an <seealso cref="Token#EOF"/> token, it will be used |
| /// as the EOF token for every call to <seealso cref="#nextToken"/> after the end of the |
| /// list is reached. Otherwise, an EOF token will be created. |
| class ANTLR4CPP_PUBLIC ListTokenSource : public TokenSource { |
| protected: |
| // This list will be emptied token by token as we call nextToken(). |
| // Token streams can be used to buffer tokens for a while. |
| std::vector<std::unique_ptr<Token>> tokens; |
| |
| private: |
| /// <summary> |
| /// The name of the input source. If this value is {@code null}, a call to |
| /// <seealso cref="#getSourceName"/> should return the source name used to create the |
| /// the next token in <seealso cref="#tokens"/> (or the previous token if the end of |
| /// the input has been reached). |
| /// </summary> |
| const std::string sourceName; |
| |
| protected: |
| /// The index into <seealso cref="#tokens"/> of token to return by the next call to |
| /// <seealso cref="#nextToken"/>. The end of the input is indicated by this value |
| /// being greater than or equal to the number of items in <seealso cref="#tokens"/>. |
| size_t i; |
| |
| private: |
| /// This is the backing field for <seealso cref="#getTokenFactory"/> and |
| /// <seealso cref="setTokenFactory"/>. |
| TokenFactory<CommonToken> *_factory = CommonTokenFactory::DEFAULT.get(); |
| |
| public: |
| /// Constructs a new <seealso cref="ListTokenSource"/> instance from the specified |
| /// collection of <seealso cref="Token"/> objects. |
| /// |
| /// <param name="tokens"> The collection of <seealso cref="Token"/> objects to provide as a |
| /// <seealso cref="TokenSource"/>. </param> |
| /// <exception cref="NullPointerException"> if {@code tokens} is {@code null} </exception> |
| ListTokenSource(std::vector<std::unique_ptr<Token>> tokens); |
| ListTokenSource(const ListTokenSource& other) = delete; |
| |
| ListTokenSource& operator = (const ListTokenSource& other) = delete; |
| |
| /// <summary> |
| /// Constructs a new <seealso cref="ListTokenSource"/> instance from the specified |
| /// collection of <seealso cref="Token"/> objects and source name. |
| /// </summary> |
| /// <param name="tokens"> The collection of <seealso cref="Token"/> objects to provide as a |
| /// <seealso cref="TokenSource"/>. </param> |
| /// <param name="sourceName"> The name of the <seealso cref="TokenSource"/>. If this value is |
| /// {@code null}, <seealso cref="#getSourceName"/> will attempt to infer the name from |
| /// the next <seealso cref="Token"/> (or the previous token if the end of the input has |
| /// been reached). |
| /// </param> |
| /// <exception cref="NullPointerException"> if {@code tokens} is {@code null} </exception> |
| ListTokenSource(std::vector<std::unique_ptr<Token>> tokens_, const std::string &sourceName_); |
| |
| virtual size_t getCharPositionInLine() override; |
| virtual std::unique_ptr<Token> nextToken() override; |
| virtual size_t getLine() const override; |
| virtual CharStream* getInputStream() override; |
| virtual std::string getSourceName() override; |
| |
| template<typename T1> |
| void setTokenFactory(TokenFactory<T1> *factory) { |
| this->_factory = factory; |
| } |
| |
| virtual TokenFactory<CommonToken>* getTokenFactory() override; |
| |
| private: |
| void InitializeInstanceFields(); |
| }; |
| |
| } // namespace antlr4 |