1
/* ANTLR Translator Generator
2
* Project led by Terence Parr at http://www.jGuru.com
3
* Software rights: http://www.antlr.org/RIGHTS.html
6
#include "antlr/TokenStreamSelector.hpp"
7
#include "antlr/TokenStreamRetryException.hpp"
9
#ifdef ANTLR_CXX_SUPPORTS_NAMESPACE
13
/** A token stream MUX (multiplexor) knows about n token streams
14
* and can multiplex them onto the same channel for use by token
15
* stream consumer like a parser. This is a way to have multiple
16
* lexers break up the same input stream for a single parser.
17
* Or, you can have multiple instances of the same lexer handle
18
* multiple input streams; this works great for includes.
21
TokenStreamSelector::TokenStreamSelector()
26
TokenStreamSelector::~TokenStreamSelector()
30
void TokenStreamSelector::addInputStream(TokenStream* stream, const ANTLR_USE_NAMESPACE(std)string& key)
32
inputStreamNames[key] = stream;
35
TokenStream* TokenStreamSelector::getCurrentStream() const
40
TokenStream* TokenStreamSelector::getStream(const ANTLR_USE_NAMESPACE(std)string& sname) const
42
inputStreamNames_coll::const_iterator i = inputStreamNames.find(sname);
43
if (i == inputStreamNames.end()) {
44
throw ANTLR_USE_NAMESPACE(std)string("TokenStream ")+sname+" not found";
49
RefToken TokenStreamSelector::nextToken()
51
// keep looking for a token until you don't
52
// get a retry exception
55
return input->nextToken();
57
catch (TokenStreamRetryException& r) {
58
// just retry "forever"
63
TokenStream* TokenStreamSelector::pop()
65
TokenStream* stream = streamStack.top();
71
void TokenStreamSelector::push(TokenStream* stream)
73
streamStack.push(input);
77
void TokenStreamSelector::push(const ANTLR_USE_NAMESPACE(std)string& sname)
79
streamStack.push(input);
83
void TokenStreamSelector::retry()
85
throw TokenStreamRetryException();
88
/** Set the stream without pushing old stream */
89
void TokenStreamSelector::select(TokenStream* stream)
94
void TokenStreamSelector::select(const ANTLR_USE_NAMESPACE(std)string& sname)
96
inputStreamNames_coll::const_iterator i = inputStreamNames.find(sname);
97
if (i == inputStreamNames.end()) {
98
throw ANTLR_USE_NAMESPACE(std)string("TokenStream ")+sname+" not found";
103
#ifdef ANTLR_CXX_SUPPORTS_NAMESPACE