00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef HxScanner_h
00012 #define HxScanner_h
00013
00014 #include "HxString.h"
00015 #include "HxToken.h"
00016 #include "HxCharReader.h"
00017 #include "HxReadBuffer.h"
00018
00019 class HxSymbolTable;
00020
00021
00022 #define SYMSETSIZE 256
00023
00024
00025
00026
00027
00028 #include "HxTracedObject.h"
00029
00030 class L_HXBASIS HxScanner TRACED_OBJECT
00031 {
00032 public:
00033 enum ScanMode { Standard, Registry };
00034
00035 HxScanner();
00036 HxScanner(HxReadBuffer&);
00037 HxScanner(HxReadBuffer&, HxSymbolTable&);
00038 ~HxScanner();
00039
00040 int lineNr() const;
00041 void setFileName(HxString);
00042 HxString getFileName() const;
00043
00044 void setSymbolTable(HxSymbolTable&);
00045 HxSymbolTable& getSymbolTable() const;
00046
00047 void insertSymbol(HxString, const HxToken&) const;
00048
00049 void setScanMode(ScanMode);
00050
00051
00052
00053 void setReadBuffer(HxReadBuffer&);
00054 HxReadBuffer& getReadBuffer() const;
00055
00056 void setReader(HxCharReader&) const;
00057 void flush();
00058
00059
00060
00061 HxToken& get();
00062 void unget();
00063 HxToken& peek(int n = 0);
00064
00065 HxToken scanNumber();
00066 HxToken scanSign();
00067 void scanWhite();
00068
00069 private:
00070
00071 #pragma warning (disable : 4251)
00072 HxSymbolTable* _symTab;
00073
00074 int _lineNr;
00075 HxString _fileName;
00076 HxString _lexeme;
00077 #pragma warning (default : 4251)
00078
00079 void scanInit();
00080
00081
00082
00083 int cget() const;
00084 int cpeek() const;
00085 void cunget() const;
00086
00087 HxReadBuffer* _readBuffer;
00088
00089
00090
00091 HxToken* tokBuf;
00092 int tokBufPtr;
00093 int tokBufSize;
00094 int tokBufAhead;
00095 int tokBufGot;
00096
00097 void tokBufInit();
00098 void tokBufExit();
00099 void tokBufRead(int n = 1);
00100 STD_OSTREAM& tokBufPut(STD_OSTREAM&);
00101
00102
00103
00104 public:
00105 typedef int (HxScanner::*Handler)(HxToken&);
00106
00107 private:
00108
00109 static const int RETTOKEN;
00110 static const int NOTOKEN;
00111
00112 static Handler _handleList[SYMSETSIZE];
00113 static int _handleListInit;
00114
00115 void handleListInit();
00116
00117 int lexan(HxToken &);
00118
00119 int unknown(HxToken&);
00120 int whitespace(HxToken&);
00121 int comment(HxToken&);
00122 int identifier(HxToken&);
00123 int numconst(HxToken&);
00124 int strconst(HxToken&);
00125 int regkey(HxToken&);
00126
00127 void scanchar(HxString& lexeme);
00128
00129 void reportError(HxString) const;
00130 };
00131
00132 inline int
00133 HxScanner::lineNr() const { return _lineNr; }
00134
00135 inline void
00136 HxScanner::setFileName(HxString fileName) { _fileName = fileName; }
00137
00138 inline HxString
00139 HxScanner::getFileName() const { return _fileName; }
00140
00141 inline void
00142 HxScanner::setSymbolTable(HxSymbolTable& symTab) { _symTab = &symTab; }
00143
00144 inline HxSymbolTable&
00145 HxScanner::getSymbolTable() const { return *_symTab; }
00146
00147 inline void
00148 HxScanner::setReadBuffer(HxReadBuffer& readBuffer)
00149 {
00150 _readBuffer = &readBuffer;
00151 }
00152
00153 inline HxReadBuffer&
00154 HxScanner::getReadBuffer() const { return *_readBuffer; }
00155
00156 inline void
00157 HxScanner::setReader(HxCharReader& reader) const
00158 {
00159 if (_readBuffer)
00160 _readBuffer->setReader(reader);
00161 }
00162
00163 inline void
00164 HxScanner::flush()
00165 {
00166 if (_readBuffer)
00167 _readBuffer->flush();
00168 _lineNr = 1;
00169 }
00170
00171 inline void
00172 HxScanner::scanWhite()
00173 {
00174 HxToken tok;
00175 whitespace(tok);
00176 }
00177
00178 inline HxToken
00179 HxScanner::scanNumber()
00180 {
00181 HxToken tok;
00182 numconst(tok);
00183 return tok;
00184 }
00185
00186 inline int
00187 HxScanner::cget() const { return _readBuffer ? _readBuffer->get() : -1; }
00188
00189 inline int
00190 HxScanner::cpeek() const { return _readBuffer ? _readBuffer->peek() : -1; }
00191
00192 inline void
00193 HxScanner::cunget() const { if (_readBuffer) _readBuffer->unget(); }
00194
00195 #endif