Horus Doc || C++ Reference || Class Overview   Pixels   Images   Detector   Geometry   Registry || Doxygen's quick Index  

HxScanner.h

00001 /*
00002  *  Copyright (c) 1998, University of Amsterdam, The Netherlands.
00003  *  All rights reserved.
00004  *
00005  *
00006  *  Author(s):
00007  *  Dennis Koelma (koelma@wins.uva.nl)
00008  *  Edo Poll (poll@wins.uva.nl)
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    Input management not very well, easy to do it wrong.
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     // Input management
00052 
00053     void                setReadBuffer(HxReadBuffer&);
00054     HxReadBuffer&       getReadBuffer() const;
00055 
00056     void                setReader(HxCharReader&) const;
00057     void                flush();
00058 
00059     // Scanning operations
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     // Input handling
00082 
00083     int                 cget() const;
00084     int                 cpeek() const;
00085     void                cunget() const;
00086 
00087     HxReadBuffer*       _readBuffer;
00088 
00089     // The token buffer
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     // Token scanner dispatch table
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

Generated on Tue Feb 3 14:18:42 2004 for C++Reference by doxygen1.2.12 written by Dimitri van Heesch, © 1997-2001