#ifndef __Scanner_hpp__ #define __Scanner_hpp__ #include #include "Token.hpp" #include #include using namespace std; class Scanner { string m_filename; string m_text; int m_ptr; int m_strlen; int m_linenumber; stack m_ignorews; Token m_tok; bool m_tokValid; bool m_debugFlag; bool m_inContinuationState; int m_bracketDepth; bool m_blobFlag; byte current(); byte previous(); byte ahead(int n); void Fetch(); void FetchWhitespace(); void FetchIdentifier(); void FetchComment(); void FetchContinuation(); void FetchNumber(); void FetchString(); void FetchBlob(); void FetchOther(); bool TryFetchBinary(const char* op, byte tok); void SetToken(byte tok, string text = string()); bool isBreakpointLine(int num); void deleteBreakpoint(int num); public: Scanner(string buf, string fname); // Methods accessed by the parser const Token& Next(); void Consume(); bool Match(byte tok); void SetDebug(bool debugFlag) {m_debugFlag = debugFlag;} // Warning: Ugly Hack. When in Special Call mode, the // rules for what constitutes a string change completely. void SetBlobMode(bool blobFlag) {m_blobFlag = blobFlag;} void PushWSFlag(bool ignoreWS); void PopWSFlag(); bool Done(); bool Peek(int chars, byte tok); void SetBreakpoints(vector bp); unsigned Position() {return m_ptr;} unsigned ContextNum(); string Context(unsigned pos); string Context(); string Snippet(unsigned pos1, unsigned pos2); bool InContinuationState(); bool InBracket(); }; #endif