Mercurial > repo
diff interps/sadol/Source.hpp @ 996:859f9b4339e6
<Gregor> tar xf egobot.tar.xz
author | HackBot |
---|---|
date | Sun, 09 Dec 2012 19:30:08 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/interps/sadol/Source.hpp Sun Dec 09 19:30:08 2012 +0000 @@ -0,0 +1,75 @@ +/* + * BDSM2 + * Author: Adam Sawicki + * http://www.regedit.risp.pl + * mailto:regedit@risp.pl + */ +#ifndef SOURCE_H_ +#define SOURCE_H_ + +class Source +{ +public: + struct Iterator + { + size_t Index; + int Row; + int Col; + + // return string in form of "index: #, row: #, col: #" + string ToString() const; + }; + +private: + const string *m_Src; + Iterator m_Index; + // Valid only if m_ErrIndexSaved + Iterator m_ErrIndex; + bool m_ErrIndexSaved; + + // Read current character + // Cannot be end. + char Peek() + { + return (*m_Src)[m_Index.Index]; + } + // Forward cursor one step + // Cannot be end. + void Forward(); + // Read current character and step forward + // Cannot be end. + char Get(); + +public: + // Create view of given document as source for parsing + Source(const string *Src); + + const Iterator & GetIterator() + { + return (m_ErrIndexSaved ? m_ErrIndex : m_Index); + } + + // Return true of current position at the end + bool End() + { + return m_Index.Index >= m_Src->size(); + } + // Read current character and step forward (safe) + // If at end, error. + char GetS(); + // Skip all whitespaces and comments + void Skip(); + // Freeze position for error reporting (real position will still moving) + void SaveErrPos() { + m_ErrIndex = m_Index; + m_ErrIndexSaved = true; + } + // Drop frozen position for error (real position will be reported in errors) + void DropErrPos() { + m_ErrIndexSaved = false; + } + // Write error and terminate process, include current (or frozen) index, row and col + void SrcError(const string &msg, ERR_PLACE place = ERR_GENERAL); +}; + +#endif