diff interps/sadol/Source.hpp @ 996:859f9b4339e6

<Gregor> tar xf egobot.tar.xz
author HackBot
date Sun, 09 Dec 2012 19:30:08 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/interps/sadol/Source.hpp	Sun Dec 09 19:30:08 2012 +0000
@@ -0,0 +1,75 @@
+/*
+ * 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