-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathScanResult.cs
81 lines (67 loc) · 2.13 KB
/
ScanResult.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
using System;
using System.Linq;
using System.Text;
namespace jamconverter
{
public class ScanResult
{
private readonly ScanToken[] _scanTokens;
public int _cursor = 0;
public ScanResult(ScanToken[] scanTokens)
{
if (scanTokens.Length == 0 || scanTokens.Last().tokenType != TokenType.EOF)
throw new ArgumentException();
_scanTokens = scanTokens;
}
public bool IsAtEnd
{
get { return _cursor >= _scanTokens.Length; }
}
public ScanToken Next(bool skipWhiteSpace=true)
{
if (IsAtEnd)
throw new InvalidOperationException("Reached end of stream while expecting more tokens");
if (_scanTokens[_cursor].tokenType == TokenType.WhiteSpace && skipWhiteSpace)
{
_cursor++;
return Next();
}
return _scanTokens[_cursor++];
}
public ScanToken Peek(bool skipWhiteSpace = true)
{
if (IsAtEnd)
throw new InvalidOperationException();
int tempCursor = _cursor;
while (_scanTokens[tempCursor].tokenType == TokenType.WhiteSpace && skipWhiteSpace)
{
tempCursor++;
}
return _scanTokens[tempCursor];
}
public int GetCursor()
{
return _cursor;
}
public void SetCursor(int cursor)
{
_cursor = cursor;
}
public string ProduceStringUntilEndOfLine()
{
var sb = new StringBuilder();
while (true)
{
var token = Peek(skipWhiteSpace:false);
if (token.tokenType == TokenType.WhiteSpace && Scanner.IsNewLineCharacter(token.literal[0]))
{
Next(skipWhiteSpace: false);
return sb.ToString();
}
if (token.tokenType == TokenType.EOF)
return sb.ToString();
sb.Append(Next(skipWhiteSpace: false).literal);
}
}
}
}