view interps/sadol/Source.hpp @ 12500:e48c08805365 draft default tip

<b_jonas> ` learn \'The password of the month is Cthulhuquagdonic Mothraquagdonic Narwhalicorn.\' # https://logs.esolangs.org/libera-esolangs/2024-04.html#lKE Infinite craft
author HackEso <hackeso@esolangs.org>
date Wed, 01 May 2024 06:39:10 +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