Skip to content

Instantly share code, notes, and snippets.

@conartist6
Last active April 9, 2024 15:53
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/0b252a705c7e715b82b691e4c8b20329 to your computer and use it in GitHub Desktop.
Save conartist6/0b252a705c7e715b82b691e4c8b20329 to your computer and use it in GitHub Desktop.
Successful BABLR template tag embedding
import * as language from '@bablr/language-cstml';
import { buildTag } from 'bablr/enhanceable';
const cstml = buildTag(language, 'Expression');
const tree = cstml`<> ${cstml`<*Word>${cstml`'ok'`}</>`} </>`;
<!cstml 'https://github.com/bablr-lang/language-cstml'>
<>
<Fragment>
open:
<OpenFragmentTag>
open:
<*Punctuator lexicalSpan='Tag' balanced='>'>
'<'
</>
flags: null
close:
<*Punctuator balancer>
'>'
</>
<*#Comment.Space:Space>
' '
</>
</>
root:
<Node>
open:
<OpenNodeTag>
open:
<*Punctuator lexicalSpan='Tag' balanced='>'>
'<'
</>
flags:
<NodeFlags>
token:
<*Punctuator>
'*'
</>
trivia: null
escape: null
</>
type:
<*Identifier>
'Word'
</>
attributes[]: null
close:
<*Punctuator balancer>
'>'
</>
</>
children[]:
<Literal>
value:
<String>
open:
<*Punctuator balanced="'" lexicalSpan='String:Single'>
"'"
</>
content:
<*StringContent>
'ok'
</>
close:
<*Punctuator balancer>
"'"
</>
</>
</>
close:
<CloseNodeTag>
open:
<*Punctuator balanced='>'>
'</'
</>
type: null
close:
<*Punctuator balancer>
'>'
</>
</>
</>
<*#Comment.Space:Space>
' '
</>
close:
<CloseFragmentTag>
open:
<*Punctuator balanced='>'>
'</'
</>
close:
<*Punctuator balancer>
'>'
</>
</>
</>
</>
advance(<!cstml 'https://github.com/bablr-lang/language-cstml'>)
>>> <!cstml 'https://github.com/bablr-lang/language-cstml'>
advance(<>)
>>> <>
--> Expression
match(/[ \t\n]|\/\*|\/\//)
eat(<Match> null [
(<Gap> '<//>')
(<Null> 'null')
(<Reference> /\w/)
(<Literal> /['"]/)
(<DoctypeTag> '<!')
(<Tree> '<')
])
--> Match
match('<//>')
match('null')
match(/\w/)
match(/['"]/)
eat(<Literal> null null)
advance(<Literal>)
>>> <Literal>
--> Literal
eat(<String> 'value')
advance(value)
>>> value:
advance(<String>)
>>> <String>
--> String
match(/['"]/)
eat(<*Punctuator "'" balanced="'" lexicalSpan='String:Single'> 'open')
advance(open)
>>> open:
advance(<*Punctuator balanced='\''>)
bindAttribute(balanced '\'')
bindAttribute(lexicalSpan 'String:Single')
>>> <*Punctuator balanced="'" lexicalSpan='String:Single'>
--> Punctuator
eat('\'')
advance('\'')
>>> "'"
<-- Punctuator
advance(</Punctuator>)
>>> </>
eatMatch(<*StringContent> 'content')
branch()
advance(content)
advance(<*StringContent>)
--> StringContent
match('\\')
eatMatch(/[^\r\n\\']+/)
advance('ok')
match('\\')
eatMatch(/[^\r\n\\']+/)
<-- StringContent
advance(</StringContent>)
accept()
>>> content:
>>> <*StringContent>
>>> 'ok'
>>> </>
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]|\/\*|\/\//)
<-- String
advance(</String>)
>>> </>
<-- Literal
advance(</Literal>)
>>> </>
<-- Match
<-- Expression
advance(</>)
>>> </>
advance(<!cstml 'https://github.com/bablr-lang/language-cstml'>)
>>> <!cstml 'https://github.com/bablr-lang/language-cstml'>
advance(<>)
>>> <>
--> Expression
match(/[ \t\n]|\/\*|\/\//)
eat(<Match> null [
(<Gap> '<//>')
(<Null> 'null')
(<Reference> /\w/)
(<Literal> /['"]/)
(<DoctypeTag> '<!')
(<Tree> '<')
])
--> Match
match('<//>')
match('null')
match(/\w/)
match(/['"]/)
match('<!')
match('<')
eat(<Tree> null null)
--> Tree
eat(<Match> null [
(<Fragment> /<[#@*]*>/)
(<Node> '<')
])
--> Match
match(/<[#@*]*>/)
match('<')
eat(<Node> null null)
advance(<Node>)
>>> <Node>
--> Node
eat(<OpenNodeTag> 'open')
advance(open)
>>> open:
advance(<OpenNodeTag>)
>>> <OpenNodeTag>
--> OpenNodeTag
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(<NodeFlags> 'flags')
branch()
advance(flags)
advance(<NodeFlags>)
--> NodeFlags
eatMatch(<*Punctuator '*'> 'token')
branch()
advance(token)
advance(<*Punctuator>)
--> Punctuator
eat('*')
advance('*')
<-- Punctuator
advance(</Punctuator>)
accept()
match(/[ \t\n]|\/\*|\/\//)
eatMatch(<*Punctuator '#'> 'trivia')
branch()
advance(trivia)
advance(<*Punctuator>)
--> Punctuator
eat('#')
reject()
x-- Punctuator
match(/[ \t\n]|\/\*|\/\//)
eatMatch(<*Punctuator '@'> 'escape')
branch()
advance(escape)
advance(<*Punctuator>)
--> Punctuator
eat('@')
reject()
x-- Punctuator
match(/[ \t\n]|\/\*|\/\//)
<-- NodeFlags
advance(</NodeFlags>)
accept()
>>> flags:
>>> <NodeFlags>
>>> token:
>>> <*Punctuator>
>>> '*'
>>> </>
>>> trivia:
>>> null
>>> escape:
>>> null
>>> </>
eat(<TagType>)
--> TagType
match(/[\w.]+:/)
eat(<*Identifier> 'type')
advance(type)
>>> type:
advance(<*Identifier>)
>>> <*Identifier>
--> Identifier
eat(/\w+/)
advance('Word')
>>> 'Word'
<-- Identifier
advance(</Identifier>)
>>> </>
match(/[ \t\n]|\/\*|\/\//)
<-- TagType
eatMatch(<Attribute> 'attributes[]')
branch()
advance(attributes[])
--> Attribute
match(/\w+\s*=/)
eat(<BooleanAttribute>)
advance(<BooleanAttribute>)
--> BooleanAttribute
eat(<*Identifier> 'key')
advance(key)
advance(<*Identifier>)
--> Identifier
eat(/\w+/)
reject()
>>> attributes[]:
>>> null
x-- Identifier
x-- BooleanAttribute
x-- Attribute
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]|\/\*|\/\//)
<-- OpenNodeTag
advance(</OpenNodeTag>)
>>> </>
match('</')
eat(<NodeChild> 'children[]')
advance(children[])
>>> children[]:
advance(<//>)
>>> <//>
match('</')
match(/[ \t\n]|\/\*|\/\//)
eat(<CloseNodeTag> 'close')
advance(close)
>>> close:
advance(<CloseNodeTag>)
>>> <CloseNodeTag>
--> CloseNodeTag
eat(<*Punctuator '</' balanced='>'> 'open')
advance(open)
>>> open:
advance(<*Punctuator balanced='>'>)
bindAttribute(balanced '>')
>>> <*Punctuator balanced='>'>
--> Punctuator
eat('</')
advance('</')
>>> '</'
<-- Punctuator
advance(</Punctuator>)
>>> </>
match(/[ \t\n]|\/\*|\/\//)
eatMatch(<TagType>)
branch()
--> TagType
match(/[\w.]+:/)
eat(<*Identifier> 'type')
advance(type)
advance(<*Identifier>)
--> Identifier
eat(/\w+/)
reject()
>>> type:
>>> null
x-- Identifier
x-- TagType
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]|\/\*|\/\//)
<-- CloseNodeTag
advance(</CloseNodeTag>)
>>> </>
<-- Node
advance(</Node>)
>>> </>
<-- Match
<-- Tree
<-- Match
<-- Expression
advance(</>)
>>> </>
advance(<!cstml 'https://github.com/bablr-lang/language-cstml'>)
>>> <!cstml 'https://github.com/bablr-lang/language-cstml'>
advance(<>)
>>> <>
--> Expression
match(/[ \t\n]|\/\*|\/\//)
eat(<Match> null [
(<Gap> '<//>')
(<Null> 'null')
(<Reference> /\w/)
(<Literal> /['"]/)
(<DoctypeTag> '<!')
(<Tree> '<')
])
--> Match
match('<//>')
match('null')
match(/\w/)
match(/['"]/)
match('<!')
match('<')
eat(<Tree> null null)
--> Tree
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(<*#Comment.Space:Space>)
--> Space
eat(/[ \t\r\n]+/)
advance(' ')
<-- Space
advance(</Comment.Space:Space>)
accept()
eatMatch(<#*Space:Space>)
branch()
advance(<*#Comment.Space:Space>)
--> Space
eat(/[ \t\r\n]+/)
reject()
x-- Space
<-- Trivia
accept()
>>> <*#Comment.Space:Space>
>>> ' '
>>> </>
<-- OpenFragmentTag
advance(</OpenFragmentTag>)
>>> </>
match(/[ \t\n]|\/\*|\/\//)
match(/\g|<[^!/]/)
eat(<Node> 'root')
advance(root)
>>> root:
advance(<//>)
>>> <//>
match(/[ \t\n]|\/\*|\/\//)
eatMatch(<Comment:Trivia>)
branch()
--> Trivia
eatMatch(<#*Space:Space>)
branch()
advance(<*#Comment.Space:Space>)
--> Space
eat(/[ \t\r\n]+/)
advance(' ')
<-- Space
advance(</Comment.Space:Space>)
accept()
eatMatch(<#*Space:Space>)
branch()
advance(<*#Comment.Space:Space>)
--> Space
eat(/[ \t\r\n]+/)
reject()
x-- Space
<-- Trivia
accept()
>>> <*#Comment.Space:Space>
>>> ' '
>>> </>
eat(<CloseFragmentTag> 'close')
advance(close)
>>> close:
advance(<CloseFragmentTag>)
>>> <CloseFragmentTag>
--> CloseFragmentTag
match(/[ \t\n]|\/\*|\/\//)
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
<-- Match
<-- Expression
advance(</>)
>>> </>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment