view interps/sadol/Source.hpp @ 11688:06331fefa90d draft

<b_jonas> perl -e for $e ("i","u"){ $f="bin/date$e"; open my$i,"<",$f or die "error open $f r"; local$/; $s=<$i> or die; $s=~s/"\\+%Y/\\${1:+-d "\\$1"} $&/ or die; open $o,">",$f or die "error open $f w: $!"; print $o $s or die; close $o or die; print "OK $f\\n" }
author HackEso <hackeso@esolangs.org>
date Fri, 04 Jan 2019 21:30:13 +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