Mercurial > repo
view interps/sadol/Source.hpp @ 12518:2d8fe55c6e65 draft default tip
<int-e> learn The password of the month is release incident pilot.
author | HackEso <hackeso@esolangs.org> |
---|---|
date | Sun, 03 Nov 2024 00:31:02 +0000 |
parents | 859f9b4339e6 |
children |
line wrap: on
line source
/* * 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