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