Parser.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008 #include "antlr/Parser.hpp"
00009
00010 #include "antlr/BitSet.hpp"
00011 #include "antlr/TokenBuffer.hpp"
00012 #include "antlr/MismatchedTokenException.hpp"
00013
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
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"
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" << ANTLR_USE_NAMESPACE(std)endl;
00132 }
00133 throw MismatchedTokenException(getTokenNames(), getNumTokens(), LT(1), b, false, getFilename());
00134 } else {
00135
00136 consume();
00137 }
00138 }
00139
00140 void Parser::matchNot(int t)
00141 {
00142 if ( LA(1)==t ) {
00143
00144 throw MismatchedTokenException(getTokenNames(), getNumTokens(), LT(1), t, true, getFilename());
00145 } else {
00146
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
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
This file is part of the documentation for KDevelop Version 3.1.2.