Mercurial > repo
view interps/sadol/Source.hpp @ 5674:91d4a5b788c9
<tswett> echo \'[11,11,11,15,15,23,12],[5,5,5,3,53,45,16,26,00,20,15,16,22,25,45,91,32,11,15,27,06,01,11,01,47,22,30,13,43,21,11,13,29,61,65,17,19,12,28,17,11,01,23,20,16,20,81,18,32,25,58,22.,1985,10.301350435,1555466973690094680980000956080767,13720946704494913791885940266665466978579582015128512190078...\' > wisdom/code
author | HackBot |
---|---|
date | Wed, 24 Jun 2015 14:47:46 +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