Transpiler for HTML-in-PowerShell, PSX (like JSX)

state: convert ElementState to flags, easily check legal attr placement

Changed files
+25 -27
+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