ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-2.0/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

# User Rev Content
1 tim 2469 #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__