Skip to content

Instantly share code, notes, and snippets.

@conartist6
Last active March 22, 2024 14:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save conartist6/bf4e2fc585644682340520373790841c to your computer and use it in GitHub Desktop.
Save conartist6/bf4e2fc585644682340520373790841c to your computer and use it in GitHub Desktop.
Input: `<> </>`
advance(<>)
>>> <>
--> Tree
match(/[ \t\n]|\/\*|\/\//)
eat(<Match> null [
(<Fragment> /<[#@*]*>/)
(<Node> '<')
])
--> Match
match(/<[#@*]*>/)
eat(<Fragment> null null)
advance(<Fragment>)
>>> <Fragment>
--> Fragment
eat(<OpenFragmentTag> 'open')
advance(open)
>>> open:
advance(<OpenFragmentTag>)
>>> <OpenFragmentTag>
--> OpenFragmentTag
eat(<*Punctuator '<' lexicalSpan='Tag' balanced='>'> 'open')
advance(open)
>>> open:
advance(<*Punctuator lexicalSpan='Tag'>)
bindAttribute(lexicalSpan 'Tag')
bindAttribute(balanced '>')
>>> <*Punctuator lexicalSpan='Tag' balanced='>'>
--> Punctuator
eat('<')
advance('<')
>>> '<'
<-- Punctuator
advance(</Punctuator>)
>>> </>
match(/[ \t\n]|\/\*|\/\//)
eatMatch(<FragmentFlags> 'flags')
branch()
advance(flags)
advance(<FragmentFlags>)
--> FragmentFlags
eatMatch(<*Punctuator '#'> 'comment')
branch()
advance(comment)
advance(<*Punctuator>)
--> Punctuator
eat('#')
reject()
x-- Punctuator
match(/[ \t\n]|\/\*|\/\//)
x-- FragmentFlags
reject()
>>> flags:
>>> null
match(/[ \t\n]|\/\*|\/\//)
eat(<*Punctuator '>' balancer> 'close')
advance(close)
>>> close:
advance(<*Punctuator balancer=true>)
bindAttribute(balancer true)
>>> <*Punctuator balancer>
--> Punctuator
eat('>')
advance('>')
>>> '>'
<-- Punctuator
advance(</Punctuator>)
>>> </>
match(/[ \t\n]|\/\*|\/\//)
eatMatch(<Comment:Trivia>)
branch()
--> Trivia
eatMatch(<#*Space:Space>)
branch()
advance(<*#Space>)
--> Space
eat(/[ \t\r\n]/)
advance(' ')
<-- Space
advance(</Space>)
accept()
eatMatch(<#*Space:Space>)
branch()
advance(<*#Space>)
--> Space
eat(/[ \t\r\n]/)
reject()
x-- Space
<-- Trivia
accept()
>>> <*#Space>
>>> ' '
>>> </>
<-- OpenFragmentTag
advance(</OpenFragmentTag>)
>>> </>
match(/[ \t\n]|\/\*|\/\//)
eatMatch(<FragmentChild> 'children[]')
branch()
advance(children[])
--> FragmentChild
eat(<Match> null [
(<Node> /<[#@]/)
(<Property> /\w/)
])
--> Match
match(/<[#@]/)
match(/\w/)
x-- Match
x-- FragmentChild
reject()
>>> children[]:
>>> null
match(/[ \t\n]|\/\*|\/\//)
eat(<CloseFragmentTag> 'close')
advance(close)
>>> close:
advance(<CloseFragmentTag>)
>>> <CloseFragmentTag>
--> CloseFragmentTag
eat(<*Punctuator '</' balanced='>'> 'open')
advance(open)
>>> open:
advance(<*Punctuator balanced='>'>)
bindAttribute(balanced '>')
>>> <*Punctuator balanced='>'>
--> Punctuator
eat('</')
advance('</')
>>> '</'
<-- Punctuator
advance(</Punctuator>)
>>> </>
match(/[ \t\n]|\/\*|\/\//)
eat(<*Punctuator '>' balancer> 'close')
advance(close)
>>> close:
advance(<*Punctuator balancer=true>)
bindAttribute(balancer true)
>>> <*Punctuator balancer>
--> Punctuator
eat('>')
advance('>')
>>> '>'
<-- Punctuator
advance(</Punctuator>)
>>> </>
match(/[ \t\n]|\/\*|\/\//)
<-- CloseFragmentTag
advance(</CloseFragmentTag>)
>>> </>
<-- Fragment
advance(</Fragment>)
>>> </>
<-- Match
<-- Tree
advance(</>)
>>> </>
<>
<Fragment>
open:
<OpenFragmentTag>
open:
<*Punctuator lexicalSpan='Tag' balanced='>'>
'<'
</>
flags:
null
close:
<*Punctuator balancer>
'>'
</>
<*#Space>
' '
</>
</>
children[]:
null
close:
<CloseFragmentTag>
open:
<*Punctuator balanced='>'>
'</'
</>
close:
<*Punctuator balancer>
'>'
</>
</>
</>
</>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment