KDevelop API Documentation

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 
KDE Logo
This file is part of the documentation for KDevelop Version 3.1.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Mar 23 00:03:50 2005 by doxygen 1.3.9.1 written by Dimitri van Heesch, © 1997-2003