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