lib/antlr/src/TokenStreamHiddenTokenFilter.cpp
Go to the documentation of this file.00001 /* ANTLR Translator Generator 00002 * Project led by Terence Parr at http://www.jGuru.com 00003 * Software rights: http://www.antlr.org/RIGHTS.html 00004 * 00005 * $Id: TokenStreamHiddenTokenFilter.cpp,v 1.3 2003/12/26 22:56:34 harald Exp $ 00006 */ 00007 #include "antlr/TokenStreamHiddenTokenFilter.hpp" 00008 #include "antlr/CommonHiddenStreamToken.hpp" 00009 00010 #ifdef ANTLR_CXX_SUPPORTS_NAMESPACE 00011 namespace antlr { 00012 #endif 00013 00022 TokenStreamHiddenTokenFilter::TokenStreamHiddenTokenFilter(TokenStream& input) 00023 : TokenStreamBasicFilter(input) 00024 { 00025 } 00026 00027 void TokenStreamHiddenTokenFilter::consume() 00028 { 00029 nextMonitoredToken = input->nextToken(); 00030 } 00031 00032 void TokenStreamHiddenTokenFilter::consumeFirst() 00033 { 00034 consume(); 00035 00036 // Handle situation where hidden or discarded tokens 00037 // appear first in input stream 00038 RefToken p; 00039 // while hidden or discarded scarf tokens 00040 while ( hideMask.member(LA(1)->getType()) || discardMask.member(LA(1)->getType()) ) { 00041 if ( hideMask.member(LA(1)->getType()) ) { 00042 if ( !p ) { 00043 p = LA(1); 00044 } 00045 else { 00046 static_cast<CommonHiddenStreamToken*>(p.get())->setHiddenAfter(LA(1)); 00047 static_cast<CommonHiddenStreamToken*>(LA(1).get())->setHiddenBefore(p); // double-link 00048 p = LA(1); 00049 } 00050 lastHiddenToken = p; 00051 if (!firstHidden) 00052 firstHidden = p; // record hidden token if first 00053 } 00054 consume(); 00055 } 00056 } 00057 00058 BitSet TokenStreamHiddenTokenFilter::getDiscardMask() const 00059 { 00060 return discardMask; 00061 } 00062 00066 RefToken TokenStreamHiddenTokenFilter::getHiddenAfter(RefToken t) 00067 { 00068 return static_cast<CommonHiddenStreamToken*>(t.get())->getHiddenAfter(); 00069 } 00070 00074 RefToken TokenStreamHiddenTokenFilter::getHiddenBefore(RefToken t) 00075 { 00076 return static_cast<CommonHiddenStreamToken*>(t.get())->getHiddenBefore(); 00077 } 00078 00079 BitSet TokenStreamHiddenTokenFilter::getHideMask() const 00080 { 00081 return hideMask; 00082 } 00083 00087 RefToken TokenStreamHiddenTokenFilter::getInitialHiddenToken() 00088 { 00089 return firstHidden; 00090 } 00091 00092 void TokenStreamHiddenTokenFilter::hide(int m) 00093 { 00094 hideMask.add(m); 00095 } 00096 00097 void TokenStreamHiddenTokenFilter::hide(const BitSet& mask) 00098 { 00099 hideMask = mask; 00100 } 00101 00102 RefToken TokenStreamHiddenTokenFilter::LA(int /*i*/) 00103 { 00104 return nextMonitoredToken; 00105 } 00106 00117 RefToken TokenStreamHiddenTokenFilter::nextToken() 00118 { 00119 // handle an initial condition; don't want to get lookahead 00120 // token of this splitter until first call to nextToken 00121 if ( !LA(1) ) { 00122 consumeFirst(); 00123 } 00124 00125 // we always consume hidden tokens after monitored, thus, 00126 // upon entry LA(1) is a monitored token. 00127 RefToken monitored = LA(1); 00128 // point to hidden tokens found during last invocation 00129 static_cast<CommonHiddenStreamToken*>(monitored.get())->setHiddenBefore(lastHiddenToken); 00130 lastHiddenToken = nullToken; 00131 00132 // Look for hidden tokens, hook them into list emanating 00133 // from the monitored tokens. 00134 consume(); 00135 RefToken p = monitored; 00136 // while hidden or discarded scarf tokens 00137 while ( hideMask.member(LA(1)->getType()) || discardMask.member(LA(1)->getType()) ) { 00138 if ( hideMask.member(LA(1)->getType()) ) { 00139 // attach the hidden token to the monitored in a chain 00140 // link forwards 00141 static_cast<CommonHiddenStreamToken*>(p.get())->setHiddenAfter(LA(1)); 00142 // link backwards 00143 if (p != monitored) { //hidden cannot point to monitored tokens 00144 static_cast<CommonHiddenStreamToken*>(LA(1).get())->setHiddenBefore(p); 00145 } 00146 p = lastHiddenToken = LA(1); 00147 } 00148 consume(); 00149 } 00150 return monitored; 00151 } 00152 00153 #ifdef ANTLR_CXX_SUPPORTS_NAMESPACE 00154 } 00155 #endif 00156