+25
-27
Compiler.ps1
+25
-27
Compiler.ps1
···
20
20
ILLEGAL # idk
21
21
}
22
22
23
-
enum ElementState {
24
-
UNOPENED = 0 # before <
25
-
OPENED = 1 # <
26
-
AFTER_TAG = 2 # <div
27
-
AFTER_ATTRIBUTE_NAME = 3 # <div attr
28
-
AFTER_ATTRIBUTE_EQUALS = 4 # <div attr=
29
-
AFTER_ATTRIBUTE_VALUE = 5 # <div attr=val, <div
30
-
CLOSED = 6 # <div ...>
31
-
CLOSED_VOID = 7 # <div .../>
23
+
[Flags()] enum ElementState {
24
+
UNOPENED = 1 # before <
25
+
OPENED = 2 # <
32
26
33
-
END_OPENED = 8 # <div ...></
34
-
END_AFTER_TAG = 9 # <div ...></div
35
-
END_CLOSED = 10 # <div ...></div>, <div .../>
27
+
AFTER_TAG = 4 # <div
28
+
AFTER_ATTRIBUTE_NAME = 8 # <div attr
29
+
AFTER_ATTRIBUTE_EQUALS = 16 # <div attr=
30
+
AFTER_ATTRIBUTE_VALUE = 32 # <div attr=val, <div
31
+
32
+
CLOSED = 64 # <div ...>
33
+
CLOSED_VOID = 128 # <div .../>
34
+
35
+
END_OPENED = 256 # <div ...></
36
+
END_AFTER_TAG = 512 # <div ...></div
37
+
END_CLOSED = 1024 # <div ...></div>, <div .../>
38
+
39
+
ILLEGAL = 2048
40
+
VALID_ATTRIBUTE_NAME_START = (4 + 8 + 32 + 2048)
36
41
}
37
42
38
43
class Token {
···
157
162
return [Token]::new( [TokenType]::EOF, '' )
158
163
}
159
164
165
+
if ($this.State.HasFlag([ElementState]::ILLEGAL)) {
166
+
throw "Lexer found in illegal state $($this.State)"
167
+
}
168
+
160
169
switch -Regex ($this.Char) {
161
170
'<' {
162
171
switch ($this.State) {
···
178
187
179
188
'/' {
180
189
switch ($this.State) {
181
-
{$_ -in
182
-
[ElementState]::AFTER_TAG,
183
-
[ElementState]::AFTER_ATTRIBUTE_NAME,
184
-
[ElementState]::AFTER_ATTRIBUTE_VALUE
185
-
} {
190
+
{[ElementState]::VALID_ATTRIBUTE_NAME_START.HasFlag($_)} {
186
191
if ($this.PeekChar() -eq '>') {
187
192
$Token = [Token]::new( [TokenType]::VOID_ELEMENT_CLOSE, $this.Char + $this.PopChar() )
188
193
$this.State = [ElementState]::CLOSED_VOID
···
197
202
'>' {
198
203
# check for nested psx here!!!
199
204
switch ($this.State) {
200
-
{$_ -in
201
-
[ElementState]::AFTER_TAG,
202
-
[ElementState]::AFTER_ATTRIBUTE_NAME,
203
-
[ElementState]::AFTER_ATTRIBUTE_VALUE
204
-
} {
205
+
{[ElementState]::VALID_ATTRIBUTE_NAME_START.HasFlag($_)} {
205
206
$Token = [Token]::new( [TokenType]::CLOSE_ELEMENT, $this.Char )
206
207
$this.State = [ElementState]::CLOSED
207
208
}
···
259
260
260
261
$this.State = [ElementState]::AFTER_TAG
261
262
}
262
-
{$_ -in
263
-
[ElementState]::AFTER_TAG,
264
-
[ElementState]::AFTER_ATTRIBUTE_NAME,
265
-
[ElementState]::AFTER_ATTRIBUTE_VALUE
266
-
} {
263
+
{[ElementState]::VALID_ATTRIBUTE_NAME_START.HasFlag($_)} {
267
264
$TokType = [TokenType]::ATTR_NAME
268
265
269
266
$this.State = [ElementState]::AFTER_ATTRIBUTE_NAME
···
309
306
310
307
default {
311
308
$Token = [Token]::new([TokenType]::ILLEGAL, $this.LexInput.Substring($this.Pos))
309
+
$this.State = [ElementState]::ILLEGAL
312
310
}
313
311
}
314
312