comparison 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
comparison
equal deleted inserted replaced
995:6883f5911eb7 996:859f9b4339e6
1 /*
2 * BDSM2
3 * Author: Adam Sawicki
4 * http://www.regedit.risp.pl
5 * mailto:regedit@risp.pl
6 */
7 #ifndef SOURCE_H_
8 #define SOURCE_H_
9
10 class Source
11 {
12 public:
13 struct Iterator
14 {
15 size_t Index;
16 int Row;
17 int Col;
18
19 // return string in form of "index: #, row: #, col: #"
20 string ToString() const;
21 };
22
23 private:
24 const string *m_Src;
25 Iterator m_Index;
26 // Valid only if m_ErrIndexSaved
27 Iterator m_ErrIndex;
28 bool m_ErrIndexSaved;
29
30 // Read current character
31 // Cannot be end.
32 char Peek()
33 {
34 return (*m_Src)[m_Index.Index];
35 }
36 // Forward cursor one step
37 // Cannot be end.
38 void Forward();
39 // Read current character and step forward
40 // Cannot be end.
41 char Get();
42
43 public:
44 // Create view of given document as source for parsing
45 Source(const string *Src);
46
47 const Iterator & GetIterator()
48 {
49 return (m_ErrIndexSaved ? m_ErrIndex : m_Index);
50 }
51
52 // Return true of current position at the end
53 bool End()
54 {
55 return m_Index.Index >= m_Src->size();
56 }
57 // Read current character and step forward (safe)
58 // If at end, error.
59 char GetS();
60 // Skip all whitespaces and comments
61 void Skip();
62 // Freeze position for error reporting (real position will still moving)
63 void SaveErrPos() {
64 m_ErrIndex = m_Index;
65 m_ErrIndexSaved = true;
66 }
67 // Drop frozen position for error (real position will be reported in errors)
68 void DropErrPos() {
69 m_ErrIndexSaved = false;
70 }
71 // Write error and terminate process, include current (or frozen) index, row and col
72 void SrcError(const string &msg, ERR_PLACE place = ERR_GENERAL);
73 };
74
75 #endif