00001
00002
00003
00004
00005
00006
00007
00008
#include <map>
00009
00010
#include <iostream>
00011
00012
#ifdef HAS_NOT_CSTRING_H
00013
#include <string>
00014
#else
00015
#include <cstring>
00016
#endif
00017
00018
#include "antlr/CharScanner.hpp"
00019
#include "antlr/CommonToken.hpp"
00020
00021
#ifdef ANTLR_CXX_SUPPORTS_NAMESPACE
00022
namespace antlr {
00023
#endif
00024
ANTLR_C_USING(exit)
00025
00026 CharScanner::
CharScanner(
InputBuffer& cb,
bool case_sensitive )
00027 : saveConsumedInput(true)
00028 , caseSensitive(case_sensitive)
00029 , literals(
CharScannerLiteralsLess(this))
00030 , inputState(new
LexerInputState(cb))
00031 , commitToPath(false)
00032 , tabsize(8)
00033 , traceDepth(0)
00034 {
00035 setTokenObjectFactory(&CommonToken::factory);
00036 }
00037
00038 CharScanner::CharScanner(
InputBuffer* cb,
bool case_sensitive )
00039 : saveConsumedInput(true)
00040 , caseSensitive(case_sensitive)
00041 , literals(
CharScannerLiteralsLess(this))
00042 , inputState(new
LexerInputState(cb))
00043 , commitToPath(false)
00044 , tabsize(8)
00045 , traceDepth(0)
00046 {
00047
setTokenObjectFactory(&CommonToken::factory);
00048 }
00049
00050 CharScanner::CharScanner(
const LexerSharedInputState& state,
bool case_sensitive )
00051 : saveConsumedInput(true)
00052 , caseSensitive(case_sensitive)
00053 , literals(
CharScannerLiteralsLess(this))
00054 , inputState(state)
00055 , commitToPath(false)
00056 , tabsize(8)
00057 , traceDepth(0)
00058 {
00059
setTokenObjectFactory(&CommonToken::factory);
00060 }
00061
00062 void CharScanner::consume()
00063 {
00064
if (
inputState->guessing == 0)
00065 {
00066
int c =
LA(1);
00067
if (
caseSensitive)
00068 {
00069
append(c);
00070 }
00071
else
00072 {
00073
00074
00075
append(
inputState->getInput().LA(1));
00076 }
00077
00078
00079
if (c ==
'\t')
00080
tab();
00081
else
00082
inputState->column++;
00083 }
00084
inputState->getInput().consume();
00085 }
00086
00087
00088
00089
00090 void CharScanner::panic()
00091 {
00092
ANTLR_USE_NAMESPACE(std)cerr <<
"CharScanner: panic" <<
ANTLR_USE_NAMESPACE(std)
endl;
00093 exit(1);
00094 }
00095
00096 void CharScanner::panic(
const ANTLR_USE_NAMESPACE(std)string& s)
00097 {
00098
ANTLR_USE_NAMESPACE(std)cerr <<
"CharScanner: panic: " << s.c_str() <<
ANTLR_USE_NAMESPACE(std)
endl;
00099 exit(1);
00100 }
00101
00103 void CharScanner::reportError(
const RecognitionException& ex)
00104 {
00105
ANTLR_USE_NAMESPACE(std)cerr << ex.
toString().c_str() <<
ANTLR_USE_NAMESPACE(std)
endl;
00106 }
00107
00109 void CharScanner::reportError(
const ANTLR_USE_NAMESPACE(std)string& s)
00110 {
00111
if (
getFilename() ==
"")
00112
ANTLR_USE_NAMESPACE(std)cerr <<
"error: " << s.c_str() <<
ANTLR_USE_NAMESPACE(std)
endl;
00113
else
00114
ANTLR_USE_NAMESPACE(std)cerr <<
getFilename().c_str() <<
": error: " << s.c_str() <<
ANTLR_USE_NAMESPACE(std)
endl;
00115 }
00116
00118 void CharScanner::reportWarning(
const ANTLR_USE_NAMESPACE(std)string& s)
00119 {
00120
if (
getFilename() ==
"")
00121
ANTLR_USE_NAMESPACE(std)cerr <<
"warning: " << s.c_str() <<
ANTLR_USE_NAMESPACE(std)
endl;
00122
else
00123
ANTLR_USE_NAMESPACE(std)cerr <<
getFilename().c_str() <<
": warning: " << s.c_str() <<
ANTLR_USE_NAMESPACE(std)
endl;
00124 }
00125
00126 void CharScanner::traceIndent()
00127 {
00128
for(
int i = 0; i <
traceDepth; i++ )
00129
ANTLR_USE_NAMESPACE(std)cout <<
" ";
00130 }
00131
00132 void CharScanner::traceIn(
const char* rname)
00133 {
00134
traceDepth++;
00135
traceIndent();
00136
ANTLR_USE_NAMESPACE(std)cout <<
"> lexer " << rname
00137 <<
"; c==" <<
LA(1) <<
ANTLR_USE_NAMESPACE(std)
endl;
00138 }
00139
00140 void CharScanner::traceOut(
const char* rname)
00141 {
00142
traceIndent();
00143
ANTLR_USE_NAMESPACE(std)cout <<
"< lexer " << rname
00144 <<
"; c==" <<
LA(1) <<
ANTLR_USE_NAMESPACE(std)
endl;
00145
traceDepth--;
00146 }
00147
00148
#ifndef NO_STATIC_CONSTS
00149 const int CharScanner::NO_CHAR;
00150 const int CharScanner::EOF_CHAR;
00151
#endif
00152
00153
#ifdef ANTLR_CXX_SUPPORTS_NAMESPACE
00154
}
00155
#endif
00156