ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-4/src/antlr/TokenStreamSelector.hpp
Revision: 2469
Committed: Fri Dec 2 15:38:03 2005 UTC (18 years, 7 months ago) by tim
File size: 2742 byte(s)
Log Message:
End of the Link --> List
Return of the Oject-Oriented
replace yacc/lex parser with antlr parser

File Contents

# Content
1 #ifndef INC_TokenStreamSelector_hpp__
2 #define INC_TokenStreamSelector_hpp__
3
4 /* ANTLR Translator Generator
5 * Project led by Terence Parr at http://www.jGuru.com
6 * Software rights: http://www.antlr.org/license.html
7 *
8 * $Id: TokenStreamSelector.hpp,v 1.1 2005-12-02 15:38:02 tim Exp $
9 */
10
11 #include <antlr/config.hpp>
12 #include <antlr/TokenStream.hpp>
13 #include <map>
14 #include <stack>
15
16 #ifdef ANTLR_CXX_SUPPORTS_NAMESPACE
17 namespace antlr {
18 #endif
19
20 /** A token stream MUX (multiplexor) knows about n token streams
21 * and can multiplex them onto the same channel for use by token
22 * stream consumer like a parser. This is a way to have multiple
23 * lexers break up the same input stream for a single parser.
24 * Or, you can have multiple instances of the same lexer handle
25 * multiple input streams; this works great for includes.
26 */
27 class ANTLR_API TokenStreamSelector : public TokenStream {
28 protected:
29 /** The set of inputs to the MUX */
30 #ifdef OS_NO_ALLOCATOR
31 typedef ANTLR_USE_NAMESPACE(std)less<ANTLR_USE_NAMESPACE(std)string> lessp;
32 typedef ANTLR_USE_NAMESPACE(std)map<ANTLR_USE_NAMESPACE(std)string,TokenStream*,lessp> inputStreamNames_coll;
33 #else
34 typedef ANTLR_USE_NAMESPACE(std)map<ANTLR_USE_NAMESPACE(std)string,TokenStream*> inputStreamNames_coll;
35 #endif
36 inputStreamNames_coll inputStreamNames;
37
38 /** The currently-selected token stream input */
39 TokenStream* input;
40
41 /** Used to track stack of input streams */
42 #ifdef OS_NO_ALLOCATOR
43 typedef ANTLR_USE_NAMESPACE(std)stack<TokenStream*, ANTLR_USE_NAMESPACE(std)deque<TokenStream*> > streamStack_coll;
44 #else
45 typedef ANTLR_USE_NAMESPACE(std)stack<TokenStream*> streamStack_coll;
46 #endif
47 streamStack_coll streamStack;
48
49 public:
50 TokenStreamSelector();
51 ~TokenStreamSelector();
52
53 void addInputStream(TokenStream* stream, const ANTLR_USE_NAMESPACE(std)string& key);
54
55 /// Return the stream from which tokens are being pulled at the moment.
56 TokenStream* getCurrentStream() const;
57
58 TokenStream* getStream(const ANTLR_USE_NAMESPACE(std)string& sname) const;
59
60 RefToken nextToken();
61
62 TokenStream* pop();
63
64 void push(TokenStream* stream);
65
66 void push(const ANTLR_USE_NAMESPACE(std)string& sname);
67
68 /** Abort recognition of current Token and try again.
69 * A stream can push a new stream (for include files
70 * for example, and then retry(), which will cause
71 * the current stream to abort back to this.nextToken().
72 * this.nextToken() then asks for a token from the
73 * current stream, which is the new "substream."
74 */
75 void retry();
76
77 /** Set the stream without pushing old stream */
78 void select(TokenStream* stream);
79
80 void select(const ANTLR_USE_NAMESPACE(std)string& sname);
81 };
82
83 #ifdef ANTLR_CXX_SUPPORTS_NAMESPACE
84 }
85 #endif
86
87 #endif //INC_TokenStreamSelector_hpp__