Browse Source

- Simplified parser classes, removed unnecessary classes, improved code quality

- the TokenStream now no longer has any memory at all; its input is a CharStream which has peek() and next() methods, the TokenStream doesn't store a single character, making it stateless
- Added flyweight token support, decreasing memory usage
Stan Hebben 6 years ago
parent
commit
736d9f2f8c
31 changed files with 434 additions and 504 deletions
  1. 5
    6
      Parser/src/main/java/org/openzen/zenscript/lexer/CharReader.java
  2. 61
    0
      Parser/src/main/java/org/openzen/zenscript/lexer/CountingCharReader.java
  3. 51
    16
      Parser/src/main/java/org/openzen/zenscript/lexer/LLParserTokenStream.java
  4. 35
    0
      Parser/src/main/java/org/openzen/zenscript/lexer/ReaderCharReader.java
  5. 32
    0
      Parser/src/main/java/org/openzen/zenscript/lexer/StringCharReader.java
  6. 27
    139
      Parser/src/main/java/org/openzen/zenscript/lexer/TokenParser.java
  7. 0
    31
      Parser/src/main/java/org/openzen/zenscript/lexer/TokenStream.java
  8. 2
    12
      Parser/src/main/java/org/openzen/zenscript/lexer/WhitespaceFilteringParser.java
  9. 7
    76
      Parser/src/main/java/org/openzen/zenscript/lexer/ZSTokenFactory.java
  10. 7
    16
      Parser/src/main/java/org/openzen/zenscript/lexer/ZSTokenParser.java
  11. 0
    22
      Parser/src/main/java/org/openzen/zenscript/lexer/ZSTokenStream.java
  12. 145
    122
      Parser/src/main/java/org/openzen/zenscript/lexer/ZSTokenType.java
  13. 2
    2
      Parser/src/main/java/org/openzen/zenscript/parser/ParsedDefinition.java
  14. 1
    2
      Parser/src/main/java/org/openzen/zenscript/parser/ParsedFile.java
  15. 2
    2
      Parser/src/main/java/org/openzen/zenscript/parser/ParsedImport.java
  16. 2
    2
      Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedAlias.java
  17. 2
    2
      Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedClass.java
  18. 2
    2
      Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedEnum.java
  19. 2
    2
      Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedEnumConstant.java
  20. 2
    2
      Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedExpansion.java
  21. 2
    2
      Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedFunction.java
  22. 2
    2
      Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedFunctionHeader.java
  23. 2
    3
      Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedGenericParameter.java
  24. 2
    2
      Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedInterface.java
  25. 2
    2
      Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedStruct.java
  26. 2
    2
      Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedVariant.java
  27. 2
    2
      Parser/src/main/java/org/openzen/zenscript/parser/expression/ParsedCallArguments.java
  28. 17
    17
      Parser/src/main/java/org/openzen/zenscript/parser/expression/ParsedExpression.java
  29. 2
    2
      Parser/src/main/java/org/openzen/zenscript/parser/member/ParsedDefinitionMember.java
  30. 6
    6
      Parser/src/main/java/org/openzen/zenscript/parser/statements/ParsedStatement.java
  31. 8
    8
      Parser/src/main/java/org/openzen/zenscript/parser/type/IParsedType.java

Parser/src/main/java/org/openzen/zenscript/lexer/MemoryTokenStream.java → Parser/src/main/java/org/openzen/zenscript/lexer/CharReader.java View File

5
  */
5
  */
6
 package org.openzen.zenscript.lexer;
6
 package org.openzen.zenscript.lexer;
7
 
7
 
8
+import java.io.IOException;
9
+
8
 /**
10
 /**
9
  *
11
  *
10
  * @author Hoofdgebruiker
12
  * @author Hoofdgebruiker
11
  */
13
  */
12
-public interface MemoryTokenStream<TT extends TokenType, T extends Token<TT>>
13
-		extends TokenStream<TT, T> {
14
-	void pushMark();
15
-	
16
-	void popMark();
14
+public interface CharReader {
15
+	int peek() throws IOException;
17
 	
16
 	
18
-	void reset();
17
+	int next() throws IOException;
19
 }
18
 }

+ 61
- 0
Parser/src/main/java/org/openzen/zenscript/lexer/CountingCharReader.java View File

1
+package org.openzen.zenscript.lexer;
2
+
3
+import java.io.IOException;
4
+import org.openzen.zenscript.shared.CodePosition;
5
+
6
+/*
7
+ * To change this license header, choose License Headers in Project Properties.
8
+ * To change this template file, choose Tools | Templates
9
+ * and open the template in the editor.
10
+ */
11
+
12
+/**
13
+ *
14
+ * @author Hoofdgebruiker
15
+ */
16
+public class CountingCharReader implements CharReader {
17
+	private final CharReader reader;
18
+	private final String filename;
19
+	private final int tabSize;
20
+	
21
+	private int line;
22
+	private int lineOffset;
23
+
24
+	public CountingCharReader(CharReader reader, String filename, int tabSize)
25
+	{
26
+		this.reader = reader;
27
+		this.filename = filename;
28
+		this.tabSize = tabSize;
29
+		
30
+		line = 1;
31
+		lineOffset = 1;
32
+	}
33
+	
34
+	public CodePosition getPosition() {
35
+		return new CodePosition(filename, line, lineOffset, line, lineOffset);
36
+	}
37
+
38
+	@Override
39
+	public int peek() throws IOException
40
+	{
41
+		return reader.peek();
42
+	}
43
+
44
+	@Override
45
+	public int next() throws IOException
46
+	{
47
+		int ch = reader.next();
48
+		if (ch == -1)
49
+			return ch;
50
+		
51
+		if (ch == '\n') {
52
+			line++;
53
+			lineOffset = 1;
54
+		} else if (ch == '\t') {
55
+			lineOffset += tabSize;
56
+		} else {
57
+			lineOffset++;
58
+		}
59
+		return ch;
60
+	}
61
+}

Parser/src/main/java/org/openzen/zenscript/lexer/MemoryTokenStreamImpl.java → Parser/src/main/java/org/openzen/zenscript/lexer/LLParserTokenStream.java View File

8
 import java.util.LinkedList;
8
 import java.util.LinkedList;
9
 import java.util.Stack;
9
 import java.util.Stack;
10
 import org.openzen.zenscript.shared.CodePosition;
10
 import org.openzen.zenscript.shared.CodePosition;
11
+import org.openzen.zenscript.shared.CompileException;
12
+import org.openzen.zenscript.shared.CompileExceptionCode;
11
 
13
 
12
 /**
14
 /**
13
  *
15
  *
14
  * @author Hoofdgebruiker
16
  * @author Hoofdgebruiker
15
  */
17
  */
16
-public abstract class MemoryTokenStreamImpl<TT extends TokenType, T extends Token<TT>> implements TokenStream<TT, T> {
18
+public abstract class LLParserTokenStream<TT extends TokenType, T extends Token<TT>> {
17
 	private final TokenStream<TT, T> stream;
19
 	private final TokenStream<TT, T> stream;
18
-    private final LinkedList<TokenParser.PositionedToken<T>> tokenMemory = new LinkedList<>();
20
+    private final LinkedList<PositionedToken> tokenMemory = new LinkedList<>();
19
     private final Stack<Integer> marks = new Stack<>();
21
     private final Stack<Integer> marks = new Stack<>();
20
 	
22
 	
23
+	private T next;
21
     private int tokenMemoryOffset = 0;
24
     private int tokenMemoryOffset = 0;
22
     private int tokenMemoryCurrent = 0;
25
     private int tokenMemoryCurrent = 0;
23
 	
26
 	
24
-	public MemoryTokenStreamImpl(TokenStream<TT, T> stream) {
27
+	public LLParserTokenStream(TokenStream<TT, T> stream) {
25
 		this.stream = stream;
28
 		this.stream = stream;
29
+		next = stream.next();
26
 	}
30
 	}
27
 	
31
 	
28
 	public void pushMark() {
32
 	public void pushMark() {
42
         tokenMemoryCurrent = marks.pop();
46
         tokenMemoryCurrent = marks.pop();
43
 	}
47
 	}
44
 
48
 
45
-	@Override
46
 	public T peek() {
49
 	public T peek() {
47
 		if (tokenMemoryCurrent < tokenMemoryOffset + tokenMemory.size()) {
50
 		if (tokenMemoryCurrent < tokenMemoryOffset + tokenMemory.size()) {
48
             return tokenMemory.get((tokenMemoryCurrent) - tokenMemoryOffset).token;
51
             return tokenMemory.get((tokenMemoryCurrent) - tokenMemoryOffset).token;
49
         } else {
52
         } else {
50
-            return stream.peek();
53
+            return next;
51
         }
54
         }
52
 	}
55
 	}
53
-
54
-	@Override
55
-	public void replace(TT other) {
56
-		stream.replace(other);
56
+	
57
+	public void replace(T other) {
58
+		next = other;
57
 	}
59
 	}
58
-
59
-	@Override
60
+	
60
 	public T next() {
61
 	public T next() {
61
 		if (tokenMemoryCurrent < tokenMemoryOffset + tokenMemory.size()) {
62
 		if (tokenMemoryCurrent < tokenMemoryOffset + tokenMemory.size()) {
62
             return tokenMemory.get((tokenMemoryCurrent++) - tokenMemoryOffset).token;
63
             return tokenMemory.get((tokenMemoryCurrent++) - tokenMemoryOffset).token;
63
         } else {
64
         } else {
64
-            T result = stream.peek();
65
+            T result = next;
66
+			next = stream.next();
65
             if (marks.isEmpty()) {
67
             if (marks.isEmpty()) {
66
                 tokenMemoryOffset++;
68
                 tokenMemoryOffset++;
67
             } else {
69
             } else {
68
-                tokenMemory.add(new TokenParser.PositionedToken<>(stream.getPosition(), stream.peek()));
70
+                tokenMemory.add(new PositionedToken(getPosition(), result));
69
             }
71
             }
70
             tokenMemoryCurrent++;
72
             tokenMemoryCurrent++;
71
-            stream.next();
72
 			return result;
73
 			return result;
73
         }
74
         }
74
 	}
75
 	}
75
-
76
-	@Override
76
+	
77
 	public CodePosition getPosition() {
77
 	public CodePosition getPosition() {
78
 		if (tokenMemoryCurrent < tokenMemoryOffset + tokenMemory.size()) {
78
 		if (tokenMemoryCurrent < tokenMemoryOffset + tokenMemory.size()) {
79
             return tokenMemory.get((tokenMemoryCurrent) - tokenMemoryOffset).position;
79
             return tokenMemory.get((tokenMemoryCurrent) - tokenMemoryOffset).position;
81
             return stream.getPosition();
81
             return stream.getPosition();
82
         }
82
         }
83
 	}
83
 	}
84
+	
85
+	public boolean isNext(TT type) {
86
+		return peek().getType() == type;
87
+	}
88
+	
89
+	public T optional(TT type) {
90
+		if (peek().getType() == type) {
91
+            return next();
92
+        } else {
93
+            return null;
94
+        }
95
+	}
96
+	
97
+	public T required(TT type, String error) throws CompileException {
98
+		T t = peek();
99
+        if (t.getType() == type) {
100
+            return next();
101
+        } else {
102
+			throw new CompileException(getPosition(), CompileExceptionCode.UNEXPECTED_TOKEN, error);
103
+        }
104
+    }
105
+	
106
+	public boolean hasNext() {
107
+		return peek().getType() != stream.getEOF();
108
+	}
109
+	
110
+	private class PositionedToken {
111
+		public final CodePosition position;
112
+		public final T token;
113
+		
114
+		public PositionedToken(CodePosition position, T token) {
115
+			this.position = position;
116
+			this.token = token;
117
+		}
118
+	}
84
 }
119
 }

+ 35
- 0
Parser/src/main/java/org/openzen/zenscript/lexer/ReaderCharReader.java View File

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.lexer;
7
+
8
+import java.io.IOException;
9
+import java.io.Reader;
10
+
11
+/**
12
+ *
13
+ * @author Hoofdgebruiker
14
+ */
15
+public class ReaderCharReader implements CharReader {
16
+	private final Reader reader;
17
+	private int next;
18
+	
19
+	public ReaderCharReader(Reader reader) throws IOException {
20
+		this.reader = reader;
21
+		next = reader.read();
22
+	}
23
+	
24
+	@Override
25
+	public int peek() {
26
+		return next;
27
+	}
28
+
29
+	@Override
30
+	public int next() throws IOException {
31
+		int result = next;
32
+		next = reader.read();
33
+		return result;
34
+	}
35
+}

+ 32
- 0
Parser/src/main/java/org/openzen/zenscript/lexer/StringCharReader.java View File

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.lexer;
7
+
8
+import java.io.IOException;
9
+
10
+/**
11
+ *
12
+ * @author Hoofdgebruiker
13
+ */
14
+public class StringCharReader implements CharReader {
15
+	private final char[] data;
16
+	private int index;
17
+	
18
+	public StringCharReader(String data) {
19
+		this.data = data.toCharArray();
20
+		this.index = 0;
21
+	}
22
+	
23
+	@Override
24
+	public int peek() {
25
+		return index >= data.length ? -1 : data[index];
26
+	}
27
+
28
+	@Override
29
+	public int next() throws IOException {
30
+		return index >= data.length ? -1 : data[index++];
31
+	}
32
+}

+ 27
- 139
Parser/src/main/java/org/openzen/zenscript/lexer/TokenParser.java View File

2
 package org.openzen.zenscript.lexer;
2
 package org.openzen.zenscript.lexer;
3
 
3
 
4
 import java.io.IOException;
4
 import java.io.IOException;
5
-import java.io.Reader;
6
-import java.io.StringReader;
7
 import org.openzen.zenscript.shared.CodePosition;
5
 import org.openzen.zenscript.shared.CodePosition;
8
 import org.openzen.zenscript.shared.CompileException;
6
 import org.openzen.zenscript.shared.CompileException;
9
 import org.openzen.zenscript.shared.CompileExceptionCode;
7
 import org.openzen.zenscript.shared.CompileExceptionCode;
20
  */
18
  */
21
 public class TokenParser<T extends Token<TT>, TT extends TokenType> implements TokenStream<TT, T>
19
 public class TokenParser<T extends Token<TT>, TT extends TokenType> implements TokenStream<TT, T>
22
 {
20
 {
23
-	private final String filename;
24
-    private final CountingReader reader;
21
+    private final CountingCharReader reader;
25
     private final CompiledDFA<TT> dfa;
22
     private final CompiledDFA<TT> dfa;
26
 	private final TT eof;
23
 	private final TT eof;
27
 	private final TT invalid;
24
 	private final TT invalid;
28
-	private final int tabSize = 4;
29
 	private final TokenFactory<T, TT> factory;
25
 	private final TokenFactory<T, TT> factory;
30
 	
26
 	
31
-    private PositionedToken<T> next;
32
-	
33
-    private int nextChar;
34
-    private int line;
35
-    private int lineOffset;
36
-	
37
     /**
27
     /**
38
      * Creates a token stream using the specified reader and DFA.
28
      * Creates a token stream using the specified reader and DFA.
39
      *
29
      *
44
      */
34
      */
45
     public TokenParser(
35
     public TokenParser(
46
 			String filename,
36
 			String filename,
47
-			Reader reader, 
37
+			CharReader reader, 
48
 			CompiledDFA<TT> dfa,
38
 			CompiledDFA<TT> dfa,
49
 			TT eof,
39
 			TT eof,
50
 			TT invalid,
40
 			TT invalid,
53
 		if (eof.isWhitespace()) // important for the advance() method
43
 		if (eof.isWhitespace()) // important for the advance() method
54
 			throw new IllegalArgumentException("EOF cannot be whitespace");
44
 			throw new IllegalArgumentException("EOF cannot be whitespace");
55
 		
45
 		
56
-        this.reader = new CountingReader(reader);
46
+        this.reader = new CountingCharReader(reader, filename, 4);
57
         this.dfa = dfa;
47
         this.dfa = dfa;
58
-		this.filename = filename;
59
 		this.eof = eof;
48
 		this.eof = eof;
60
 		this.invalid = invalid;
49
 		this.invalid = invalid;
61
 		this.factory = factory;
50
 		this.factory = factory;
62
-		
63
-		try {
64
-	        nextChar = this.reader.read();
65
-		} catch (IOException ex) {
66
-			throw new CompileException(getPosition(), CompileExceptionCode.INTERNAL_ERROR, ex.getMessage());
67
-		}
68
-		
69
-        line = 1;
70
-        lineOffset = 1;
71
-        advance();
72
     }
51
     }
73
 
52
 
74
     /**
53
     /**
81
      */
60
      */
82
     public TokenParser(String filename, String data, CompiledDFA<TT> dfa, TT eof, TT invalid, TokenFactory<T, TT> factory)
61
     public TokenParser(String filename, String data, CompiledDFA<TT> dfa, TT eof, TT invalid, TokenFactory<T, TT> factory)
83
 	{
62
 	{
84
-        this(filename, new StringReader(data), dfa, eof, invalid, factory);
85
-    }
86
-	
87
-	@Override
88
-    public T peek()
89
-	{
90
-        return next.token;
63
+        this(filename, new StringCharReader(data), dfa, eof, invalid, factory);
91
     }
64
     }
92
 	
65
 	
93
 	@Override
66
 	@Override
94
 	public CodePosition getPosition()
67
 	public CodePosition getPosition()
95
 	{
68
 	{
96
-		return next.position;
69
+		return reader.getPosition();
97
 	}
70
 	}
98
 	
71
 	
99
-	/**
100
-	 * Replaces the current token with another one. Used to split composite tokens.
101
-	 * 
102
-	 * @param other 
103
-	 */
104
-	public void replace(TT other) {
105
-		next = new PositionedToken(
106
-				next.position,
107
-				factory.create(
108
-						other,
109
-						next.token.getContent()));
72
+	public boolean hasNext() {
73
+		try {
74
+			return reader.peek() >= 0;
75
+		} catch (IOException ex) {
76
+			return false;
77
+		}
110
 	}
78
 	}
111
-
112
-	@Override
113
-    public T next()
114
-	{
115
-        T result = next.token;
116
-		advance();
117
-		return result;
118
-    }
119
 	
79
 	
120
 	@Override
80
 	@Override
121
 	public TT getEOF() {
81
 	public TT getEOF() {
122
 		return eof;
82
 		return eof;
123
 	}
83
 	}
124
 	
84
 	
125
-    // =======================
126
-    // === Private methods ===
127
-    // =======================
128
-	
129
-    private void advance()
85
+	@Override
86
+    public T next()
130
 	{
87
 	{
131
-        if (nextChar < 0) {
132
-			CodePosition position = new CodePosition(
133
-					filename,
134
-					line,
135
-					lineOffset,
136
-					line,
137
-					lineOffset);
88
+		try {
89
+			if (reader.peek() < 0)
90
+				return factory.create(eof, "");
138
 			
91
 			
139
-            next = new PositionedToken(position, factory.create(eof, ""));
140
-            return;
141
-        }
142
-		
143
-        try {
144
             int state = 0;
92
             int state = 0;
145
             StringBuilder value = new StringBuilder();
93
             StringBuilder value = new StringBuilder();
146
-            int fromLine = line;
147
-            int fromLineOffset = lineOffset;
148
-            while (dfa.transitions[state].containsKey(nextChar)) {
149
-                value.append((char)nextChar);
150
-                state = dfa.transitions[state].get(nextChar);
151
-                line = reader.line;
152
-                lineOffset = reader.lineOffset;
153
-                nextChar = reader.read();
94
+            while (dfa.transitions[state].containsKey(reader.peek())) {
95
+				char c = (char) reader.next();
96
+                value.append(c);
97
+                state = dfa.transitions[state].get(c);
154
             }
98
             }
155
 			
99
 			
156
-			if (line < 0)
157
-				throw new IllegalStateException("Line cannot be negative");
158
-			
159
-			CodePosition position = new CodePosition(filename, fromLine, fromLineOffset, line, lineOffset);
160
             if (dfa.finals[state] != null) {
100
             if (dfa.finals[state] != null) {
161
                 if (state == 0) {
101
                 if (state == 0) {
162
-					value.append((char) nextChar);
163
-					next = new PositionedToken(position, factory.create(invalid, value.toString()));
164
-					nextChar = reader.read();
102
+					value.append((char) reader.next());
103
+					return factory.create(invalid, value.toString());
165
 				}
104
 				}
166
 				
105
 				
167
-				next = new PositionedToken(position, factory.create(dfa.finals[state], value.toString()));
106
+				return factory.create(dfa.finals[state], value.toString());
168
             } else {
107
             } else {
169
-				if (nextChar < 0 && value.length() == 0)
170
-					return; // happens on comments at the end of files
108
+				if (reader.peek() < 0 && value.length() == 0)
109
+					return factory.create(eof, ""); // happens on comments at the end of files
171
 				
110
 				
172
-				value.append((char) nextChar);
173
-				next = new PositionedToken(position, factory.create(invalid, value.toString()));
174
-				nextChar = reader.read();
111
+				value.append((char) reader.next());
112
+				return factory.create(invalid, value.toString());
175
             }
113
             }
176
         } catch (IOException ex) {
114
         } catch (IOException ex) {
177
 			throw new CompileException(getPosition(), CompileExceptionCode.INTERNAL_ERROR, ex.getMessage());
115
 			throw new CompileException(getPosition(), CompileExceptionCode.INTERNAL_ERROR, ex.getMessage());
178
         }
116
         }
179
     }
117
     }
180
-
181
-    // =============================
182
-    // === Private inner classes ===
183
-    // =============================
184
-
185
-    /**
186
-     * Keeps a line and line offset count.
187
-     */
188
-    private class CountingReader
189
-	{
190
-        private int line;
191
-        private int lineOffset;
192
-        private Reader reader;
193
-        private boolean eof;
194
-
195
-        public CountingReader(Reader reader)
196
-		{
197
-            this.reader = reader;
198
-            line = 1;
199
-            lineOffset = 1;
200
-        }
201
-
202
-        public int read() throws IOException
203
-		{
204
-            int ch = reader.read();
205
-            if (ch == -1) {
206
-                eof = true;
207
-                return ch;
208
-            }
209
-            if (ch == '\n') {
210
-                line++;
211
-                lineOffset = 1;
212
-            } else if (ch == '\t') {
213
-				lineOffset += tabSize;
214
-			} else {
215
-                lineOffset++;
216
-            }
217
-            return ch;
218
-        }
219
-    }
220
-	
221
-	public static class PositionedToken<T> {
222
-		public final CodePosition position;
223
-		public final T token;
224
-		
225
-		public PositionedToken(CodePosition position, T token) {
226
-			this.position = position;
227
-			this.token = token;
228
-		}
229
-	}
230
 }
118
 }

+ 0
- 31
Parser/src/main/java/org/openzen/zenscript/lexer/TokenStream.java View File

6
 package org.openzen.zenscript.lexer;
6
 package org.openzen.zenscript.lexer;
7
 
7
 
8
 import org.openzen.zenscript.shared.CodePosition;
8
 import org.openzen.zenscript.shared.CodePosition;
9
-import org.openzen.zenscript.shared.CompileException;
10
-import org.openzen.zenscript.shared.CompileExceptionCode;
11
 
9
 
12
 /**
10
 /**
13
  *
11
  *
14
  * @author Hoofdgebruiker
12
  * @author Hoofdgebruiker
15
  */
13
  */
16
 public interface TokenStream<TT extends TokenType, T extends Token<TT>> {
14
 public interface TokenStream<TT extends TokenType, T extends Token<TT>> {
17
-	T peek();
18
-	
19
-	default boolean isNext(TT type) {
20
-		return peek().getType() == type;
21
-	}
22
-	
23
-	default T optional(TT type) {
24
-		if (peek().getType() == type) {
25
-            return next();
26
-        } else {
27
-            return null;
28
-        }
29
-	}
30
-	
31
-	default T required(TT type, String error) throws CompileException {
32
-		T t = peek();
33
-        if (t.getType() == type) {
34
-            return next();
35
-        } else {
36
-			throw new CompileException(getPosition(), CompileExceptionCode.UNEXPECTED_TOKEN, error);
37
-        }
38
-    }
39
-	
40
-	void replace(TT other);
41
-	
42
-	default boolean hasNext() {
43
-		return peek().getType() != getEOF();
44
-	}
45
-	
46
 	T next();
15
 	T next();
47
 	
16
 	
48
 	CodePosition getPosition();
17
 	CodePosition getPosition();

+ 2
- 12
Parser/src/main/java/org/openzen/zenscript/lexer/WhitespaceFilteringParser.java View File

39
 			whitespace = whitespace.substring(index + 1);
39
 			whitespace = whitespace.substring(index + 1);
40
 			return result;
40
 			return result;
41
 		} else {
41
 		} else {
42
+			String result = whitespace;
42
 			whitespace = "";
43
 			whitespace = "";
43
-			return whitespace;
44
+			return result;
44
 		}
45
 		}
45
 	}
46
 	}
46
 
47
 
47
-	@Override
48
-	public T peek() {
49
-		return next;
50
-	}
51
-
52
-	@Override
53
-	public void replace(TT other) {
54
-		stream.replace(other);
55
-		next = peek();
56
-	}
57
-
58
 	@Override
48
 	@Override
59
 	public T next() {
49
 	public T next() {
60
 		T result = next;
50
 		T result = next;

+ 7
- 76
Parser/src/main/java/org/openzen/zenscript/lexer/ZSTokenFactory.java View File

16
 public class ZSTokenFactory implements TokenFactory<ZSToken, ZSTokenType> {
16
 public class ZSTokenFactory implements TokenFactory<ZSToken, ZSTokenType> {
17
 	public static final ZSTokenFactory INSTANCE = new ZSTokenFactory();
17
 	public static final ZSTokenFactory INSTANCE = new ZSTokenFactory();
18
 	
18
 	
19
-	private static final Map<String, ZSTokenType> KEYWORDS = new HashMap<>();
19
+	private static final Map<String, ZSToken> KEYWORDS = new HashMap<>();
20
 	
20
 	
21
 	static {
21
 	static {
22
-		KEYWORDS.put("import", K_IMPORT);
23
-		KEYWORDS.put("alias", K_ALIAS);
24
-		KEYWORDS.put("class", K_CLASS);
25
-		KEYWORDS.put("interface", K_INTERFACE);
26
-		KEYWORDS.put("enum", K_ENUM);
27
-		KEYWORDS.put("struct", K_STRUCT);
28
-		KEYWORDS.put("expand", K_EXPAND);
29
-		KEYWORDS.put("function", K_FUNCTION);
30
-		KEYWORDS.put("variant", K_VARIANT);
31
-		
32
-		KEYWORDS.put("abstract", K_ABSTRACT);
33
-		KEYWORDS.put("final", K_FINAL);
34
-		KEYWORDS.put("override", K_OVERRIDE);
35
-		KEYWORDS.put("const", K_CONST);
36
-		KEYWORDS.put("private", K_PRIVATE);
37
-		KEYWORDS.put("public", K_PUBLIC);
38
-		KEYWORDS.put("export", K_EXPORT);
39
-		KEYWORDS.put("static", K_STATIC);
40
-		KEYWORDS.put("protected", K_PROTECTED);
41
-		KEYWORDS.put("implicit", K_IMPLICIT);
42
-		KEYWORDS.put("virtual", K_VIRTUAL);
43
-		KEYWORDS.put("extern", K_EXTERN);
44
-		
45
-		KEYWORDS.put("val", K_VAL);
46
-		KEYWORDS.put("var", K_VAR);
47
-		KEYWORDS.put("get", K_GET);
48
-		KEYWORDS.put("implements", K_IMPLEMENTS);
49
-		KEYWORDS.put("set", K_SET);
50
-		
51
-		KEYWORDS.put("void", K_VOID);
52
-		KEYWORDS.put("any", K_ANY);
53
-		KEYWORDS.put("bool", K_BOOL);
54
-		KEYWORDS.put("byte", K_BYTE);
55
-		KEYWORDS.put("sbyte", K_SBYTE);
56
-		KEYWORDS.put("short", K_SHORT);
57
-		KEYWORDS.put("ushort", K_USHORT);
58
-		KEYWORDS.put("int", K_INT);
59
-		KEYWORDS.put("uint", K_UINT);
60
-		KEYWORDS.put("long", K_LONG);
61
-		KEYWORDS.put("ulong", K_ULONG);
62
-		KEYWORDS.put("float", K_FLOAT);
63
-		KEYWORDS.put("double", K_DOUBLE);
64
-		KEYWORDS.put("char", K_CHAR);
65
-		KEYWORDS.put("string", K_STRING);
66
-		
67
-		KEYWORDS.put("if", K_IF);
68
-		KEYWORDS.put("else", K_ELSE);
69
-		KEYWORDS.put("do", K_DO);
70
-		KEYWORDS.put("while", K_WHILE);
71
-		KEYWORDS.put("for", K_FOR);
72
-		KEYWORDS.put("throw", K_THROW);
73
-		KEYWORDS.put("lock", K_LOCK);
74
-		KEYWORDS.put("try", K_TRY);
75
-		KEYWORDS.put("catch", K_CATCH);
76
-		KEYWORDS.put("finally", K_FINALLY);
77
-		KEYWORDS.put("return", K_RETURN);
78
-		KEYWORDS.put("break", K_BREAK);
79
-		KEYWORDS.put("continue", K_CONTINUE);
80
-		KEYWORDS.put("switch", K_SWITCH);
81
-		KEYWORDS.put("case", K_CASE);
82
-		KEYWORDS.put("default", K_DEFAULT);
83
-		
84
-		KEYWORDS.put("in", K_IN);
85
-		KEYWORDS.put("is", K_IS);
86
-		KEYWORDS.put("as", K_AS);
87
-		KEYWORDS.put("match", K_MATCH);
88
-		KEYWORDS.put("throws", K_THROWS);
89
-		
90
-		KEYWORDS.put("this", K_THIS);
91
-		KEYWORDS.put("super", K_SUPER);
92
-		KEYWORDS.put("null", K_NULL);
93
-		KEYWORDS.put("true", K_TRUE);
94
-		KEYWORDS.put("false", K_FALSE);
95
-		KEYWORDS.put("new", K_NEW);
22
+		for (ZSTokenType type : ZSTokenType.values())
23
+			if (type.isKeyword)
24
+				KEYWORDS.put(type.flyweight.content, type.flyweight);
96
 	}
25
 	}
97
 
26
 
98
 	@Override
27
 	@Override
99
 	public ZSToken create(ZSTokenType type, String content) {
28
 	public ZSToken create(ZSTokenType type, String content) {
100
 		if (type == T_IDENTIFIER && KEYWORDS.containsKey(content))
29
 		if (type == T_IDENTIFIER && KEYWORDS.containsKey(content))
101
-			type = KEYWORDS.get(content);
30
+			return KEYWORDS.get(content);
31
+		else if (type.flyweight != null)
32
+			return type.flyweight;
102
 		
33
 		
103
 		return new ZSToken(type, content);
34
 		return new ZSToken(type, content);
104
 	}
35
 	}

+ 7
- 16
Parser/src/main/java/org/openzen/zenscript/lexer/ZSTokenParser.java View File

5
  */
5
  */
6
 package org.openzen.zenscript.lexer;
6
 package org.openzen.zenscript.lexer;
7
 
7
 
8
+import java.io.IOException;
8
 import java.io.Reader;
9
 import java.io.Reader;
9
 import org.openzen.zenscript.codemodel.WhitespaceInfo;
10
 import org.openzen.zenscript.codemodel.WhitespaceInfo;
10
 
11
 
12
  *
13
  *
13
  * @author Hoofdgebruiker
14
  * @author Hoofdgebruiker
14
  */
15
  */
15
-public class ZSTokenParser extends MemoryTokenStreamImpl<ZSTokenType, ZSToken>
16
-		implements ZSTokenStream {
17
-	public static TokenParser<ZSToken, ZSTokenType> createRaw(String filename, Reader reader) {
16
+public class ZSTokenParser extends LLParserTokenStream<ZSTokenType, ZSToken> {
17
+	public static TokenParser<ZSToken, ZSTokenType> createRaw(String filename, CharReader reader) {
18
 		return new TokenParser<>(
18
 		return new TokenParser<>(
19
 				filename,
19
 				filename,
20
 				reader,
20
 				reader,
24
 				ZSTokenFactory.INSTANCE);
24
 				ZSTokenFactory.INSTANCE);
25
 	}
25
 	}
26
 	
26
 	
27
-	public static ZSTokenParser create(String filename, Reader reader) {
28
-		return create(filename, new WhitespaceFilteringParser(createRaw(filename, reader)));
27
+	public static ZSTokenParser create(String filename, Reader reader) throws IOException {
28
+		return create(filename, createRaw(filename, new ReaderCharReader(reader)));
29
 	}
29
 	}
30
 	
30
 	
31
-	public static ZSTokenParser create(String filename, WhitespaceFilteringParser<ZSTokenType, ZSToken> parser) {
32
-		return new ZSTokenParser(filename, parser);
31
+	public static ZSTokenParser create(String filename, TokenStream<ZSTokenType, ZSToken> tokens) {
32
+		return new ZSTokenParser(filename, new WhitespaceFilteringParser(tokens));
33
 	}
33
 	}
34
 	
34
 	
35
 	private static final CompiledDFA DFA = CompiledDFA.createLexerDFA(ZSTokenType.values(), ZSTokenType.class);
35
 	private static final CompiledDFA DFA = CompiledDFA.createLexerDFA(ZSTokenType.values(), ZSTokenType.class);
44
 		this.filename = filename;
44
 		this.filename = filename;
45
 	}
45
 	}
46
 	
46
 	
47
-	@Override
48
 	public String getFilename() {
47
 	public String getFilename() {
49
 		return filename;
48
 		return filename;
50
 	}
49
 	}
51
 	
50
 	
52
-	@Override
53
 	public String getLastWhitespace() {
51
 	public String getLastWhitespace() {
54
 		return whitespaceFilteringParser.getLastWhitespace();
52
 		return whitespaceFilteringParser.getLastWhitespace();
55
 	}
53
 	}
56
 	
54
 	
57
-	@Override
58
 	public void skipWhitespaceNewline() {
55
 	public void skipWhitespaceNewline() {
59
 		whitespaceFilteringParser.skipWhitespaceNewline();
56
 		whitespaceFilteringParser.skipWhitespaceNewline();
60
 	}
57
 	}
61
 	
58
 	
62
-	@Override
63
 	public WhitespaceInfo collectWhitespaceInfo(String whitespace, boolean skipLineBefore) {
59
 	public WhitespaceInfo collectWhitespaceInfo(String whitespace, boolean skipLineBefore) {
64
 		return WhitespaceInfo.from(whitespace, whitespaceFilteringParser.grabWhitespaceLine(), skipLineBefore);
60
 		return WhitespaceInfo.from(whitespace, whitespaceFilteringParser.grabWhitespaceLine(), skipLineBefore);
65
 	}
61
 	}
66
-	
67
-	@Override
68
-	public ZSTokenType getEOF() {
69
-		return ZSTokenType.EOF;
70
-	}
71
 }
62
 }

+ 0
- 22
Parser/src/main/java/org/openzen/zenscript/lexer/ZSTokenStream.java View File

1
-/*
2
- * To change this license header, choose License Headers in Project Properties.
3
- * To change this template file, choose Tools | Templates
4
- * and open the template in the editor.
5
- */
6
-package org.openzen.zenscript.lexer;
7
-
8
-import org.openzen.zenscript.codemodel.WhitespaceInfo;
9
-
10
-/**
11
- *
12
- * @author Hoofdgebruiker
13
- */
14
-public interface ZSTokenStream extends MemoryTokenStream<ZSTokenType, ZSToken> {
15
-	String getFilename();
16
-	
17
-	String getLastWhitespace();
18
-	
19
-	void skipWhitespaceNewline();
20
-	
21
-	WhitespaceInfo collectWhitespaceInfo(String whitespace, boolean skipLineBefore);
22
-}

+ 145
- 122
Parser/src/main/java/org/openzen/zenscript/lexer/ZSTokenType.java View File

19
 	T_INT("\\-?(0|[1-9][0-9]*)"),
19
 	T_INT("\\-?(0|[1-9][0-9]*)"),
20
 	T_STRING_SQ("\"([^\"\\\\]|\\\\([\'\"\\\\/bfnrt&]|u[0-9a-fA-F]{4}))*\""),
20
 	T_STRING_SQ("\"([^\"\\\\]|\\\\([\'\"\\\\/bfnrt&]|u[0-9a-fA-F]{4}))*\""),
21
 	T_STRING_DQ("\'([^\'\\\\]|\\\\([\'\"\\\\/bfnrt&]|u[0-9a-fA-F]{4}))*\'"),
21
 	T_STRING_DQ("\'([^\'\\\\]|\\\\([\'\"\\\\/bfnrt&]|u[0-9a-fA-F]{4}))*\'"),
22
-	T_AOPEN("\\{"),
23
-	T_ACLOSE("\\}"),
24
-	T_SQOPEN("\\["),
25
-	T_SQCLOSE("\\]"),
26
-	T_DOT3("\\.\\.\\."),
27
-	T_DOT2("\\.\\."),
28
-	T_DOT("\\."),
29
-	T_COMMA(","),
30
-	T_INCREMENT("\\+\\+"),
31
-	T_ADDASSIGN("\\+="),
32
-	T_ADD("\\+"),
33
-	T_DECREMENT("\\-\\-"),
34
-	T_SUBASSIGN("\\-="),
35
-	T_SUB("\\-"),
36
-	T_CATASSIGN("~="),
37
-	T_CAT("~"),
38
-	T_MULASSIGN("\\*="),
39
-	T_MUL("\\*"),
40
-	T_DIVASSIGN("/="),
41
-	T_DIV("/"),
42
-	T_MODASSIGN("%="),
43
-	T_MOD("%"),
44
-	T_ORASSIGN("\\|="),
45
-	T_OROR("\\|\\|"),
46
-	T_OR("\\|"),
47
-	T_ANDASSIGN("&="),
48
-	T_ANDAND("&&"),
49
-	T_AND("&"),
50
-	T_XORASSIGN("\\^="),
51
-	T_XOR("\\^"),
52
-	T_COALESCE("\\?\\?"),
53
-	T_QUEST("\\?"),
54
-	T_COLON(":"),
55
-	T_BROPEN("\\("),
56
-	T_BRCLOSE("\\)"),
57
-	T_SEMICOLON(";"),
58
-	T_LESSEQ("<="),
59
-	T_SHLASSIGN("<<="),
60
-	T_SHL("<<"),
61
-	T_LESS("<"),
62
-	T_GREATEREQ(">="),
63
-	T_USHR(">>>"),
64
-	T_USHRASSIGN(">>>="),
65
-	T_SHRASSIGN(">>="),
66
-	T_SHR(">>"),
67
-	T_GREATER(">"),
68
-	T_LAMBDA("=>"),
69
-	T_EQUAL3("==="),
70
-	T_EQUAL2("=="),
71
-	T_ASSIGN("="),
72
-	T_NOTEQUAL2("!=="),
73
-	T_NOTEQUAL("!="),
74
-	T_NOT("!"),
75
-	T_DOLLAR("$"),
22
+	T_AOPEN("\\{", "{"),
23
+	T_ACLOSE("\\}", "}"),
24
+	T_SQOPEN("\\[", "["),
25
+	T_SQCLOSE("\\]", "]"),
26
+	T_DOT3("\\.\\.\\.", "..."),
27
+	T_DOT2("\\.\\.", ".."),
28
+	T_DOT("\\.", "."),
29
+	T_COMMA(",", ","),
30
+	T_INCREMENT("\\+\\+", "++"),
31
+	T_ADDASSIGN("\\+=", "+="),
32
+	T_ADD("\\+", "+"),
33
+	T_DECREMENT("\\-\\-", "--"),
34
+	T_SUBASSIGN("\\-=", "-="),
35
+	T_SUB("\\-", "-"),
36
+	T_CATASSIGN("~=", "~="),
37
+	T_CAT("~", "~"),
38
+	T_MULASSIGN("\\*=", "*="),
39
+	T_MUL("\\*", "*"),
40
+	T_DIVASSIGN("/=", "/="),
41
+	T_DIV("/", "/"),
42
+	T_MODASSIGN("%=", "%="),
43
+	T_MOD("%", "%"),
44
+	T_ORASSIGN("\\|=", "|="),
45
+	T_OROR("\\|\\|", "||"),
46
+	T_OR("\\|", "|"),
47
+	T_ANDASSIGN("&=", "&="),
48
+	T_ANDAND("&&", "&&"),
49
+	T_AND("&", "&"),
50
+	T_XORASSIGN("\\^=", "^="),
51
+	T_XOR("\\^", "^"),
52
+	T_COALESCE("\\?\\?", "??"),
53
+	T_QUEST("\\?", "?"),
54
+	T_COLON(":", ":"),
55
+	T_BROPEN("\\(", "("),
56
+	T_BRCLOSE("\\)", ")"),
57
+	T_SEMICOLON(";", ";"),
58
+	T_LESSEQ("<=", "<="),
59
+	T_SHLASSIGN("<<=", "<<="),
60
+	T_SHL("<<", "<<"),
61
+	T_LESS("<", "<"),
62
+	T_GREATEREQ(">=", ">="),
63
+	T_USHR(">>>", ">>>"),
64
+	T_USHRASSIGN(">>>=", ">>>="),
65
+	T_SHRASSIGN(">>=", ">>="),
66
+	T_SHR(">>", ">>"),
67
+	T_GREATER(">", ">"),
68
+	T_LAMBDA("=>", "=>"),
69
+	T_EQUAL3("===", "==="),
70
+	T_EQUAL2("==", "=="),
71
+	T_ASSIGN("=", "="),
72
+	T_NOTEQUAL2("!==", "!=="),
73
+	T_NOTEQUAL("!=", "!="),
74
+	T_NOT("!", "!"),
75
+	T_DOLLAR("$", "$"),
76
 	
76
 	
77
-	K_IMPORT,
78
-	K_ALIAS,
79
-	K_CLASS,
80
-	K_FUNCTION,
81
-	K_INTERFACE,
82
-	K_ENUM,
83
-	K_STRUCT,
84
-	K_EXPAND,
85
-	K_VARIANT,
77
+	K_IMPORT(true, "import"),
78
+	K_ALIAS(true, "alias"),
79
+	K_CLASS(true, "class"),
80
+	K_FUNCTION(true, "function"),
81
+	K_INTERFACE(true, "interface"),
82
+	K_ENUM(true, "enum"),
83
+	K_STRUCT(true, "struct"),
84
+	K_EXPAND(true, "expand"),
85
+	K_VARIANT(true, "variant"),
86
 	
86
 	
87
-	K_ABSTRACT,
88
-	K_FINAL,
89
-	K_OVERRIDE,
90
-	K_CONST,
91
-	K_PRIVATE,
92
-	K_PUBLIC,
93
-	K_EXPORT,
94
-	K_STATIC,
95
-	K_PROTECTED,
96
-	K_IMPLICIT,
97
-	K_VIRTUAL,
98
-	K_EXTERN,
87
+	K_ABSTRACT(true, "abstract"),
88
+	K_FINAL(true, "final"),
89
+	K_OVERRIDE(true, "override"),
90
+	K_CONST(true, "const"),
91
+	K_PRIVATE(true, "private"),
92
+	K_PUBLIC(true, "public"),
93
+	K_EXPORT(true, "export"),
94
+	K_STATIC(true, "static"),
95
+	K_PROTECTED(true, "protected"),
96
+	K_IMPLICIT(true, "implicit"),
97
+	K_VIRTUAL(true, "virtual"),
98
+	K_EXTERN(true, "extern"),
99
 	
99
 	
100
-	K_VAL,
101
-	K_VAR,
102
-	K_GET,
103
-	K_IMPLEMENTS,
104
-	K_SET,
100
+	K_VAL(true, "val"),
101
+	K_VAR(true, "var"),
102
+	K_GET(true, "get"),
103
+	K_IMPLEMENTS(true, "implements"),
104
+	K_SET(true, "set"),
105
 	
105
 	
106
-	K_VOID,
107
-	K_ANY,
108
-	K_BOOL,
109
-	K_BYTE,
110
-	K_SBYTE,
111
-	K_SHORT,
112
-	K_USHORT,
113
-	K_INT,
114
-	K_UINT,
115
-	K_LONG,
116
-	K_ULONG,
117
-	K_FLOAT,
118
-	K_DOUBLE,
119
-	K_CHAR,
120
-	K_STRING,
106
+	K_VOID(true, "void"),
107
+	K_ANY(true, "any"),
108
+	K_BOOL(true, "bool"),
109
+	K_BYTE(true, "byte"),
110
+	K_SBYTE(true, "sbyte"),
111
+	K_SHORT(true, "short"),
112
+	K_USHORT(true, "ushort"),
113
+	K_INT(true, "int"),
114
+	K_UINT(true, "uint"),
115
+	K_LONG(true, "long"),
116
+	K_ULONG(true, "ulong"),
117
+	K_FLOAT(true, "float"),
118
+	K_DOUBLE(true, "double"),
119
+	K_CHAR(true, "char"),
120
+	K_STRING(true, "string"),
121
 	
121
 	
122
-	K_IF,
123
-	K_ELSE,
124
-	K_DO,
125
-	K_WHILE,
126
-	K_FOR,
127
-	K_THROW,
128
-	K_LOCK,
129
-	K_TRY,
130
-	K_CATCH,
131
-	K_FINALLY,
132
-	K_RETURN,
133
-	K_BREAK,
134
-	K_CONTINUE,
135
-	K_SWITCH,
136
-	K_CASE,
137
-	K_DEFAULT,
122
+	K_IF(true, "if"),
123
+	K_ELSE(true, "else"),
124
+	K_DO(true, "do"),
125
+	K_WHILE(true, "while"),
126
+	K_FOR(true, "for"),
127
+	K_THROW(true, "throw"),
128
+	K_LOCK(true, "lock"),
129
+	K_TRY(true, "try"),
130
+	K_CATCH(true, "catch"),
131
+	K_FINALLY(true, "finally"),
132
+	K_RETURN(true, "return"),
133
+	K_BREAK(true, "break"),
134
+	K_CONTINUE(true, "continue"),
135
+	K_SWITCH(true, "switch"),
136
+	K_CASE(true, "case"),
137
+	K_DEFAULT(true, "default"),
138
 	
138
 	
139
-	K_IN,
140
-	K_IS,
141
-	K_AS,
142
-	K_MATCH,
143
-	K_THROWS,
139
+	K_IN(true, "in"),
140
+	K_IS(true, "is"),
141
+	K_AS(true, "as"),
142
+	K_MATCH(true, "match"),
143
+	K_THROWS(true, "throws"),
144
 	
144
 	
145
-	K_SUPER,
146
-	K_THIS,
147
-	K_NULL,
148
-	K_TRUE,
149
-	K_FALSE,
150
-	K_NEW,
145
+	K_SUPER(true, "super"),
146
+	K_THIS(true, "this"),
147
+	K_NULL(true, "null"),
148
+	K_TRUE(true, "true"),
149
+	K_FALSE(true, "false"),
150
+	K_NEW(true, "new"),
151
 	
151
 	
152
 	INVALID,
152
 	INVALID,
153
 	EOF
153
 	EOF
156
 	private final String regexp;
156
 	private final String regexp;
157
 	private final boolean whitespace;
157
 	private final boolean whitespace;
158
 	
158
 	
159
+	public final ZSToken flyweight;
160
+	public final boolean isKeyword;
161
+	
159
 	private ZSTokenType() {
162
 	private ZSTokenType() {
160
 		this.regexp = null;
163
 		this.regexp = null;
161
 		this.whitespace = false;
164
 		this.whitespace = false;
165
+		this.isKeyword = false;
166
+		this.flyweight = null;
162
 	}
167
 	}
163
 	
168
 	
164
 	private ZSTokenType(String regexp) {
169
 	private ZSTokenType(String regexp) {
165
 		this.regexp = regexp;
170
 		this.regexp = regexp;
166
 		this.whitespace = false;
171
 		this.whitespace = false;
172
+		this.isKeyword = false;
173
+		this.flyweight = null;
167
 	}
174
 	}
168
 	
175
 	
169
 	private ZSTokenType(String regexp, boolean whitespace) {
176
 	private ZSTokenType(String regexp, boolean whitespace) {
170
 		this.regexp = regexp;
177
 		this.regexp = regexp;
171
 		this.whitespace = whitespace;
178
 		this.whitespace = whitespace;
179
+		this.isKeyword = false;
180
+		this.flyweight = null;
181
+	}
182
+	
183
+	private ZSTokenType(String regexp, String content) {
184
+		this.regexp = regexp;
185
+		this.whitespace = false;
186
+		this.isKeyword = false;
187
+		this.flyweight = new ZSToken(this, content);
188
+	}
189
+	
190
+	private ZSTokenType(boolean isKeyword, String content) {
191
+		this.regexp = null;
192
+		this.whitespace = false;
193
+		this.isKeyword = isKeyword;
194
+		this.flyweight = new ZSToken(this, content);
172
 	}
195
 	}
173
 
196
 
174
 	@Override
197
 	@Override

+ 2
- 2
Parser/src/main/java/org/openzen/zenscript/parser/ParsedDefinition.java View File

7
 
7
 
8
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
8
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
9
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
9
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
10
+import org.openzen.zenscript.lexer.ZSTokenParser;
10
 import org.openzen.zenscript.shared.CodePosition;
11
 import org.openzen.zenscript.shared.CodePosition;
11
-import org.openzen.zenscript.lexer.ZSTokenStream;
12
 import static org.openzen.zenscript.lexer.ZSTokenType.*;
12
 import static org.openzen.zenscript.lexer.ZSTokenType.*;
13
 import org.openzen.zenscript.linker.BaseScope;
13
 import org.openzen.zenscript.linker.BaseScope;
14
 import org.openzen.zenscript.parser.definitions.ParsedAlias;
14
 import org.openzen.zenscript.parser.definitions.ParsedAlias;
25
  * @author Hoofdgebruiker
25
  * @author Hoofdgebruiker
26
  */
26
  */
27
 public abstract class ParsedDefinition {
27
 public abstract class ParsedDefinition {
28
-	public static ParsedDefinition parse(ZSPackage pkg, CodePosition position, int modifiers, ZSTokenStream tokens, HighLevelDefinition outerDefinition) {
28
+	public static ParsedDefinition parse(ZSPackage pkg, CodePosition position, int modifiers, ZSTokenParser tokens, HighLevelDefinition outerDefinition) {
29
 		if (tokens.optional(K_CLASS) != null) {
29
 		if (tokens.optional(K_CLASS) != null) {
30
 			return ParsedClass.parseClass(pkg, position, modifiers, tokens, outerDefinition);
30
 			return ParsedClass.parseClass(pkg, position, modifiers, tokens, outerDefinition);
31
 		} else if (tokens.optional(K_INTERFACE) != null) {
31
 		} else if (tokens.optional(K_INTERFACE) != null) {

+ 1
- 2
Parser/src/main/java/org/openzen/zenscript/parser/ParsedFile.java View File

28
 import org.openzen.zenscript.shared.CompileException;
28
 import org.openzen.zenscript.shared.CompileException;
29
 import org.openzen.zenscript.shared.CompileExceptionCode;
29
 import org.openzen.zenscript.shared.CompileExceptionCode;
30
 import org.openzen.zenscript.lexer.ZSTokenParser;
30
 import org.openzen.zenscript.lexer.ZSTokenParser;
31
-import org.openzen.zenscript.lexer.ZSTokenStream;
32
 import static org.openzen.zenscript.lexer.ZSTokenType.*;
31
 import static org.openzen.zenscript.lexer.ZSTokenType.*;
33
 import org.openzen.zenscript.linker.FileScope;
32
 import org.openzen.zenscript.linker.FileScope;
34
 import org.openzen.zenscript.linker.GlobalScriptScope;
33
 import org.openzen.zenscript.linker.GlobalScriptScope;
62
 		return parse(pkg, tokens);
61
 		return parse(pkg, tokens);
63
 	}
62
 	}
64
 	
63
 	
65
-	public static ParsedFile parse(ZSPackage pkg, ZSTokenStream tokens) {
64
+	public static ParsedFile parse(ZSPackage pkg, ZSTokenParser tokens) {
66
 		ParsedFile result = new ParsedFile(tokens.getFilename());
65
 		ParsedFile result = new ParsedFile(tokens.getFilename());
67
 		ZSToken eof = null;
66
 		ZSToken eof = null;
68
 
67
 

+ 2
- 2
Parser/src/main/java/org/openzen/zenscript/parser/ParsedImport.java View File

9
 import java.util.List;
9
 import java.util.List;
10
 import org.openzen.zenscript.shared.CodePosition;
10
 import org.openzen.zenscript.shared.CodePosition;
11
 import org.openzen.zenscript.lexer.ZSToken;
11
 import org.openzen.zenscript.lexer.ZSToken;
12
-import org.openzen.zenscript.lexer.ZSTokenStream;
12
+import org.openzen.zenscript.lexer.ZSTokenParser;
13
 import static org.openzen.zenscript.lexer.ZSTokenType.*;
13
 import static org.openzen.zenscript.lexer.ZSTokenType.*;
14
 
14
 
15
 /**
15
 /**
17
  * @author Hoofdgebruiker
17
  * @author Hoofdgebruiker
18
  */
18
  */
19
 public class ParsedImport {
19
 public class ParsedImport {
20
-	public static ParsedImport parse(CodePosition position, ZSTokenStream tokens) {
20
+	public static ParsedImport parse(CodePosition position, ZSTokenParser tokens) {
21
 		boolean relative = tokens.optional(T_DOT) != null;
21
 		boolean relative = tokens.optional(T_DOT) != null;
22
 		
22
 		
23
 		List<String> importName = new ArrayList<>();
23
 		List<String> importName = new ArrayList<>();

+ 2
- 2
Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedAlias.java View File

10
 import org.openzen.zenscript.codemodel.definition.AliasDefinition;
10
 import org.openzen.zenscript.codemodel.definition.AliasDefinition;
11
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
11
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
12
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
12
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
13
-import org.openzen.zenscript.lexer.ZSTokenStream;
13
+import org.openzen.zenscript.lexer.ZSTokenParser;
14
 import org.openzen.zenscript.lexer.ZSTokenType;
14
 import org.openzen.zenscript.lexer.ZSTokenType;
15
 import org.openzen.zenscript.linker.BaseScope;
15
 import org.openzen.zenscript.linker.BaseScope;
16
 import org.openzen.zenscript.linker.DefinitionScope;
16
 import org.openzen.zenscript.linker.DefinitionScope;
23
  * @author Hoofdgebruiker
23
  * @author Hoofdgebruiker
24
  */
24
  */
25
 public class ParsedAlias extends ParsedDefinition {
25
 public class ParsedAlias extends ParsedDefinition {
26
-	public static ParsedAlias parseAlias(ZSPackage pkg, CodePosition position, int modifiers, ZSTokenStream tokens, HighLevelDefinition outerDefinition) {
26
+	public static ParsedAlias parseAlias(ZSPackage pkg, CodePosition position, int modifiers, ZSTokenParser tokens, HighLevelDefinition outerDefinition) {
27
 		String name = tokens.required(ZSTokenType.T_IDENTIFIER, "identifier expected").content;
27
 		String name = tokens.required(ZSTokenType.T_IDENTIFIER, "identifier expected").content;
28
 		List<ParsedGenericParameter> parameters = ParsedGenericParameter.parseAll(tokens);
28
 		List<ParsedGenericParameter> parameters = ParsedGenericParameter.parseAll(tokens);
29
 		IParsedType type = IParsedType.parse(tokens);
29
 		IParsedType type = IParsedType.parse(tokens);

+ 2
- 2
Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedClass.java View File

9
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
9
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
10
 import org.openzen.zenscript.codemodel.definition.ClassDefinition;
10
 import org.openzen.zenscript.codemodel.definition.ClassDefinition;
11
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
11
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
12
-import org.openzen.zenscript.lexer.ZSTokenStream;
12
+import org.openzen.zenscript.lexer.ZSTokenParser;
13
 import org.openzen.zenscript.lexer.ZSTokenType;
13
 import org.openzen.zenscript.lexer.ZSTokenType;
14
 import org.openzen.zenscript.linker.BaseScope;
14
 import org.openzen.zenscript.linker.BaseScope;
15
 import org.openzen.zenscript.linker.GenericFunctionScope;
15
 import org.openzen.zenscript.linker.GenericFunctionScope;
22
  * @author Stan Hebben
22
  * @author Stan Hebben
23
  */
23
  */
24
 public class ParsedClass extends BaseParsedDefinition {
24
 public class ParsedClass extends BaseParsedDefinition {
25
-	public static ParsedClass parseClass(ZSPackage pkg, CodePosition position, int modifiers, ZSTokenStream tokens, HighLevelDefinition outerDefinition) {
25
+	public static ParsedClass parseClass(ZSPackage pkg, CodePosition position, int modifiers, ZSTokenParser tokens, HighLevelDefinition outerDefinition) {
26
 		String name = tokens.required(ZSTokenType.T_IDENTIFIER, "identifier expected").content;
26
 		String name = tokens.required(ZSTokenType.T_IDENTIFIER, "identifier expected").content;
27
 		List<ParsedGenericParameter> genericParameters = ParsedGenericParameter.parseAll(tokens);
27
 		List<ParsedGenericParameter> genericParameters = ParsedGenericParameter.parseAll(tokens);
28
 		
28
 		

+ 2
- 2
Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedEnum.java View File

12
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
12
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
13
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
13
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
14
 import org.openzen.zenscript.codemodel.type.ITypeID;
14
 import org.openzen.zenscript.codemodel.type.ITypeID;
15
-import org.openzen.zenscript.lexer.ZSTokenStream;
15
+import org.openzen.zenscript.lexer.ZSTokenParser;
16
 import org.openzen.zenscript.lexer.ZSTokenType;
16
 import org.openzen.zenscript.lexer.ZSTokenType;
17
 import org.openzen.zenscript.linker.BaseScope;
17
 import org.openzen.zenscript.linker.BaseScope;
18
 import org.openzen.zenscript.linker.ExpressionScope;
18
 import org.openzen.zenscript.linker.ExpressionScope;
24
  * @author Hoofdgebruiker
24
  * @author Hoofdgebruiker
25
  */
25
  */
26
 public class ParsedEnum extends BaseParsedDefinition {
26
 public class ParsedEnum extends BaseParsedDefinition {
27
-	public static ParsedEnum parseEnum(ZSPackage pkg, CodePosition position, int modifiers, ZSTokenStream tokens, HighLevelDefinition outerDefinition) {
27
+	public static ParsedEnum parseEnum(ZSPackage pkg, CodePosition position, int modifiers, ZSTokenParser tokens, HighLevelDefinition outerDefinition) {
28
 		String name = tokens.required(ZSTokenType.T_IDENTIFIER, "identifier expected").content;
28
 		String name = tokens.required(ZSTokenType.T_IDENTIFIER, "identifier expected").content;
29
 		tokens.required(ZSTokenType.T_AOPEN, "{ expected");
29
 		tokens.required(ZSTokenType.T_AOPEN, "{ expected");
30
 		
30
 		

+ 2
- 2
Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedEnumConstant.java View File

12
 import org.openzen.zenscript.codemodel.member.EnumConstantMember;
12
 import org.openzen.zenscript.codemodel.member.EnumConstantMember;
13
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
13
 import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
14
 import org.openzen.zenscript.lexer.ZSToken;
14
 import org.openzen.zenscript.lexer.ZSToken;
15
-import org.openzen.zenscript.lexer.ZSTokenStream;
15
+import org.openzen.zenscript.lexer.ZSTokenParser;
16
 import org.openzen.zenscript.lexer.ZSTokenType;
16
 import org.openzen.zenscript.lexer.ZSTokenType;
17
 import org.openzen.zenscript.linker.ExpressionScope;
17
 import org.openzen.zenscript.linker.ExpressionScope;
18
 import org.openzen.zenscript.parser.expression.ParsedCallArguments;
18
 import org.openzen.zenscript.parser.expression.ParsedCallArguments;
25
  * @author Hoofdgebruiker
25
  * @author Hoofdgebruiker
26
  */
26
  */
27
 public class ParsedEnumConstant {
27
 public class ParsedEnumConstant {
28
-	public static ParsedEnumConstant parse(ZSTokenStream tokens, EnumDefinition definition, int value) {
28
+	public static ParsedEnumConstant parse(ZSTokenParser tokens, EnumDefinition definition, int value) {
29
 		CodePosition position = tokens.getPosition();
29
 		CodePosition position = tokens.getPosition();
30
 		ZSToken name = tokens.required(ZSTokenType.T_IDENTIFIER, "identifier expected");
30
 		ZSToken name = tokens.required(ZSTokenType.T_IDENTIFIER, "identifier expected");
31
 		List<ParsedExpression> arguments = new ArrayList<>();
31
 		List<ParsedExpression> arguments = new ArrayList<>();

+ 2
- 2
Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedExpansion.java View File

9
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
9
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
10
 import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
10
 import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
11
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
11
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
12
-import org.openzen.zenscript.lexer.ZSTokenStream;
12
+import org.openzen.zenscript.lexer.ZSTokenParser;
13
 import org.openzen.zenscript.lexer.ZSTokenType;
13
 import org.openzen.zenscript.lexer.ZSTokenType;
14
 import org.openzen.zenscript.linker.BaseScope;
14
 import org.openzen.zenscript.linker.BaseScope;
15
 import org.openzen.zenscript.linker.GenericFunctionScope;
15
 import org.openzen.zenscript.linker.GenericFunctionScope;
22
  * @author Hoofdgebruiker
22
  * @author Hoofdgebruiker
23
  */
23
  */
24
 public class ParsedExpansion extends BaseParsedDefinition {
24
 public class ParsedExpansion extends BaseParsedDefinition {
25
-	public static ParsedExpansion parseExpansion(ZSPackage pkg, CodePosition position, int modifiers, ZSTokenStream tokens, HighLevelDefinition outerDefinition) {
25
+	public static ParsedExpansion parseExpansion(ZSPackage pkg, CodePosition position, int modifiers, ZSTokenParser tokens, HighLevelDefinition outerDefinition) {
26
 		List<ParsedGenericParameter> parameters = ParsedGenericParameter.parseAll(tokens);
26
 		List<ParsedGenericParameter> parameters = ParsedGenericParameter.parseAll(tokens);
27
 		IParsedType target = IParsedType.parse(tokens);
27
 		IParsedType target = IParsedType.parse(tokens);
28
 		tokens.required(ZSTokenType.T_AOPEN, "{ expected");
28
 		tokens.required(ZSTokenType.T_AOPEN, "{ expected");

+ 2
- 2
Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedFunction.java View File

10
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
10
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11
 import org.openzen.zenscript.codemodel.definition.FunctionDefinition;
11
 import org.openzen.zenscript.codemodel.definition.FunctionDefinition;
12
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
12
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
13
-import org.openzen.zenscript.lexer.ZSTokenStream;
13
+import org.openzen.zenscript.lexer.ZSTokenParser;
14
 import org.openzen.zenscript.linker.BaseScope;
14
 import org.openzen.zenscript.linker.BaseScope;
15
 import org.openzen.zenscript.linker.FunctionScope;
15
 import org.openzen.zenscript.linker.FunctionScope;
16
 import org.openzen.zenscript.parser.ParsedDefinition;
16
 import org.openzen.zenscript.parser.ParsedDefinition;
23
  * @author Stanneke
23
  * @author Stanneke
24
  */
24
  */
25
 public class ParsedFunction extends ParsedDefinition {
25
 public class ParsedFunction extends ParsedDefinition {
26
-	public static ParsedFunction parseFunction(ZSPackage pkg, CodePosition position, int modifiers, ZSTokenStream parser, HighLevelDefinition outerDefinition) {
26
+	public static ParsedFunction parseFunction(ZSPackage pkg, CodePosition position, int modifiers, ZSTokenParser parser, HighLevelDefinition outerDefinition) {
27
 		String name = parser.required(T_IDENTIFIER, "identifier expected").content;
27
 		String name = parser.required(T_IDENTIFIER, "identifier expected").content;
28
 		ParsedFunctionHeader header = ParsedFunctionHeader.parse(parser);
28
 		ParsedFunctionHeader header = ParsedFunctionHeader.parse(parser);
29
 		ParsedFunctionBody body = ParsedStatement.parseFunctionBody(parser);
29
 		ParsedFunctionBody body = ParsedStatement.parseFunctionBody(parser);

+ 2
- 2
Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedFunctionHeader.java View File

13
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
13
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
14
 import org.openzen.zenscript.codemodel.type.ITypeID;
14
 import org.openzen.zenscript.codemodel.type.ITypeID;
15
 import org.openzen.zenscript.lexer.ZSToken;
15
 import org.openzen.zenscript.lexer.ZSToken;
16
-import org.openzen.zenscript.lexer.ZSTokenStream;
16
+import org.openzen.zenscript.lexer.ZSTokenParser;
17
 import org.openzen.zenscript.lexer.ZSTokenType;
17
 import org.openzen.zenscript.lexer.ZSTokenType;
18
 import static org.openzen.zenscript.lexer.ZSTokenType.*;
18
 import static org.openzen.zenscript.lexer.ZSTokenType.*;
19
 import org.openzen.zenscript.linker.BaseScope;
19
 import org.openzen.zenscript.linker.BaseScope;
27
  * @author Hoofdgebruiker
27
  * @author Hoofdgebruiker
28
  */
28
  */
29
 public class ParsedFunctionHeader {
29
 public class ParsedFunctionHeader {
30
-	public static ParsedFunctionHeader parse(ZSTokenStream tokens) {
30
+	public static ParsedFunctionHeader parse(ZSTokenParser tokens) {
31
 		List<ParsedGenericParameter> genericParameters = null;
31
 		List<ParsedGenericParameter> genericParameters = null;
32
 		if (tokens.optional(ZSTokenType.T_LESS) != null) {
32
 		if (tokens.optional(ZSTokenType.T_LESS) != null) {
33
 			genericParameters = new ArrayList<>();
33
 			genericParameters = new ArrayList<>();

+ 2
- 3
Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedGenericParameter.java View File

10
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
10
 import org.openzen.zenscript.codemodel.generic.TypeParameter;
11
 import org.openzen.zenscript.lexer.ZSToken;
11
 import org.openzen.zenscript.lexer.ZSToken;
12
 import org.openzen.zenscript.lexer.ZSTokenParser;
12
 import org.openzen.zenscript.lexer.ZSTokenParser;
13
-import org.openzen.zenscript.lexer.ZSTokenStream;
14
 import org.openzen.zenscript.lexer.ZSTokenType;
13
 import org.openzen.zenscript.lexer.ZSTokenType;
15
 import org.openzen.zenscript.linker.BaseScope;
14
 import org.openzen.zenscript.linker.BaseScope;
16
 import org.openzen.zenscript.linker.GenericFunctionScope;
15
 import org.openzen.zenscript.linker.GenericFunctionScope;
22
  * @author Hoofdgebruiker
21
  * @author Hoofdgebruiker
23
  */
22
  */
24
 public class ParsedGenericParameter {
23
 public class ParsedGenericParameter {
25
-	public static ParsedGenericParameter parse(ZSTokenStream tokens) {
24
+	public static ParsedGenericParameter parse(ZSTokenParser tokens) {
26
 		CodePosition position = tokens.getPosition();
25
 		CodePosition position = tokens.getPosition();
27
 		ZSToken name = tokens.required(ZSTokenType.T_IDENTIFIER, "identifier expected");
26
 		ZSToken name = tokens.required(ZSTokenType.T_IDENTIFIER, "identifier expected");
28
 		List<ParsedGenericBound> bounds = new ArrayList<>();
27
 		List<ParsedGenericBound> bounds = new ArrayList<>();
36
 		return new ParsedGenericParameter(position, name.content, bounds);
35
 		return new ParsedGenericParameter(position, name.content, bounds);
37
 	}
36
 	}
38
 	
37
 	
39
-	public static List<ParsedGenericParameter> parseAll(ZSTokenStream tokens) {
38
+	public static List<ParsedGenericParameter> parseAll(ZSTokenParser tokens) {
40
 		if (tokens.optional(ZSTokenType.T_LESS) == null)
39
 		if (tokens.optional(ZSTokenType.T_LESS) == null)
41
 			return null;
40
 			return null;
42
 		
41
 		

+ 2
- 2
Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedInterface.java View File

11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
 import org.openzen.zenscript.codemodel.definition.InterfaceDefinition;
12
 import org.openzen.zenscript.codemodel.definition.InterfaceDefinition;
13
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
13
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
14
-import org.openzen.zenscript.lexer.ZSTokenStream;
14
+import org.openzen.zenscript.lexer.ZSTokenParser;
15
 import org.openzen.zenscript.lexer.ZSTokenType;
15
 import org.openzen.zenscript.lexer.ZSTokenType;
16
 import org.openzen.zenscript.linker.BaseScope;
16
 import org.openzen.zenscript.linker.BaseScope;
17
 import org.openzen.zenscript.parser.member.ParsedDefinitionMember;
17
 import org.openzen.zenscript.parser.member.ParsedDefinitionMember;
23
  * @author Hoofdgebruiker
23
  * @author Hoofdgebruiker
24
  */
24
  */
25
 public class ParsedInterface extends BaseParsedDefinition {
25
 public class ParsedInterface extends BaseParsedDefinition {
26
-	public static ParsedInterface parseInterface(ZSPackage pkg, CodePosition position, int modifiers, ZSTokenStream tokens, HighLevelDefinition outerDefinition) {
26
+	public static ParsedInterface parseInterface(ZSPackage pkg, CodePosition position, int modifiers, ZSTokenParser tokens, HighLevelDefinition outerDefinition) {
27
 		String name = tokens.required(ZSTokenType.T_IDENTIFIER, "identifier expected").content;
27
 		String name = tokens.required(ZSTokenType.T_IDENTIFIER, "identifier expected").content;
28
 		List<ParsedGenericParameter> genericParameters = ParsedGenericParameter.parseAll(tokens);
28
 		List<ParsedGenericParameter> genericParameters = ParsedGenericParameter.parseAll(tokens);
29
 		List<IParsedType> superInterfaces = Collections.emptyList();
29
 		List<IParsedType> superInterfaces = Collections.emptyList();

+ 2
- 2
Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedStruct.java View File

9
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
9
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
10
 import org.openzen.zenscript.codemodel.definition.StructDefinition;
10
 import org.openzen.zenscript.codemodel.definition.StructDefinition;
11
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
11
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
12
-import org.openzen.zenscript.lexer.ZSTokenStream;
12
+import org.openzen.zenscript.lexer.ZSTokenParser;
13
 import org.openzen.zenscript.lexer.ZSTokenType;
13
 import org.openzen.zenscript.lexer.ZSTokenType;
14
 import org.openzen.zenscript.linker.BaseScope;
14
 import org.openzen.zenscript.linker.BaseScope;
15
 import org.openzen.zenscript.parser.member.ParsedDefinitionMember;
15
 import org.openzen.zenscript.parser.member.ParsedDefinitionMember;
20
  * @author Hoofdgebruiker
20
  * @author Hoofdgebruiker
21
  */
21
  */
22
 public class ParsedStruct extends BaseParsedDefinition {
22
 public class ParsedStruct extends BaseParsedDefinition {
23
-	public static ParsedStruct parseStruct(ZSPackage pkg, CodePosition position, int modifiers, ZSTokenStream tokens, HighLevelDefinition outerDefinition) {
23
+	public static ParsedStruct parseStruct(ZSPackage pkg, CodePosition position, int modifiers, ZSTokenParser tokens, HighLevelDefinition outerDefinition) {
24
 		String name = tokens.required(ZSTokenType.T_IDENTIFIER, "identifier expected").content;
24
 		String name = tokens.required(ZSTokenType.T_IDENTIFIER, "identifier expected").content;
25
 		List<ParsedGenericParameter> parameters = ParsedGenericParameter.parseAll(tokens);
25
 		List<ParsedGenericParameter> parameters = ParsedGenericParameter.parseAll(tokens);
26
 		
26
 		

+ 2
- 2
Parser/src/main/java/org/openzen/zenscript/parser/definitions/ParsedVariant.java View File

10
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
10
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11
 import org.openzen.zenscript.codemodel.definition.VariantDefinition;
11
 import org.openzen.zenscript.codemodel.definition.VariantDefinition;
12
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
12
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
13
-import org.openzen.zenscript.lexer.ZSTokenStream;
13
+import org.openzen.zenscript.lexer.ZSTokenParser;
14
 import org.openzen.zenscript.lexer.ZSTokenType;
14
 import org.openzen.zenscript.lexer.ZSTokenType;
15
 import org.openzen.zenscript.linker.BaseScope;
15
 import org.openzen.zenscript.linker.BaseScope;
16
 import org.openzen.zenscript.linker.DefinitionScope;
16
 import org.openzen.zenscript.linker.DefinitionScope;
23
  * @author Hoofdgebruiker
23
  * @author Hoofdgebruiker
24
  */
24
  */
25
 public class ParsedVariant extends BaseParsedDefinition {
25
 public class ParsedVariant extends BaseParsedDefinition {
26
-	public static ParsedVariant parseVariant(ZSPackage pkg, CodePosition position, int modifiers, ZSTokenStream tokens, HighLevelDefinition outerDefinition) {
26
+	public static ParsedVariant parseVariant(ZSPackage pkg, CodePosition position, int modifiers, ZSTokenParser tokens, HighLevelDefinition outerDefinition) {
27
 		String name = tokens.required(ZSTokenType.T_IDENTIFIER, "identifier expected").content;
27
 		String name = tokens.required(ZSTokenType.T_IDENTIFIER, "identifier expected").content;
28
 		List<ParsedGenericParameter> typeParameters = ParsedGenericParameter.parseAll(tokens);
28
 		List<ParsedGenericParameter> typeParameters = ParsedGenericParameter.parseAll(tokens);
29
 		tokens.required(ZSTokenType.T_AOPEN, "{ expected");
29
 		tokens.required(ZSTokenType.T_AOPEN, "{ expected");

+ 2
- 2
Parser/src/main/java/org/openzen/zenscript/parser/expression/ParsedCallArguments.java View File

16
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
16
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
17
 import org.openzen.zenscript.codemodel.type.ITypeID;
17
 import org.openzen.zenscript.codemodel.type.ITypeID;
18
 import org.openzen.zenscript.codemodel.type.member.DefinitionMemberGroup;
18
 import org.openzen.zenscript.codemodel.type.member.DefinitionMemberGroup;
19
-import org.openzen.zenscript.lexer.ZSTokenStream;
19
+import org.openzen.zenscript.lexer.ZSTokenParser;
20
 import org.openzen.zenscript.linker.BaseScope;
20
 import org.openzen.zenscript.linker.BaseScope;
21
 import org.openzen.zenscript.linker.ExpressionScope;
21
 import org.openzen.zenscript.linker.ExpressionScope;
22
 import org.openzen.zenscript.shared.CodePosition;
22
 import org.openzen.zenscript.shared.CodePosition;
30
 public class ParsedCallArguments {
30
 public class ParsedCallArguments {
31
 	public static final ParsedCallArguments NONE = new ParsedCallArguments(Collections.emptyList());
31
 	public static final ParsedCallArguments NONE = new ParsedCallArguments(Collections.emptyList());
32
 	
32
 	
33
-	public static ParsedCallArguments parse(ZSTokenStream tokens) {
33
+	public static ParsedCallArguments parse(ZSTokenParser tokens) {
34
 		tokens.required(ZSTokenType.T_BROPEN, "( expected");
34
 		tokens.required(ZSTokenType.T_BROPEN, "( expected");
35
 		
35
 		
36
 		List<ParsedExpression> arguments = new ArrayList<>();
36
 		List<ParsedExpression> arguments = new ArrayList<>();

+ 17
- 17
Parser/src/main/java/org/openzen/zenscript/parser/expression/ParsedExpression.java View File

19
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
19
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
20
 import org.openzen.zenscript.codemodel.type.ITypeID;
20
 import org.openzen.zenscript.codemodel.type.ITypeID;
21
 import org.openzen.zenscript.lexer.ZSToken;
21
 import org.openzen.zenscript.lexer.ZSToken;
22
-import org.openzen.zenscript.lexer.ZSTokenStream;
22
+import org.openzen.zenscript.lexer.ZSTokenParser;
23
 import org.openzen.zenscript.linker.BaseScope;
23
 import org.openzen.zenscript.linker.BaseScope;
24
 import org.openzen.zenscript.parser.ParseException;
24
 import org.openzen.zenscript.parser.ParseException;
25
 import org.openzen.zenscript.parser.definitions.ParsedFunctionHeader;
25
 import org.openzen.zenscript.parser.definitions.ParsedFunctionHeader;
47
 		}
47
 		}
48
 	}
48
 	}
49
 	
49
 	
50
-	public static ParsedExpression parse(ZSTokenStream parser) {
50
+	public static ParsedExpression parse(ZSTokenParser parser) {
51
 		return readAssignExpression(parser, ParsingOptions.DEFAULT);
51
 		return readAssignExpression(parser, ParsingOptions.DEFAULT);
52
 	}
52
 	}
53
 	
53
 	
54
-	public static ParsedExpression parse(ZSTokenStream parser, ParsingOptions options) {
54
+	public static ParsedExpression parse(ZSTokenParser parser, ParsingOptions options) {
55
 		return readAssignExpression(parser, options);
55
 		return readAssignExpression(parser, options);
56
 	}
56
 	}
57
 
57
 
58
-	private static ParsedExpression readAssignExpression(ZSTokenStream parser, ParsingOptions options) {
58
+	private static ParsedExpression readAssignExpression(ZSTokenParser parser, ParsingOptions options) {
59
 		CodePosition position = parser.getPosition();
59
 		CodePosition position = parser.getPosition();
60
 		ParsedExpression left = readConditionalExpression(position, parser, options);
60
 		ParsedExpression left = readConditionalExpression(position, parser, options);
61
 
61
 
104
 		return left;
104
 		return left;
105
 	}
105
 	}
106
 
106
 
107
-	private static ParsedExpression readConditionalExpression(CodePosition position, ZSTokenStream parser, ParsingOptions options) {
107
+	private static ParsedExpression readConditionalExpression(CodePosition position, ZSTokenParser parser, ParsingOptions options) {
108
 		ParsedExpression left = readOrOrExpression(position, parser, options);
108
 		ParsedExpression left = readOrOrExpression(position, parser, options);
109
 
109
 
110
 		if (parser.optional(T_QUEST) != null) {
110
 		if (parser.optional(T_QUEST) != null) {
117
 		return left;
117
 		return left;
118
 	}
118
 	}
119
 
119
 
120
-	private static ParsedExpression readOrOrExpression(CodePosition position, ZSTokenStream parser, ParsingOptions options) {
120
+	private static ParsedExpression readOrOrExpression(CodePosition position, ZSTokenParser parser, ParsingOptions options) {
121
 		ParsedExpression left = readAndAndExpression(position, parser, options);
121
 		ParsedExpression left = readAndAndExpression(position, parser, options);
122
 
122
 
123
 		while (parser.optional(T_OROR) != null) {
123
 		while (parser.optional(T_OROR) != null) {
133
 		return left;
133
 		return left;
134
 	}
134
 	}
135
 
135
 
136
-	private static ParsedExpression readAndAndExpression(CodePosition position, ZSTokenStream parser, ParsingOptions options) {
136
+	private static ParsedExpression readAndAndExpression(CodePosition position, ZSTokenParser parser, ParsingOptions options) {
137
 		ParsedExpression left = readOrExpression(position, parser, options);
137
 		ParsedExpression left = readOrExpression(position, parser, options);
138
 
138
 
139
 		while (parser.optional(T_ANDAND) != null) {
139
 		while (parser.optional(T_ANDAND) != null) {
143
 		return left;
143
 		return left;
144
 	}
144
 	}
145
 
145
 
146
-	private static ParsedExpression readOrExpression(CodePosition position, ZSTokenStream parser, ParsingOptions options) {
146
+	private static ParsedExpression readOrExpression(CodePosition position, ZSTokenParser parser, ParsingOptions options) {
147
 		ParsedExpression left = readXorExpression(position, parser, options);
147
 		ParsedExpression left = readXorExpression(position, parser, options);
148
 
148
 
149
 		while (parser.optional(T_OR) != null) {
149
 		while (parser.optional(T_OR) != null) {
153
 		return left;
153
 		return left;
154
 	}
154
 	}
155
 
155
 
156
-	private static ParsedExpression readXorExpression(CodePosition position, ZSTokenStream parser, ParsingOptions options) {
156
+	private static ParsedExpression readXorExpression(CodePosition position, ZSTokenParser parser, ParsingOptions options) {
157
 		ParsedExpression left = readAndExpression(position, parser, options);
157
 		ParsedExpression left = readAndExpression(position, parser, options);
158
 
158
 
159
 		while (parser.optional(T_XOR) != null) {
159
 		while (parser.optional(T_XOR) != null) {
163
 		return left;
163
 		return left;
164
 	}
164
 	}
165
 
165
 
166
-	private static ParsedExpression readAndExpression(CodePosition position, ZSTokenStream parser, ParsingOptions options) {
166
+	private static ParsedExpression readAndExpression(CodePosition position, ZSTokenParser parser, ParsingOptions options) {
167
 		ParsedExpression left = readCompareExpression(position, parser, options);
167
 		ParsedExpression left = readCompareExpression(position, parser, options);
168
 
168
 
169
 		while (parser.optional(T_AND) != null) {
169
 		while (parser.optional(T_AND) != null) {
173
 		return left;
173
 		return left;
174
 	}
174
 	}
175
 
175
 
176
-	private static ParsedExpression readCompareExpression(CodePosition position, ZSTokenStream parser, ParsingOptions options) {
176
+	private static ParsedExpression readCompareExpression(CodePosition position, ZSTokenParser parser, ParsingOptions options) {
177
 		ParsedExpression left = readShiftExpression(position, parser, options);
177
 		ParsedExpression left = readShiftExpression(position, parser, options);
178
 
178
 
179
 		switch (parser.peek().getType()) {
179
 		switch (parser.peek().getType()) {
244
 		return left;
244
 		return left;
245
 	}
245
 	}
246
 	
246
 	
247
-	private static ParsedExpression readShiftExpression(CodePosition position, ZSTokenStream parser, ParsingOptions options) {
247
+	private static ParsedExpression readShiftExpression(CodePosition position, ZSTokenParser parser, ParsingOptions options) {
248
 		ParsedExpression left = readAddExpression(position, parser, options);
248
 		ParsedExpression left = readAddExpression(position, parser, options);
249
 		
249
 		
250
 		while (true) {
250
 		while (true) {
265
 		return left;
265
 		return left;
266
 	}
266
 	}
267
 
267
 
268
-	private static ParsedExpression readAddExpression(CodePosition position, ZSTokenStream parser, ParsingOptions options) {
268
+	private static ParsedExpression readAddExpression(CodePosition position, ZSTokenParser parser, ParsingOptions options) {
269
 		ParsedExpression left = readMulExpression(position, parser, options);
269
 		ParsedExpression left = readMulExpression(position, parser, options);
270
 		
270
 		
271
 		while (true) {
271
 		while (true) {
285
 		return left;
285
 		return left;
286
 	}
286
 	}
287
 
287
 
288
-	private static ParsedExpression readMulExpression(CodePosition position, ZSTokenStream parser, ParsingOptions options) {
288
+	private static ParsedExpression readMulExpression(CodePosition position, ZSTokenParser parser, ParsingOptions options) {
289
 		ParsedExpression left = readUnaryExpression(position, parser, options);
289
 		ParsedExpression left = readUnaryExpression(position, parser, options);
290
 
290
 
291
 		while (true) {
291
 		while (true) {
306
 		return left;
306
 		return left;
307
 	}
307
 	}
308
 
308
 
309
-	private static ParsedExpression readUnaryExpression(CodePosition position, ZSTokenStream parser, ParsingOptions options) {
309
+	private static ParsedExpression readUnaryExpression(CodePosition position, ZSTokenParser parser, ParsingOptions options) {
310
 		switch (parser.peek().getType()) {
310
 		switch (parser.peek().getType()) {
311
 			case T_NOT:
311
 			case T_NOT:
312
 				parser.next();
312
 				parser.next();
361
 		}
361
 		}
362
 	}
362
 	}
363
 
363
 
364
-	private static ParsedExpression readPostfixExpression(CodePosition position, ZSTokenStream parser, ParsingOptions options) {
364
+	private static ParsedExpression readPostfixExpression(CodePosition position, ZSTokenParser parser, ParsingOptions options) {
365
 		ParsedExpression base = readPrimaryExpression(position, parser, options);
365
 		ParsedExpression base = readPrimaryExpression(position, parser, options);
366
 
366
 
367
 		while (true) {
367
 		while (true) {
415
 		return base;
415
 		return base;
416
 	}
416
 	}
417
 	
417
 	
418
-	private static ParsedExpression readPrimaryExpression(CodePosition position, ZSTokenStream parser, ParsingOptions options) {
418
+	private static ParsedExpression readPrimaryExpression(CodePosition position, ZSTokenParser parser, ParsingOptions options) {
419
 		switch (parser.peek().getType()) {
419
 		switch (parser.peek().getType()) {
420
 			case T_INT:
420
 			case T_INT:
421
 				return new ParsedExpressionInt(position, Long.parseLong(parser.next().content));
421
 				return new ParsedExpressionInt(position, Long.parseLong(parser.next().content));

+ 2
- 2
Parser/src/main/java/org/openzen/zenscript/parser/member/ParsedDefinitionMember.java View File

17
 import org.openzen.zenscript.codemodel.OperatorType;
17
 import org.openzen.zenscript.codemodel.OperatorType;
18
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
18
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
19
 import org.openzen.zenscript.lexer.ZSToken;
19
 import org.openzen.zenscript.lexer.ZSToken;
20
-import org.openzen.zenscript.lexer.ZSTokenStream;
20
+import org.openzen.zenscript.lexer.ZSTokenParser;
21
 import org.openzen.zenscript.lexer.ZSTokenType;
21
 import org.openzen.zenscript.lexer.ZSTokenType;
22
 import org.openzen.zenscript.linker.BaseScope;
22
 import org.openzen.zenscript.linker.BaseScope;
23
 import org.openzen.zenscript.parser.definitions.ParsedFunctionHeader;
23
 import org.openzen.zenscript.parser.definitions.ParsedFunctionHeader;
32
  * @author Hoofdgebruiker
32
  * @author Hoofdgebruiker
33
  */
33
  */
34
 public abstract class ParsedDefinitionMember {
34
 public abstract class ParsedDefinitionMember {
35
-	public static ParsedDefinitionMember parse(ZSTokenStream tokens, HighLevelDefinition forDefinition) {
35
+	public static ParsedDefinitionMember parse(ZSTokenParser tokens, HighLevelDefinition forDefinition) {
36
 		CodePosition start = tokens.getPosition();
36
 		CodePosition start = tokens.getPosition();
37
 		int modifiers = 0;
37
 		int modifiers = 0;
38
 		outer: while (true) {
38
 		outer: while (true) {

+ 6
- 6
Parser/src/main/java/org/openzen/zenscript/parser/statements/ParsedStatement.java View File

6
 import org.openzen.zenscript.codemodel.WhitespacePostComment;
6
 import org.openzen.zenscript.codemodel.WhitespacePostComment;
7
 import org.openzen.zenscript.codemodel.statement.Statement;
7
 import org.openzen.zenscript.codemodel.statement.Statement;
8
 import org.openzen.zenscript.lexer.ZSToken;
8
 import org.openzen.zenscript.lexer.ZSToken;
9
-import org.openzen.zenscript.lexer.ZSTokenStream;
9
+import org.openzen.zenscript.lexer.ZSTokenParser;
10
 import org.openzen.zenscript.lexer.ZSTokenType;
10
 import org.openzen.zenscript.lexer.ZSTokenType;
11
 import static org.openzen.zenscript.lexer.ZSTokenType.*;
11
 import static org.openzen.zenscript.lexer.ZSTokenType.*;
12
 import org.openzen.zenscript.linker.StatementScope;
12
 import org.openzen.zenscript.linker.StatementScope;
18
 import org.openzen.zenscript.shared.CompileExceptionCode;
18
 import org.openzen.zenscript.shared.CompileExceptionCode;
19
 
19
 
20
 public abstract class ParsedStatement {
20
 public abstract class ParsedStatement {
21
-	public static ParsedFunctionBody parseLambdaBody(ZSTokenStream tokens, boolean inExpression) {
21
+	public static ParsedFunctionBody parseLambdaBody(ZSTokenParser tokens, boolean inExpression) {
22
 		CodePosition position = tokens.getPosition();
22
 		CodePosition position = tokens.getPosition();
23
 		ZSToken start = tokens.peek();
23
 		ZSToken start = tokens.peek();
24
 		if (tokens.optional(T_AOPEN) != null) {
24
 		if (tokens.optional(T_AOPEN) != null) {
35
 		}
35
 		}
36
 	}
36
 	}
37
 	
37
 	
38
-	public static ParsedFunctionBody parseFunctionBody(ZSTokenStream tokens) {
38
+	public static ParsedFunctionBody parseFunctionBody(ZSTokenParser tokens) {
39
 		if (tokens.optional(T_LAMBDA) != null)
39
 		if (tokens.optional(T_LAMBDA) != null)
40
 			return parseLambdaBody(tokens, false);
40
 			return parseLambdaBody(tokens, false);
41
 		else if (tokens.optional(T_SEMICOLON) != null)
41
 		else if (tokens.optional(T_SEMICOLON) != null)
44
 			return new ParsedStatementsFunctionBody(parseBlock(tokens, true));
44
 			return new ParsedStatementsFunctionBody(parseBlock(tokens, true));
45
 	}
45
 	}
46
 	
46
 	
47
-	public static ParsedStatementBlock parseBlock(ZSTokenStream parser, boolean isFirst) {
47
+	public static ParsedStatementBlock parseBlock(ZSTokenParser parser, boolean isFirst) {
48
 		String ws = parser.getLastWhitespace();
48
 		String ws = parser.getLastWhitespace();
49
 		CodePosition position = parser.getPosition();
49
 		CodePosition position = parser.getPosition();
50
 		parser.required(T_AOPEN, "{ expected");
50
 		parser.required(T_AOPEN, "{ expected");
63
 		return new ParsedStatementBlock(position, whitespace, postComment, statements);
63
 		return new ParsedStatementBlock(position, whitespace, postComment, statements);
64
 	}
64
 	}
65
 	
65
 	
66
-	public static ParsedStatement parse(ZSTokenStream parser) {
66
+	public static ParsedStatement parse(ZSTokenParser parser) {
67
 		return parse(parser, false);
67
 		return parse(parser, false);
68
 	}
68
 	}
69
 	
69
 	
70
-	public static ParsedStatement parse(ZSTokenStream parser, boolean isFirst) {
70
+	public static ParsedStatement parse(ZSTokenParser parser, boolean isFirst) {
71
 		String ws = parser.getLastWhitespace();
71
 		String ws = parser.getLastWhitespace();
72
 		CodePosition position = parser.getPosition();
72
 		CodePosition position = parser.getPosition();
73
 		ZSToken next = parser.peek();
73
 		ZSToken next = parser.peek();

+ 8
- 8
Parser/src/main/java/org/openzen/zenscript/parser/type/IParsedType.java View File

10
 import java.util.List;
10
 import java.util.List;
11
 import org.openzen.zenscript.codemodel.type.ITypeID;
11
 import org.openzen.zenscript.codemodel.type.ITypeID;
12
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
12
 import org.openzen.zenscript.codemodel.type.member.TypeMembers;
13
-import org.openzen.zenscript.lexer.ZSTokenStream;
13
+import org.openzen.zenscript.lexer.ZSTokenParser;
14
 import org.openzen.zenscript.lexer.ZSTokenType;
14
 import org.openzen.zenscript.lexer.ZSTokenType;
15
 import static org.openzen.zenscript.lexer.ZSTokenType.*;
15
 import static org.openzen.zenscript.lexer.ZSTokenType.*;
16
 import org.openzen.zenscript.linker.BaseScope;
16
 import org.openzen.zenscript.linker.BaseScope;
24
  * @author Hoofdgebruiker
24
  * @author Hoofdgebruiker
25
  */
25
  */
26
 public interface IParsedType {
26
 public interface IParsedType {
27
-	public static IParsedType parse(ZSTokenStream tokens) {
27
+	public static IParsedType parse(ZSTokenParser tokens) {
28
 		IParsedType result = tryParse(tokens);
28
 		IParsedType result = tryParse(tokens);
29
 		if (result == null)
29
 		if (result == null)
30
 			throw new ParseException(tokens.getPosition(), "Type expected (got " + tokens.peek().content + ")");
30
 			throw new ParseException(tokens.getPosition(), "Type expected (got " + tokens.peek().content + ")");
32
 		return result;
32
 		return result;
33
 	}
33
 	}
34
 	
34
 	
35
-	public static IParsedType tryParse(ZSTokenStream tokens) {
35
+	public static IParsedType tryParse(ZSTokenParser tokens) {
36
 		int modifiers = 0;
36
 		int modifiers = 0;
37
 		while (true) {
37
 		while (true) {
38
 			if (tokens.optional(ZSTokenType.K_CONST) != null) {
38
 			if (tokens.optional(ZSTokenType.K_CONST) != null) {
168
 		return result;
168
 		return result;
169
 	}
169
 	}
170
 	
170
 	
171
-	public static List<IParsedType> parseGenericParameters(ZSTokenStream tokens) {
171
+	public static List<IParsedType> parseGenericParameters(ZSTokenParser tokens) {
172
 		if (!tokens.isNext(T_LESS))
172
 		if (!tokens.isNext(T_LESS))
173
 			return null;
173
 			return null;
174
 		
174
 		
186
 		} while (tokens.optional(T_COMMA) != null);
186
 		} while (tokens.optional(T_COMMA) != null);
187
 		
187
 		
188
 		if (tokens.isNext(T_SHR)) {
188
 		if (tokens.isNext(T_SHR)) {
189
-			tokens.replace(T_GREATER);
189
+			tokens.replace(T_GREATER.flyweight);
190
 		} else if (tokens.isNext(T_USHR)) {
190
 		} else if (tokens.isNext(T_USHR)) {
191
-			tokens.replace(T_SHR);
191
+			tokens.replace(T_SHR.flyweight);
192
 		} else if (tokens.isNext(T_SHRASSIGN)) {
192
 		} else if (tokens.isNext(T_SHRASSIGN)) {
193
-			tokens.replace(T_GREATEREQ);
193
+			tokens.replace(T_GREATEREQ.flyweight);
194
 		} else if (tokens.isNext(T_USHRASSIGN)) {
194
 		} else if (tokens.isNext(T_USHRASSIGN)) {
195
-			tokens.replace(T_SHRASSIGN);
195
+			tokens.replace(T_SHRASSIGN.flyweight);
196
 		} else if (tokens.optional(T_GREATER) == null) {
196
 		} else if (tokens.optional(T_GREATER) == null) {
197
 			tokens.reset();
197
 			tokens.reset();
198
 			return Collections.emptyList();
198
 			return Collections.emptyList();

Loading…
Cancel
Save