// The source handler provides the language specification to the parser // in the form of a stream of characters. It has the secondary role of // providing a listing of the input source. Character lookaheads are // provided by the line buffer which also records column positions. class Buffer { public: enum { MAXBUFFERSPACE = 255 }; private: char contents[MAXBUFFERSPACE+1]; int _charPosition; void init() { contents[_charPosition = 0] = '\0'; } public: int charPosition() { return _charPosition; } int empty() { return(contents[_charPosition] == '\0'); } int get() { return(contents[_charPosition++]); } char *fill() { init(); return contents; } Buffer() { init(); } }; class Source : public Buffer { public: enum sourceStatus { OK, CANNOTOPEN, SAWEOF }; private: FILE *fd; char *_fileName; int _currentLine; sourceStatus _status; public: char* fileName() { return _fileName; } int currentLine() { return _currentLine; } sourceStatus status() { return _status; } char nextChar(); Source(char *fn); ~Source(); };