KDevelop API Documentation

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.1.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Tue Feb 22 09:22:34 2005 by doxygen 1.3.9.1 written by Dimitri van Heesch, © 1997-2003