KDevelop API Documentation

lib/antlr/src/Parser.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: Parser.cpp,v 1.2 2003/05/02 00:36:20 okellogg Exp $ 00006 */ 00007 00008 #include "antlr/Parser.hpp" 00009 00010 #include "antlr/BitSet.hpp" 00011 #include "antlr/TokenBuffer.hpp" 00012 #include "antlr/MismatchedTokenException.hpp" 00013 //#include "antlr/ASTFactory.hpp" 00014 #include <iostream> 00015 00016 #ifdef ANTLR_CXX_SUPPORTS_NAMESPACE 00017 namespace antlr { 00018 #endif 00019 ANTLR_C_USING(exit) 00020 00021 00055 bool DEBUG_PARSER=false; 00056 00057 Parser::Parser(TokenBuffer& input) 00058 : inputState(new ParserInputState(input)), astFactory(0), traceDepth(0) 00059 { 00060 } 00061 00062 Parser::Parser(TokenBuffer* input) 00063 : inputState(new ParserInputState(input)), astFactory(0), traceDepth(0) 00064 { 00065 } 00066 00067 Parser::Parser(const ParserSharedInputState& state) 00068 : inputState(state), astFactory(0), traceDepth(0) 00069 { 00070 } 00071 00072 Parser::~Parser() 00073 { 00074 } 00075 00077 void Parser::consumeUntil(int tokenType) 00078 { 00079 while (LA(1) != Token::EOF_TYPE && LA(1) != tokenType) 00080 consume(); 00081 } 00082 00084 void Parser::consumeUntil(const BitSet& set) 00085 { 00086 while (LA(1) != Token::EOF_TYPE && !set.member(LA(1))) 00087 consume(); 00088 } 00089 00094 void Parser::match(int t) 00095 { 00096 if ( DEBUG_PARSER ) 00097 { 00098 traceIndent(); 00099 ANTLR_USE_NAMESPACE(std)cout << "enter match(" << t << ") with LA(1)=" << LA(1) << ANTLR_USE_NAMESPACE(std)endl; 00100 } 00101 if ( LA(1)!=t ) { 00102 if ( DEBUG_PARSER ) 00103 { 00104 traceIndent(); 00105 ANTLR_USE_NAMESPACE(std)cout << "token mismatch: " << LA(1) << "!=" << t << ANTLR_USE_NAMESPACE(std)endl; 00106 } 00107 throw MismatchedTokenException(getTokenNames(), getNumTokens(), LT(1), t, false, getFilename()); 00108 } else { 00109 // mark token as consumed -- fetch next token deferred until LA/LT 00110 consume(); 00111 } 00112 } 00113 00118 void Parser::match(const BitSet& b) 00119 { 00120 if ( DEBUG_PARSER ) 00121 { 00122 traceIndent(); 00123 ANTLR_USE_NAMESPACE(std)cout << "enter match(" << "bitset" /*b.toString()*/ 00124 << ") with LA(1)=" << LA(1) << ANTLR_USE_NAMESPACE(std)endl; 00125 } 00126 if ( !b.member(LA(1)) ) { 00127 if ( DEBUG_PARSER ) 00128 { 00129 traceIndent(); 00130 ANTLR_USE_NAMESPACE(std)cout << "token mismatch: " << LA(1) << " not member of " 00131 << "bitset" /*b.toString()*/ << ANTLR_USE_NAMESPACE(std)endl; 00132 } 00133 throw MismatchedTokenException(getTokenNames(), getNumTokens(), LT(1), b, false, getFilename()); 00134 } else { 00135 // mark token as consumed -- fetch next token deferred until LA/LT 00136 consume(); 00137 } 00138 } 00139 00140 void Parser::matchNot(int t) 00141 { 00142 if ( LA(1)==t ) { 00143 // Throws inverted-sense exception 00144 throw MismatchedTokenException(getTokenNames(), getNumTokens(), LT(1), t, true, getFilename()); 00145 } else { 00146 // mark token as consumed -- fetch next token deferred until LA/LT 00147 consume(); 00148 } 00149 } 00150 00151 void Parser::panic() 00152 { 00153 ANTLR_USE_NAMESPACE(std)cerr << "Parser: panic" << ANTLR_USE_NAMESPACE(std)endl; 00154 exit(1); 00155 } 00156 00158 void Parser::reportError(const RecognitionException& ex) 00159 { 00160 ANTLR_USE_NAMESPACE(std)cerr << ex.toString().c_str() << ANTLR_USE_NAMESPACE(std)endl; 00161 } 00162 00164 void Parser::reportError(const ANTLR_USE_NAMESPACE(std)string& s) 00165 { 00166 if ( getFilename()=="" ) 00167 ANTLR_USE_NAMESPACE(std)cerr << "error: " << s.c_str() << ANTLR_USE_NAMESPACE(std)endl; 00168 else 00169 ANTLR_USE_NAMESPACE(std)cerr << getFilename().c_str() << ": error: " << s.c_str() << ANTLR_USE_NAMESPACE(std)endl; 00170 } 00171 00173 void Parser::reportWarning(const ANTLR_USE_NAMESPACE(std)string& s) 00174 { 00175 if ( getFilename()=="" ) 00176 ANTLR_USE_NAMESPACE(std)cerr << "warning: " << s.c_str() << ANTLR_USE_NAMESPACE(std)endl; 00177 else 00178 ANTLR_USE_NAMESPACE(std)cerr << getFilename().c_str() << ": warning: " << s.c_str() << ANTLR_USE_NAMESPACE(std)endl; 00179 } 00180 00182 // void setTokenBuffer(TokenBuffer<Token>* t); 00183 00184 void Parser::traceIndent() 00185 { 00186 for( int i = 0; i < traceDepth; i++ ) 00187 ANTLR_USE_NAMESPACE(std)cout << " "; 00188 } 00189 00190 void Parser::traceIn(const char* rname) 00191 { 00192 traceDepth++; 00193 00194 for( int i = 0; i < traceDepth; i++ ) 00195 ANTLR_USE_NAMESPACE(std)cout << " "; 00196 00197 ANTLR_USE_NAMESPACE(std)cout << "> " << rname 00198 << "; LA(1)==" << LT(1)->getText().c_str() 00199 << ((inputState->guessing>0)?" [guessing]":"") 00200 << ANTLR_USE_NAMESPACE(std)endl; 00201 } 00202 00203 void Parser::traceOut(const char* rname) 00204 { 00205 for( int i = 0; i < traceDepth; i++ ) 00206 ANTLR_USE_NAMESPACE(std)cout << " "; 00207 00208 ANTLR_USE_NAMESPACE(std)cout << "< " << rname 00209 << "; LA(1)==" << LT(1)->getText().c_str() 00210 << ((inputState->guessing>0)?" [guessing]":"") 00211 << ANTLR_USE_NAMESPACE(std)endl; 00212 00213 traceDepth--; 00214 } 00215 00216 #ifdef ANTLR_CXX_SUPPORTS_NAMESPACE 00217 } 00218 #endif
KDE Logo
This file is part of the documentation for KDevelop Version 3.0.4.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Oct 6 17:39:06 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003