Repository: alecthomas/chroma
Pull request #477 (2021-04-27 17:03:36)

File name matches and mime matches should be moved to phtml from php lexer
I had an issue with gitea where syntax highlighting of PHP code mixed with HTML was not working, in reviewing we identified that the tag changes were made and the PHTML lexer was created in order to allow syntax highlighting of PHP code without the starting tag in markdown snippets (https://github.com/alecthomas/chroma/issues/210). These changes, however, cause issues when the PHP lexer is identified to parse files with the extension of `.php`.

For an example, with the file name/mime matches being on the PHP lexer, if we were to identify this file with either the mime type or file name, the PHP lexer will be used and the file will be highlighted incorrectly.

https://github.com/WordPress/WordPress/blob/master/wp-content/themes/twentytwentyone/template-parts/content/content-page.php

I recommend that we move the file name matches and mime type from the PHP lexer to the PHTML lexer so that when we are identifying based on mime type or file name, the proper lexer is used.

My understanding is that the markdown identification of syntax highlighting is not based on file name or mime type, so a change like this should not affect the main reason the change was made. I have tested with `cmd/chroma/chroma -s monokailight --html --html-lines --html-lines-table --html-inline-styles content-page.php` and changes seem to work.

alecthomas: That seems reasonable to me.
alecthomas: Though I think it would be preferable to keep the mime types and extensions on both but give PTHML a higher priority (see the Priority field).

Patch:
diff --git a/README.md b/README.md
index e47c88c..3aeb887 100644
--- a/README.md
+++ b/README.md
@@ -52,8 +52,8 @@ N | NASM, Newspeak, Nginx configuration file, Nim, Nix
 O | Objective-C, OCaml, Octave, OpenSCAD, Org Mode
 P | PacmanConf, Perl, PHP, PHTML, Pig, PkgConfig, PL/pgSQL, plaintext, Pony, PostgreSQL SQL dialect, PostScript, POVRay, PowerShell, Prolog, PromQL, Protocol Buffer, Puppet, Python, Python 3
 Q | QBasic
-R | R, Racket, Ragel, react, ReasonML, reg, reStructuredText, Rexx, Ruby, Rust
-S | SAS, Sass, Scala, Scheme, Scilab, SCSS, Smalltalk, Smarty, Snobol, Solidity, SPARQL, SQL, SquidConf, Standard ML, Stylus, Swift, SYSTEMD, systemverilog
+R | R, Racket, Ragel, Raku, react, ReasonML, reg, reStructuredText, Rexx, Ruby, Rust
+S | SAS, Sass, Scala, Scheme, Scilab, SCSS, Smalltalk, Smarty, Snobol, Solidity, SPARQL, SQL, SquidConf, Standard ML, Stylus, Svelte, Swift, SYSTEMD, systemverilog
 T | TableGen, TASM, Tcl, Tcsh, Termcap, Terminfo, Terraform, TeX, Thrift, TOML, TradingView, Transact-SQL, Turing, Turtle, Twig, TypeScript, TypoScript, TypoScriptCssData, TypoScriptHtmlData
 V | VB.net, verilog, VHDL, VimL, vue
 W | WDTE
@@ -260,7 +260,7 @@ go get -u github.com/alecthomas/chroma/cmd/chroma
 
 - Quite a few lexers, for various reasons (pull-requests welcome):
     - Pygments lexers for complex languages often include custom code to
-      handle certain aspects, such as Perl6's ability to nest code inside
+      handle certain aspects, such as Raku's ability to nest code inside
       regular expressions. These require time and effort to convert.
     - I mostly only converted languages I had heard of, to reduce the porting cost.
 - Some more esoteric features of Pygments are omitted for simplicity.
diff --git a/lexers/circular/phtml.go b/lexers/circular/phtml.go
index f0824b5..fc2e2ea 100644
--- a/lexers/circular/phtml.go
+++ b/lexers/circular/phtml.go
@@ -13,11 +13,12 @@ var PHTML = internal.Register(DelegatingLexer(h.HTML, MustNewLazyLexer(
 	&Config{
 		Name:            "PHTML",
 		Aliases:         []string{"phtml"},
-		Filenames:       []string{"*.phtml"},
-		MimeTypes:       []string{"application/x-php", "application/x-httpd-php", "application/x-httpd-php3", "application/x-httpd-php4", "application/x-httpd-php5"},
+		Filenames:       []string{"*.phtml", "*.php", "*.php[345]", "*.inc"},
+		MimeTypes:       []string{"application/x-php", "application/x-httpd-php", "application/x-httpd-php3", "application/x-httpd-php4", "application/x-httpd-php5", "text/x-php"},
 		DotAll:          true,
 		CaseInsensitive: true,
 		EnsureNL:        true,
+		Priority:        2,
 	},
 	phtmlRules,
 ).SetAnalyser(func(text string) float32 {
diff --git a/lexers/m/markdown.go b/lexers/m/markdown.go
index 9ee157b..e50e470 100644
--- a/lexers/m/markdown.go
+++ b/lexers/m/markdown.go
@@ -40,7 +40,7 @@ func markdownRules() Rules {
 		},
 		"inline": {
 			{`\\.`, Text, nil},
-			{`(\s)([*_][^*_]+[*_])(\W|\n)`, ByGroups(Text, GenericEmph, Text), nil},
+			{`(\s)(\*|_)((?:(?!\2).)*)(\2)((?=\W|\n))`, ByGroups(Text, GenericEmph, GenericEmph, GenericEmph, Text), nil},
 			{`(\s)((\*\*|__).*?)\3((?=\W|\n))`, ByGroups(Text, GenericStrong, GenericStrong, Text), nil},
 			{`(\s)(~~[^~]+~~)((?=\W|\n))`, ByGroups(Text, GenericDeleted, Text), nil},
 			{"`[^`]+`", LiteralStringBacktick, nil},
diff --git a/lexers/r/raku.go b/lexers/r/raku.go
new file mode 100644
index 0000000..71353b8
--- /dev/null
+++ b/lexers/r/raku.go
@@ -0,0 +1,1513 @@
+package r
+
+import (
+	"regexp"
+	"sort"
+	"strings"
+	"unicode/utf8"
+
+	. "github.com/alecthomas/chroma" // nolint
+	"github.com/alecthomas/chroma/lexers/internal"
+	"github.com/dlclark/regexp2"
+)
+
+// Raku lexer.
+var Raku Lexer = internal.Register(MustNewLexer(
+	&Config{
+		Name:    "Raku",
+		Aliases: []string{"perl6", "pl6", "raku"},
+		Filenames: []string{
+			"*.pl", "*.pm", "*.nqp", "*.p6", "*.6pl", "*.p6l", "*.pl6", "*.6pm",
+			"*.p6m", "*.pm6", "*.t", "*.raku", "*.rakumod", "*.rakutest", "*.rakudoc",
+		},
+		MimeTypes: []string{
+			"text/x-perl6", "application/x-perl6",
+			"text/x-raku", "application/x-raku",
+		},
+		DotAll: true,
+	},
+	RakuRules,
+))
+
+// Raku rules
+// Empty capture groups are placeholders and will be replaced by bracketsFinder.
+// DO NOT REMOVE THEM!
+var RakuRules = Rules{
+	"root": {
+		Include("common"),
+		{`\{|\}|\(|\)|\[|\]`, Punctuation, nil},
+		{`.+?`, Text, nil},
+	},
+	"common": {
+		{`^#![^\n]*$`, CommentHashbang, nil},
+		Include("pod"),
+		// Multi-line, Embedded comment
+		{
+			"#`((" + bracketsPattern + `)(\2)*)`,
+			CommentMultiline,
+			bracketsFinder(rakuMultilineComment),
+		},
+		{`#[^\n]*$`, CommentSingle, nil},
+		// /regex/
+		{
+			`(?<=(?:^|\(|=|:|~~|\[|,|=>)\s*)(/)(?!\]|\))((?:\\\\|\\/|.)*?)((?<!(?<!\\)\\)/(?!'|"))`,
+			ByGroups(Punctuation, UsingSelf("regex"), Punctuation),
+			bracketsFinder(rakuSlashRegex),
+		},
+		Include("variable"),
+		// ::?VARIABLE
+		{`::\?\w+(?::[_UD])?`, NameVariableGlobal, nil},
+		// Version
+		{
+			`\b(v)(\d+)((?:\.(?:\*|[\d\w]+))*)(\+)?`,
+			ByGroups(Keyword, NumberInteger, NameEntity, Operator),
+			nil,
+		},
+		Include("number"),
+		// Hyperoperator | »*«
+		{`(>>)(\S+?)(<<)`, ByGroups(Operator, UsingSelf("root"), Operator), nil},
+		{`(»)(\S+?)(«)`, ByGroups(Operator, UsingSelf("root"), Operator), nil},
+		// <<quoted words>>
+		{`(?<!(?:\d+|\.(?:Int|Numeric)|[$@%][\w':-]+\s+|[\])}])\s*)(<<)(?!(?:(?!>>)[^\n])+?[},;] *\n)(?!(?:(?!>>).)+?>>\S+?>>)`, Punctuation, Push("<<")},
+		// «quoted words»
+		{`(?<!(?:\d+|\.(?:Int|Numeric)|[$@%][\w':-]+\s+|[\])}])\s*)(«)(?![^»]+?[},;] *\n)(?![^»]+?»\S+?»)`, Punctuation, Push("«")},
+		// [<]
+		{`(?<=\[\\?)<(?=\])`, Operator, nil},
+		// < and > operators | something < onething > something
+		{
+			`(?<=[$@%&]?\w[\w':-]* +)(<=?)( *[^ ]+? *)(>=?)(?= *[$@%&]?\w[\w':-]*)`,
+			ByGroups(Operator, UsingSelf("root"), Operator),
+			nil,
+		},
+		// <quoted words>
+		{
+			`(?<!(?:\d+|\.(?:Int|Numeric)|[$@%][\w':-]+\s+|[\])}])\s*)(<)((?:(?![,;)}] *(?:#[^\n]+)?\n)[^<>])+?)(>)(?!\s*(?:\d+|\.(?:Int|Numeric)|[$@%]\w[\w':-]*[^(]|\[))`,
+			ByGroups(Punctuation, String, Punctuation),
+			nil,
+		},
+		{`C?X::['\w:-]+`, NameException, nil},
+		Include("metaoperator"),
+		// Pair | (key) => value
+		{
+			`(\([^)]+\))(\s*)(=>)(\s*)([^,\n]+)(,?\n*)`,
+			ByGroups(UsingSelf("root"), Text, Operator, Text, UsingSelf("root"), Text),
+			nil,
+		},
+		// Pair | key => value
+		{
+			`(\w[\w'-]*)(\s*)(=>)(\s*)([^,\n]+)(,?\n*)`,
+			ByGroups(String, Text, Operator, Text, UsingSelf("root"), Text),
+			nil,
+		},
+		Include("colon-pair"),
+		// Token
+		{
+			// Token with adverbs
+			`(?<=(?:^|\s)(?:regex|token|rule)(\s+))(['\w:-]+)(?=:['\w-]+` +
+				colonPairOpeningBrackets + `.+?` + colonPairClosingBrackets + `[({])`,
+			NameFunction,
+			Push("token", "name-adverb"),
+		},
+		{
+			// Token without adverbs
+			`(?<=(?:^|\s)(?:regex|token|rule)(?:\s+))(['\w:-]+)`,
+			NameFunction,
+			Push("token"),
+		},
+		// Substitution
+		{`(?<=^|\b|\s)(?<!\.)(ss|S|s|TR|tr)\b(\s*)`, ByGroups(Keyword, Text), Push("substitution")},
+		{keywordsPattern, Keyword, nil},
+		{builtinTypesPattern, NameBuiltin, nil},
+		{builtinRoutinesPattern, NameBuiltin, nil},
+		// Class name
+		{
+			`(?<=(?:^|\s)(?:class|grammar|role|does|but|is|subset|of)\s+)` + namePattern,
+			NameClass,
+			Push("name-adverb"),
+		},
+		//  Routine
+		{
+			// Routine with adverbs
+			`(?<=(?:^|\s)(?:sub|method|multi sub|multi)\s+)!?['\w:-]+(?=:['\w-]+` +
+				colonPairOpeningBrackets + `.+?` + colonPairClosingBrackets + `[({])`,
+			NameFunction,
+			Push("name-adverb"),
+		},
+		{
+			// Routine without adverbs
+			`(?<=(?:^|\s)(?:sub|submethod|method|multi)\s+)!?['\w:-]+`,
+			NameFunction,
+			nil,
+		},
+		// Constant
+		{`(?<=\bconstant\s+)` + namePattern, NameConstant, Push("name-adverb")},
+		// Namespace
+		{`(?<=\b(?:use|module|package)\s+)` + namePattern, NameNamespace, Push("name-adverb")},
+		Include("operator"),
+		Include("single-quote"),
+		{`(?<!(?<!\\)\\)"`, Punctuation, Push("double-quotes")},
+		// m,rx regex
+		{`(?<=^|\b|\s)(ms|m|rx)\b(\s*)`, ByGroups(Keyword, Text), Push("rx")},
+		// Quote constructs
+		{
+			`(?<=^|\b|\s)(qq|q|Q)((?:qq|ww|q|w|s|a|h|f|c|b|to|v|x)*)(\s*)(:[\w\s:]+)?(\s*)(([^0-9a-zA-Z:\s])(\7)*)()()`,
+			EmitterFunc(quote),
+			bracketsFinder(rakuQuote),
+		},
+		// Function
+		{
+			`\b(?:\w['\w:-]*)(?=:['\w-]+` +
+				colonPairOpeningBrackets + `.+?` + colonPairClosingBrackets + `\()`,
+			NameFunction,
+			Push("name-adverb"),
+		},
+		{`\b(?:\w['\w:-]*)(?=\()`, NameFunction, nil},
+		// Method
+		// Method with adverb
+		{
+			`(?<!\.\.[?^*+]?)(?<=(?:\.[?^*+]?)|self!)['\w:-]+(?=:['\w-]+` +
+				colonPairOpeningBrackets + `.+?` + colonPairClosingBrackets + `$)`,
+			NameFunction,
+			Push("name-adverb"),
+		},
+		// Method without adverb
+		{`(?<!\.\.[?^*+]?)(?<=(?:\.[?^*+]?)|self!)['\w:-]+`, NameFunction, nil},
+		// Indirect invocant
+		{namePattern + `(?=\s+\W?['\w:-]+:\W)`, NameFunction, Push("name-adverb")},
+		{`(?<=\W)(?:∅|i|e|𝑒|tau|τ|pi|π|Inf|∞)(?=\W)`, NameConstant, nil},
+		{`(｢)([^｣]*)(｣)`, ByGroups(Punctuation, String, Punctuation), nil},
+		{`(?<=^ *)\b` + namePattern + `(?=:\s*(?:for|while|loop))`, NameLabel, nil},
+		// Sigilless variable
+		{
+			`(?<=\b(?:my|our|constant|let|temp)\s+)\\` + namePattern,
+			NameVariable,
+			Push("name-adverb"),
+		},
+		{namePattern, Name, Push("name-adverb")},
+	},
+	"rx": {
+		Include("colon-pair-attribute"),
+		{
+			`(\s*)(([^\w:\s])(\3)*)`,
+			ByGroups(Text, Punctuation, Punctuation, Punctuation),
+			Mutators(Pop(1), bracketsFinder(rakuMatchRegex)),
+		},
+	},
+	"substitution": {
+		Include("colon-pair-attribute"),
+		// Substitution | s{regex} = value
+		{
+			`(\s*)((` + bracketsPattern + `)(\3)*)`,
+			ByGroups(Text, Punctuation, Punctuation, Punctuation),
+			Mutators(Pop(1), bracketsFinder(rakuSubstitutionSingleRegex)),
+		},
+		// s/regex/string/
+		{
+			`(\s*)([^\w:\s])((?:\\\\|\\/|.)*?)(\2)((?:\\\\|\\/|.)*?)(\2)`,
+			ByGroups(
+				Text, Punctuation, UsingSelf("regex"), Punctuation, UsingSelf("qq"), Punctuation,
+			),
+			Mutators(Pop(1), bracketsFinder(rakuSubstitutionRegex)),
+		},
+	},
+	"number": {
+		{`0_?[0-7]+(_[0-7]+)*`, LiteralNumberOct, nil},
+		{`0x[0-9A-Fa-f]+(_[0-9A-Fa-f]+)*`, LiteralNumberHex, nil},
+		{`0b[01]+(_[01]+)*`, LiteralNumberBin, nil},
+		{
+			`(?i)(\d*(_\d*)*\.\d+(_\d*)*|\d+(_\d*)*\.\d+(_\d*)*)(e[+-]?\d+)?`,
+			LiteralNumberFloat,
+			nil,
+		},
+		{`(?i)\d+(_\d*)*e[+-]?\d+(_\d*)*`, LiteralNumberFloat, nil},
+		{`(?<=\d+)i`, NameConstant, nil},
+		{`\d+(_\d+)*`, LiteralNumberInteger, nil},
+	},
+	"name-adverb": {
+		Include("colon-pair-attribute-keyvalue"),
+		Default(Pop(1)),
+	},
+	"colon-pair": {
+		// :key(value)
+		{colonPairPattern, colonPair(String), bracketsFinder(rakuNameAttribute)},
+		// :key
+		{`(:!?)(\w[\w'-]*)`, ByGroups(Punctuation, String), nil},
+		// :123abc
+		{
+			`(:)(\d+)(\w[\w'-]*)(\s*[,;)]?\s*$)`,
+			ByGroups(Punctuation, UsingSelf("number"), String, Text),
+			nil,
+		},
+		{`\s+`, Text, nil},
+	},
+	"colon-pair-attribute": {
+		// :key(value)
+		{colonPairPattern, colonPair(NameAttribute), bracketsFinder(rakuNameAttribute)},
+		// :key
+		{`(:!?)(\w[\w'-]*)`, ByGroups(Punctuation, NameAttribute), nil},
+		// :123abc
+		{
+			`(:)(\d+)(\w+)(\s*[,;)]?\s*$)`,
+			ByGroups(Punctuation, UsingSelf("number"), NameAttribute, Text),
+			nil,
+		},
+		{`\s+`, Text, nil},
+	},
+	"colon-pair-attribute-keyvalue": {
+		// :key(value)
+		{colonPairPattern, colonPair(NameAttribute), bracketsFinder(rakuNameAttribute)},
+	},
+	"escape-qq": {
+		{
+			`(?<!(?<!\\)\\)(\\qq)(\[)(.+?)(\])`,
+			ByGroups(StringEscape, Punctuation, UsingSelf("qq"), Punctuation),
+			nil,
+		},
+	},
+	"escape-c-name": {
+		{
+			`(?<!(?<!\\)\\)(\\[c|C])(\[)(.+?)(\])`,
+			ByGroups(StringEscape, Punctuation, String, Punctuation),
+			nil,
+		},
+	},
+	"escape-hexadecimal": {
+		{
+			`(?<!(?<!\\)\\)(\\[x|X])(\[)([0-9a-fA-F]+)(\])`,
+			ByGroups(StringEscape, Punctuation, NumberHex, Punctuation),
+			nil,
+		},
+		{`(\\[x|X])([0-9a-fA-F]+)`, ByGroups(StringEscape, NumberHex), nil},
+	},
+	"regex": {
+		// Placeholder, will be overwritten by bracketsFinder, DO NOT REMOVE!
+		{`^$`, nil, nil},
+		Include("regex-escape-class"),
+		// Exclude $/ from variables, because we can't get out of the end of the slash regex: $/;
+		{`\$(?=/)`, NameEntity, nil},
+		// Exclude $ from variables
+		{`\$(?=\z|\s|[^<(\w*!.])`, NameEntity, nil},
+		Include("variable"),
+		Include("escape-c-name"),
+		Include("escape-hexadecimal"),
+		Include("number"),
+		Include("single-quote"),
+		// :my variable code ...
+		{
+			`(?<!(?<!\\)\\)(:)(my|our|state|constant|temp|let)(.+?;)`,
+			ByGroups(Operator, KeywordDeclaration, UsingSelf("root")),
+			nil,
+		},
+		// <{code}>
+		{
+			`(?<!(?<!\\)\\)(<)([?!])?((?<!(?<!\\)\\){)(.*?)(}>)`,
+			ByGroups(Punctuation, Operator, Punctuation, UsingSelf("root"), Punctuation),
+			nil,
+		},
+		// {code}
+		{`(?<!(?<!\\)\\)({)(.*?)(})`, ByGroups(Punctuation, UsingSelf("root"), Punctuation), nil},
+		// $(code)
+		{
+			`(?<!(?<!\\)\\)([$@])(\()(.*?)(\))`,
+			ByGroups(Keyword, Punctuation, UsingSelf("root"), Punctuation),
+			nil,
+		},
+		// Properties
+		{`(:)(\w+)`, ByGroups(Punctuation, NameAttribute), nil},
+		// Operator
+		{`\|\||\||&&|&|\.\.|\*\*|%%|%|:|!|<<|«|>>|»|\+|\*\*|\*|\?|=|~|<~~>`, Operator, nil},
+		// Anchors
+		{`\^\^|\^|\$\$|\$`, NameEntity, nil},
+		{`\.`, NameEntity, nil},
+		{`#[^\n]*\n`, CommentSingle, nil},
+		// Lookaround
+		{
+			`(?<!(?<!\\)\\)(<)(\s*)([?!.])(\s*)(after|before)`,
+			ByGroups(Punctuation, Text, Operator, Text, OperatorWord),
+			Push("regex"),
+		},
+		{
+			`(?<!(?<!\\)\\)(<)([|!?.]*)(wb|ww|ws|w)(>)`,
+			ByGroups(Punctuation, Operator, OperatorWord, Punctuation),
+			nil,
+		},
+		// <$variable>
+		{
+			`(?<!(?<!\\)\\)(<)([$@]\w[\w-:]*)(>)`,
+			ByGroups(Punctuation, NameVariable, Punctuation),
+			nil,
+		},
+		// Capture markers
+		{`(?<!(?<!\\)\\)<\(|\)>`, Punctuation, nil},
+		{`(?<!(?<!\\)\\)<`, Punctuation, Push("regex-property")},
+		{`(?<!(?<!\\)\\)"`, Punctuation, Push("double-quotes")},
+		{`(?<!(?<!\\)\\)(?:\]|\)|>)`, Punctuation, Pop(1)},
+		{`(?<!(?<!\\)\\)(?:\[|\()`, Punctuation, Push("regex")},
+		{`.+?`, StringRegex, nil},
+	},
+	"regex-class-builtin": {
+		{
+			`\b(?:alnum|alpha|blank|cntrl|digit|graph|lower|print|punct|space|upper|xdigit|same|ident)\b`,
+			NameBuiltin,
+			nil,
+		},
+	},
+	"regex-property": {
+		{`(?<!(?<!\\)\\)>`, Punctuation, Pop(1)},
+		Include("regex-class-builtin"),
+		Include("variable"),
+		// <regexfunc> | <regexfunc(parameter)> | <variable=regexfunc>
+		{
+			`(?:(\w[\w-:]*)(=\.?))?(&?\w[\w'-:]+?)(\(.+?\))?(?=>)`,
+			ByGroups(
+				NameVariable, Operator, NameFunction, UsingSelf("root"),
+			),
+			nil,
+		},
+		// <func: value>
+		{
+			`(&?\w[\w':-]*?)(:)((?:.*?(?:\$<\w[\w':-]*>)?.*?)*?)(?=>)`,
+			ByGroups(
+				NameFunction, Punctuation, UsingSelf("root"),
+			),
+			nil,
+		},
+		Include("colon-pair-attribute"),
+		{`(?<!(?<!\\)\\)\[`, Punctuation, Push("regex-character-class")},
+		{`\+|\-`, Operator, nil},
+		{`@[\w'-:]+`, NameVariable, nil},
+		{`(?<=<)[|!?.]`, Operator, nil},
+		{`.+?`, StringRegex, nil},
+	},
+	"regex-escape-class": {
+		{`(?i)\\n|\\t|\\h|\\v|\\s|\\d|\\w`, StringEscape, nil},
+	},
+	"regex-character-class": {
+		{`(?<!(?<!\\)\\)\]`, Punctuation, Pop(1)},
+		Include("regex-escape-class"),
+		Include("escape-c-name"),
+		Include("escape-hexadecimal"),
+		Include("number"),
+		{`\.\.`, Operator, nil},
+		{`.+?`, StringRegex, nil},
+	},
+	"metaoperator": {
+		// Z[=>]
+		{
+			`\b([RZX]+)\b(\[)([^\s\]]+?)(\])`,
+			ByGroups(OperatorWord, Punctuation, UsingSelf("root"), Punctuation),
+			nil,
+		},
+		// Z=>
+		{`\b([RZX]+)\b([^\s\]]+)`, ByGroups(OperatorWord, UsingSelf("operator")), nil},
+	},
+	"operator": {
+		// Word Operator
+		{wordOperatorsPattern, OperatorWord, nil},
+		// Operator
+		{operatorsPattern, Operator, nil},
+	},
+	"pod": {
+		// Single-line pod declaration
+		{`(#[|=])\s`, Keyword, Push("pod-single")},
+		// Multi-line pod declaration
+		{
+			"(#[|=])((" + bracketsPattern + `)(\3)*)()()`,
+			ByGroups(
+				Keyword, Punctuation, Punctuation, Punctuation, UsingSelf("pod-begin"),
+				Punctuation,
+			),
+			bracketsFinder(rakuPodDeclaration),
+		},
+		Include("pod-blocks"),
+	},
+	"pod-blocks": {
+		// =begin code
+		{
+			`(?<=^ *)( *)(=begin)( +)(code)([^\n]*)(.*?)(^\1=)(end)( +)(\4)`,
+			EmitterFunc(podCode),
+			nil,
+		},
+		// =begin
+		{
+			`(?<=^ *)( *)(=begin)( +)(?!code)(\w[\w'-]*)([^\n]*)()()`,
+			ByGroups(
+				Comment, Keyword, Comment, Keyword, EmitterFunc(podConfig),
+				UsingSelf("pod-begin"), Keyword,
+			),
+			bracketsFinder(rakuPod),
+		},
+		// =for ...
+		{
+			`(?<=^ *)( *=)(for|defn)( +)(\w[\w'-]*)([^\n]*\n)`,
+			ByGroups(Keyword, Keyword, StringDoc, Keyword, EmitterFunc(podConfig)),
+			Push("pod-paragraph"),
+		},
+		// =config
+		{
+			`(?<=^ *)( *=)(config)( +)(\w[\w'-]*)([^\n]*\n)`,
+			ByGroups(Keyword, Keyword, StringDoc, Keyword, EmitterFunc(podConfig)),
+			nil,
+		},
+		// =alias
+		{
+			`(?<=^ *)( *=)(alias)( +)(\w[\w'-]*)([^\n]*\n)`,
+			ByGroups(Keyword, Keyword, StringDoc, Keyword, StringDoc),
+			nil,
+		},
+		// =encoding
+		{
+			`(?<=^ *)( *=)(encoding)( +)([^\n]+)`,
+			ByGroups(Keyword, Keyword, StringDoc, Name),
+			nil,
+		},
+		// =para ...
+		{
+			`(?<=^ *)( *=)(para|table|pod)((?<!\n\s*)[^\n]*\n)`,
+			ByGroups(Keyword, Keyword, EmitterFunc(podConfig)),
+			Push("pod-paragraph"),
+		},
+		// =head1 ...
+		{
+			`(?<=^ *)( *=)(head\d+)( *)(#?)`,
+			ByGroups(Keyword, Keyword, GenericHeading, Keyword),
+			Push("pod-single-heading"),
+		},
+		// =item ...
+		{
+			`(?<=^ *)( *=)(item\d*|comment|data|[A-Z]+)( *)(#?)`,
+			ByGroups(Keyword, Keyword, StringDoc, Keyword),
+			Push("pod-single"),
+		},
+		{
+			`(?<=^ *)( *=)(finish)([^\n]*)`,
+			ByGroups(Keyword, Keyword, EmitterFunc(podConfig)),
+			Push("pod-finish"),
+		},
+		// ={custom} ...
+		{
+			`(?<=^ *)( *=)(\w[\w'-]*)( *)(#?)`,
+			ByGroups(Keyword, Name, StringDoc, Keyword),
+			Push("pod-single"),
+		},
+		// = podconfig
+		{
+			`(?<=^ *)( *=)( *)((?::\w[\w'-]*(?:` + colonPairOpeningBrackets + `.+?` +
+				colonPairClosingBrackets + `) *)*\n)`,
+			ByGroups(Keyword, StringDoc, EmitterFunc(podConfig)),
+			nil,
+		},
+	},
+	"pod-begin": {
+		Include("pod-blocks"),
+		Include("pre-pod-formatter"),
+		{`.+?`, StringDoc, nil},
+	},
+	"pod-paragraph": {
+		{`\n\s*?\n`, StringDoc, Pop(1)},
+		Include("pre-pod-formatter"),
+		{`.+?`, StringDoc, nil},
+	},
+	"pod-single": {
+		{`\n`, StringDoc, Pop(1)},
+		Include("pre-pod-formatter"),
+		{`.+?`, StringDoc, nil},
+	},
+	"pod-single-heading": {
+		{`\n`, GenericHeading, Pop(1)},
+		Include("pre-pod-formatter"),
+		{`.+?`, GenericHeading, nil},
+	},
+	"pod-finish": {
+		{`\z`, nil, Pop(1)},
+		Include("pre-pod-formatter"),
+		{`.+?`, StringDoc, nil},
+	},
+	"pre-pod-formatter": {
+		// C<code>, B<bold>, ...
+		{
+			`([CBIUDTKRPAELZVMSXN])(<+|«)`,
+			ByGroups(Keyword, Punctuation),
+			Mutators(
+				bracketsFinder(rakuPodFormatter),
+				Push("pod-formatter"), MutatorFunc(podFormatter),
+			),
+		},
+	},
+	"pod-formatter": {
+		// Placeholder rule, will be replaced by podFormatter. DO NOT REMOVE!
+		{`>`, Punctuation, Pop(1)},
+		Include("pre-pod-formatter"),
+		// Placeholder rule, will be replaced by podFormatter. DO NOT REMOVE!
+		{`.+?`, StringOther, nil},
+	},
+	"variable": {
+		{variablePattern, NameVariable, Push("name-adverb")},
+		{globalVariablePattern, NameVariableGlobal, Push("name-adverb")},
+		{`[$@](?:<.*?>)+`, NameVariable, nil},
+		{`\$/`, NameVariable, nil},
+		{`\$!`, NameVariable, nil},
+		{`[$@%]`, NameVariable, nil},
+	},
+	"single-quote": {
+		{`(?<!(?<!\\)\\)'`, Punctuation, Push("single-quote-inner")},
+	},
+	"single-quote-inner": {
+		{`(?<!(?<!(?<!\\)\\)\\)'`, Punctuation, Pop(1)},
+		Include("escape-qq"),
+		{`(?:\\\\|\\[^\\]|[^'\\])+?`, StringSingle, nil},
+	},
+	"double-quotes": {
+		{`(?<!(?<!\\)\\)"`, Punctuation, Pop(1)},
+		Include("qq"),
+	},
+	"<<": {
+		{`>>(?!\s*(?:\d+|\.(?:Int|Numeric)|[$@%][\w':-]+|\[))`, Punctuation, Pop(1)},
+		Include("ww"),
+	},
+	"«": {
+		{`»(?!\s*(?:\d+|\.(?:Int|Numeric)|[$@%][\w':-]+|\[))`, Punctuation, Pop(1)},
+		Include("ww"),
+	},
+	"ww": {
+		Include("single-quote"),
+		Include("qq"),
+	},
+	"qq": {
+		{
+			`(?<!(?<!\\)\\)(?:` + variablePattern + `|` + globalVariablePattern + `)`,
+			NameVariable,
+			Push("qq-variable", "name-adverb"),
+		},
+		// Function with adverb
+		{
+			`\w[\w:'-]+(?=:['\w-]+` +
+				colonPairOpeningBrackets + `.+?` + colonPairClosingBrackets + `\()`,
+			NameFunction,
+			Push("qq-function", "name-adverb"),
+		},
+		// Function without adverb
+		{`\w[\w:'-]+(?=\((?!"))`, NameFunction, Push("qq-function")},
+		Include("closure"),
+		Include("escape-hexadecimal"),
+		Include("escape-c-name"),
+		Include("escape-qq"),
+		{`.+?`, StringDouble, nil},
+	},
+	"qq-function": {
+		{`(\([^"]*?\))`, UsingSelf("root"), nil},
+		Default(Pop(1)),
+	},
+	"qq-variable": {
+		{`(?:\[.*?\]|\{.*?\}|<<.*?>>|<.*?>|«*?»)+`, UsingSelf("root"), nil},
+		// Method
+		{
+			`(\.)([^(\s]+)(\([^"]*?\))`,
+			ByGroups(Operator, NameFunction, UsingSelf("root")),
+			nil,
+		},
+		Default(Pop(1)),
+	},
+	"Q": {
+		Include("escape-qq"),
+		{`.+?`, String, nil},
+	},
+	"Q-closure": {
+		Include("escape-qq"),
+		Include("closure"),
+		{`.+?`, String, nil},
+	},
+	"Q-variable": {
+		Include("escape-qq"),
+		Include("variable"),
+		{`.+?`, String, nil},
+	},
+	"closure": {
+		{`(?<!(?<!\\)\\)\{.+?\}`, UsingSelf("root"), nil},
+	},
+	"token": {
+		// Token signature
+		{`(\()(.+?)(\))`, ByGroups(Punctuation, UsingSelf("root"), Punctuation), nil},
+		{`\{`, Punctuation, Mutators(Pop(1), bracketsFinder(rakuRegexInsideToken))},
+		{`.+?`, Text, nil},
+	},
+}
+
+type RakuToken int
+
+const (
+	rakuQuote RakuToken = iota
+	rakuName
+	rakuNameAttribute
+	rakuPod
+	rakuPodFormatter
+	rakuPodDeclaration
+	rakuMultilineComment
+	rakuSlashRegex
+	rakuMatchRegex
+	rakuSubstitutionRegex
+	rakuSubstitutionSingleRegex
+	rakuRegexInsideToken
+)
+
+const namePattern = `((?:(?!` + colonPairPattern + `)[\w':-])+)`
+
+const colonPairOpeningBrackets = `(?:<<|<|«|\(|\[|\{)`
+const colonPairClosingBrackets = `(?:>>|>|»|\)|\]|\})`
+const colonPairPattern = `(:)(\w[\w'-]*)(` + colonPairOpeningBrackets + `)()()`
+
+const variablePattern = `[$@%&]+[.^:?=!~]?` + namePattern
+const globalVariablePattern = `[$@%&]+\*` + namePattern
+
+var keywords = []string{
+	`BEGIN`, `CATCH`, `CHECK`, `CLOSE`, `CONTROL`, `DOC`, `END`, `ENTER`, `FIRST`, `INIT`,
+	`KEEP`, `LAST`, `LEAVE`, `NEXT`, `POST`, `PRE`, `QUIT`, `UNDO`, `anon`, `augment`, `but`,
+	`class`, `constant`, `default`, `does`, `else`, `elsif`, `enum`, `for`, `gather`, `given`,
+	`grammar`, `has`, `if`, `import`, `is`, `of`, `let`, `loop`, `made`, `make`, `method`,
+	`module`, `multi`, `my`, `need`, `orwith`, `our`, `proceed`, `proto`, `repeat`, `require`,
+	`where`, `return`, `return-rw`, `returns`, `->`, `-->`, `role`, `state`, `sub`, `no`,
+	`submethod`, `subset`, `succeed`, `supersede`, `try`, `unit`, `unless`, `until`,
+	`use`, `when`, `while`, `with`, `without`, `export`, `native`, `repr`, `required`, `rw`,
+	`symbol`, `default`, `cached`, `DEPRECATED`, `dynamic`, `hidden-from-backtrace`, `nodal`,
+	`pure`, `raw`, `start`, `react`, `supply`, `whenever`, `also`, `rule`, `token`, `regex`,
+	`dynamic-scope`, `built`, `temp`,
+}
+
+var keywordsPattern = Words(`(?<!['\w:-])`, `(?!['\w:-])`, sortWords(keywords)...)
+
+var wordOperators = []string{
+	`X`, `Z`, `R`, `after`, `and`, `andthen`, `before`, `cmp`, `div`, `eq`, `eqv`, `extra`, `ge`,
+	`gt`, `le`, `leg`, `lt`, `mod`, `ne`, `or`, `orelse`, `x`, `xor`, `xx`, `gcd`, `lcm`,
+	`but`, `min`, `max`, `^fff`, `fff^`, `fff`, `^ff`, `ff^`, `ff`, `so`, `not`, `unicmp`,
+	`TR`, `o`, `(&)`, `(.)`, `(|)`, `(+)`, `(-)`, `(^)`, `coll`, `(elem)`, `(==)`,
+	`(cont)`, `(<)`, `(<=)`, `(>)`, `(>=)`, `minmax`, `notandthen`, `S`,
+}
+
+var wordOperatorsPattern = Words(`(?<=^|\b|\s)`, `(?=$|\b|\s)`, sortWords(wordOperators)...)
+
+var operators = []string{
+	`++`, `--`, `-`, `**`, `!`, `+`, `~`, `?`, `+^`, `~^`, `?^`, `^`, `*`, `/`, `%`, `%%`, `+&`,
+	`+<`, `+>`, `~&`, `~<`, `~>`, `?&`, `+|`, `+^`, `~|`, `~^`, `?`, `?|`, `?^`, `&`, `^`,
+	`<=>`, `^…^`, `^…`, `…^`, `…`, `...`, `...^`, `^...`, `^...^`, `..`, `..^`, `^..`, `^..^`,
+	`::=`, `:=`, `!=`, `==`, `<=`, `<`, `>=`, `>`, `~~`, `===`, `&&`, `||`, `|`, `^^`, `//`,
+	`??`, `!!`, `^fff^`, `^ff^`, `<==`, `==>`, `<<==`, `==>>`, `=>`, `=`, `<<`, `«`, `>>`, `»`,
+	`,`, `>>.`, `».`, `.&`, `.=`, `.^`, `.?`, `.+`, `.*`, `.`, `∘`, `∩`, `⊍`, `∪`, `⊎`, `∖`,
+	`⊖`, `≠`, `≤`, `≥`, `=:=`, `=~=`, `≅`, `∈`, `∉`, `≡`, `≢`, `∋`, `∌`, `⊂`, `⊄`, `⊆`, `⊈`,
+	`⊃`, `⊅`, `⊇`, `⊉`, `:`, `!!!`, `???`, `¯`, `×`, `÷`, `−`, `⁺`, `⁻`,
+}
+
+var operatorsPattern = Words(``, ``, sortWords(operators)...)
+
+var builtinTypes = []string{
+	`False`, `True`, `Order`, `More`, `Less`, `Same`, `Any`, `Array`, `Associative`, `AST`,
+	`atomicint`, `Attribute`, `Backtrace`, `Backtrace::Frame`, `Bag`, `Baggy`, `BagHash`,
+	`Blob`, `Block`, `Bool`, `Buf`, `Callable`, `CallFrame`, `Cancellation`, `Capture`,
+	`CArray`, `Channel`, `Code`, `compiler`, `Complex`, `ComplexStr`, `CompUnit`,
+	`CompUnit::PrecompilationRepository`, `CompUnit::Repository`, `Empty`,
+	`CompUnit::Repository::FileSystem`, `CompUnit::Repository::Installation`, `Cool`,
+	`CurrentThreadScheduler`, `CX::Warn`, `CX::Take`, `CX::Succeed`, `CX::Return`, `CX::Redo`,
+	`CX::Proceed`, `CX::Next`, `CX::Last`, `CX::Emit`, `CX::Done`, `Cursor`, `Date`, `Dateish`,
+	`DateTime`, `Distribution`, `Distribution::Hash`, `Distribution::Locally`,
+	`Distribution::Path`, `Distribution::Resource`, `Distro`, `Duration`, `Encoding`,
+	`Encoding::Registry`, `Endian`, `Enumeration`, `Exception`, `Failure`, `FatRat`, `Grammar`,
+	`Hash`, `HyperWhatever`, `Instant`, `Int`, `int`, `int16`, `int32`, `int64`, `int8`, `str`,
+	`IntStr`, `IO`, `IO::ArgFiles`, `IO::CatHandle`, `IO::Handle`, `IO::Notification`,
+	`IO::Notification::Change`, `IO::Path`, `IO::Path::Cygwin`, `IO::Path::Parts`,
+	`IO::Path::QNX`, `IO::Path::Unix`, `IO::Path::Win32`, `IO::Pipe`, `IO::Socket`,
+	`IO::Socket::Async`, `IO::Socket::Async::ListenSocket`, `IO::Socket::INET`, `IO::Spec`,
+	`IO::Spec::Cygwin`, `IO::Spec::QNX`, `IO::Spec::Unix`, `IO::Spec::Win32`, `IO::Special`,
+	`Iterable`, `Iterator`, `Junction`, `Kernel`, `Label`, `List`, `Lock`, `Lock::Async`,
+	`Lock::ConditionVariable`, `long`, `longlong`, `Macro`, `Map`, `Match`,
+	`Metamodel::AttributeContainer`, `Metamodel::C3MRO`, `Metamodel::ClassHOW`,
+	`Metamodel::ConcreteRoleHOW`, `Metamodel::CurriedRoleHOW`, `Metamodel::DefiniteHOW`,
+	`Metamodel::Documenting`, `Metamodel::EnumHOW`, `Metamodel::Finalization`,
+	`Metamodel::MethodContainer`, `Metamodel::Mixins`, `Metamodel::MROBasedMethodDispatch`,
+	`Metamodel::MultipleInheritance`, `Metamodel::Naming`, `Metamodel::Primitives`,
+	`Metamodel::PrivateMethodContainer`, `Metamodel::RoleContainer`, `Metamodel::RolePunning`,
+	`Metamodel::Stashing`, `Metamodel::Trusting`, `Metamodel::Versioning`, `Method`, `Mix`,
+	`MixHash`, `Mixy`, `Mu`, `NFC`, `NFD`, `NFKC`, `NFKD`, `Nil`, `Num`, `num32`, `num64`,
+	`Numeric`, `NumStr`, `ObjAt`, `Order`, `Pair`, `Parameter`, `Perl`, `Pod::Block`,
+	`Pod::Block::Code`, `Pod::Block::Comment`, `Pod::Block::Declarator`, `Pod::Block::Named`,
+	`Pod::Block::Para`, `Pod::Block::Table`, `Pod::Heading`, `Pod::Item`, `Pointer`,
+	`Positional`, `PositionalBindFailover`, `Proc`, `Proc::Async`, `Promise`, `Proxy`,
+	`PseudoStash`, `QuantHash`, `RaceSeq`, `Raku`, `Range`, `Rat`, `Rational`, `RatStr`,
+	`Real`, `Regex`, `Routine`, `Routine::WrapHandle`, `Scalar`, `Scheduler`, `Semaphore`,
+	`Seq`, `Sequence`, `Set`, `SetHash`, `Setty`, `Signature`, `size_t`, `Slip`, `Stash`,
+	`Str`, `StrDistance`, `Stringy`, `Sub`, `Submethod`, `Supplier`, `Supplier::Preserving`,
+	`Supply`, `Systemic`, `Tap`, `Telemetry`, `Telemetry::Instrument::Thread`,
+	`Telemetry::Instrument::ThreadPool`, `Telemetry::Instrument::Usage`, `Telemetry::Period`,
+	`Telemetry::Sampler`, `Thread`, `Test`, `ThreadPoolScheduler`, `UInt`, `uint16`, `uint32`,
+	`uint64`, `uint8`, `Uni`, `utf8`, `ValueObjAt`, `Variable`, `Version`, `VM`, `Whatever`,
+	`WhateverCode`, `WrapHandle`, `NativeCall`,
+	// Pragmas
+	`precompilation`, `experimental`, `worries`, `MONKEY-TYPING`, `MONKEY-SEE-NO-EVAL`,
+	`MONKEY-GUTS`, `fatal`, `lib`, `isms`, `newline`, `nqp`, `soft`,
+	`strict`, `trace`, `variables`,
+}
+
+var builtinTypesPattern = Words(`(?<!['\w:-])`, `(?::[_UD])?(?!['\w:-])`, sortWords(builtinTypes)...)
+
+var builtinRoutines = []string{
+	`ACCEPTS`, `abs`, `abs2rel`, `absolute`, `accept`, `accepts_type`, `accessed`, `acos`,
+	`acosec`, `acosech`, `acosh`, `acotan`, `acotanh`, `acquire`, `act`, `action`, `actions`,
+	`add`, `add_attribute`, `add_enum_value`, `add_fallback`, `add_method`, `add_parent`,
+	`add_private_method`, `add_role`, `add_stash`, `add_trustee`, `addendum`, `adverb`, `after`,
+	`all`, `allocate`, `allof`, `allowed`, `alternative-names`, `annotations`, `antipair`,
+	`antipairs`, `any`, `anyof`, `api`, `app_lifetime`, `append`, `arch`, `archetypes`,
+	`archname`, `args`, `ARGS-TO-CAPTURE`, `arity`, `Array`, `asec`, `asech`, `asin`, `asinh`,
+	`ASSIGN-KEY`, `ASSIGN-POS`, `assuming`, `ast`, `at`, `atan`, `atan2`, `atanh`, `AT-KEY`,
+	`atomic-assign`, `atomic-dec-fetch`, `atomic-fetch`, `atomic-fetch-add`, `atomic-fetch-dec`,
+	`atomic-fetch-inc`, `atomic-fetch-sub`, `atomic-inc-fetch`, `AT-POS`, `attributes`, `auth`,
+	`await`, `backend`, `backtrace`, `Bag`, `bag`, `Baggy`, `BagHash`, `bail-out`, `base`,
+	`basename`, `base-repeating`, `base_type`, `batch`, `BIND-KEY`, `BIND-POS`, `bind-stderr`,
+	`bind-stdin`, `bind-stdout`, `bind-udp`, `bits`, `bless`, `block`, `Bool`, `bool-only`,
+	`bounds`, `break`, `Bridge`, `broken`, `BUILD`, `TWEAK`, `build-date`, `bytes`, `cache`,
+	`callframe`, `calling-package`, `CALL-ME`, `callsame`, `callwith`, `can`, `cancel`,
+	`candidates`, `cando`, `can-ok`, `canonpath`, `caps`, `caption`, `Capture`, `capture`,
+	`cas`, `catdir`, `categorize`, `categorize-list`, `catfile`, `catpath`, `cause`, `ceiling`,
+	`cglobal`, `changed`, `Channel`, `channel`, `chars`, `chdir`, `child`, `child-name`,
+	`child-typename`, `chmod`, `chomp`, `chop`, `chr`, `chrs`, `chunks`, `cis`, `classify`,
+	`classify-list`, `cleanup`, `clone`, `close`, `closed`, `close-stdin`, `cmp-ok`, `code`,
+	`codename`, `codes`, `coerce_type`, `coll`, `collate`, `column`, `comb`, `combinations`,
+	`command`, `comment`, `compiler`, `Complex`, `compose`, `composalizer`, `compose_type`,
+	`compose_values`, `composer`, `compute_mro`, `condition`, `config`, `configure_destroy`,
+	`configure_type_checking`, `conj`, `connect`, `constraints`, `construct`, `contains`,
+	`content`, `contents`, `copy`, `cos`, `cosec`, `cosech`, `cosh`, `cotan`, `cotanh`, `count`,
+	`count-only`, `cpu-cores`, `cpu-usage`, `CREATE`, `create_type`, `cross`, `cue`, `curdir`,
+	`curupdir`, `d`, `Date`, `DateTime`, `day`, `daycount`, `day-of-month`, `day-of-week`,
+	`day-of-year`, `days-in-month`, `dd-mm-yyyy`, `declaration`, `decode`, `decoder`, `deepmap`,
+	`default`, `defined`, `DEFINITE`, `definite`, `delayed`, `delete`, `delete-by-compiler`,
+	`DELETE-KEY`, `DELETE-POS`, `denominator`, `desc`, `DESTROY`, `destroyers`, `devnull`,
+	`diag`, `did-you-mean`, `die`, `dies-ok`, `dir`, `dirname`, `distribution`, `dir-sep`,
+	`DISTROnames`, `do`, `does`, `does-ok`, `done`, `done-testing`, `duckmap`, `dynamic`, `e`,
+	`eager`, `earlier`, `elems`, `emit`, `enclosing`, `encode`, `encoder`, `encoding`, `end`,
+	`endian`, `ends-with`, `enum_from_value`, `enum_value_list`, `enum_values`, `enums`, `EOF`,
+	`eof`, `EVAL`, `eval-dies-ok`, `EVALFILE`, `eval-lives-ok`, `event`, `exception`,
+	`excludes-max`, `excludes-min`, `EXISTS-KEY`, `EXISTS-POS`, `exit`, `exitcode`, `exp`,
+	`expected`, `explicitly-manage`, `expmod`, `export_callback`, `extension`, `f`, `fail`,
+	`FALLBACK`, `fails-like`, `fc`, `feature`, `file`, `filename`, `files`, `find`,
+	`find_method`, `find_method_qualified`, `finish`, `first`, `flat`, `first-date-in-month`,
+	`flatmap`, `flip`, `floor`, `flunk`, `flush`, `flush_cache`, `fmt`, `format`, `formatter`,
+	`free-memory`, `freeze`, `from`, `from-list`, `from-loop`, `from-posix`, `from-slurpy`,
+	`full`, `full-barrier`, `GENERATE-USAGE`, `generate_mixin`, `get`, `get_value`, `getc`,
+	`gist`, `got`, `grab`, `grabpairs`, `grep`, `handle`, `handled`, `handles`, `hardware`,
+	`has_accessor`, `Hash`, `hash`, `head`, `headers`, `hh-mm-ss`, `hidden`, `hides`, `hostname`,
+	`hour`, `how`, `hyper`, `id`, `illegal`, `im`, `in`, `in-timezone`, `indent`, `index`,
+	`indices`, `indir`, `infinite`, `infix`, `postcirumfix`, `cicumfix`, `install`,
+	`install_method_cache`, `Instant`, `instead`, `Int`, `int-bounds`, `interval`, `in-timezone`,
+	`invalid-str`, `invert`, `invocant`, `IO`, `IO::Notification.watch-path`, `is_trusted`,
+	`is_type`, `isa`, `is-absolute`, `isa-ok`, `is-approx`, `is-deeply`, `is-hidden`,
+	`is-initial-thread`, `is-int`, `is-lazy`, `is-leap-year`, `isNaN`, `isnt`, `is-prime`,
+	`is-relative`, `is-routine`, `is-setting`, `is-win`, `item`, `iterator`, `join`, `keep`,
+	`kept`, `KERNELnames`, `key`, `keyof`, `keys`, `kill`, `kv`, `kxxv`, `l`, `lang`, `last`,
+	`lastcall`, `later`, `lazy`, `lc`, `leading`, `level`, `like`, `line`, `lines`, `link`,
+	`List`, `list`, `listen`, `live`, `lives-ok`, `load`, `load-repo-id`, `load-unit`, `loaded`,
+	`loads`, `local`, `lock`, `log`, `log10`, `lookup`, `lsb`, `made`, `MAIN`, `make`, `Map`,
+	`map`, `match`, `max`, `maxpairs`, `merge`, `message`, `method`, `meta`, `method_table`,
+	`methods`, `migrate`, `min`, `minmax`, `minpairs`, `minute`, `misplaced`, `Mix`, `mix`,
+	`MixHash`, `mixin`, `mixin_attribute`, `Mixy`, `mkdir`, `mode`, `modified`, `month`, `move`,
+	`mro`, `msb`, `multi`, `multiness`, `name`, `named`, `named_names`, `narrow`,
+	`nativecast`, `native-descriptor`, `nativesizeof`, `need`, `new`, `new_type`,
+	`new-from-daycount`, `new-from-pairs`, `next`, `nextcallee`, `next-handle`, `nextsame`,
+	`nextwith`, `next-interesting-index`, `NFC`, `NFD`, `NFKC`, `NFKD`, `nice`, `nl-in`,
+	`nl-out`, `nodemap`, `nok`, `normalize`, `none`, `norm`, `not`, `note`, `now`, `nude`,
+	`Num`, `numerator`, `Numeric`, `of`, `offset`, `offset-in-hours`, `offset-in-minutes`,
+	`ok`, `old`, `on-close`, `one`, `on-switch`, `open`, `opened`, `operation`, `optional`,
+	`ord`, `ords`, `orig`, `os-error`, `osname`, `out-buffer`, `pack`, `package`, `package-kind`,
+	`package-name`, `packages`, `Pair`, `pair`, `pairs`, `pairup`, `parameter`, `params`,
+	`parent`, `parent-name`, `parents`, `parse`, `parse-base`, `parsefile`, `parse-names`,
+	`parts`, `pass`, `path`, `path-sep`, `payload`, `peer-host`, `peer-port`, `periods`, `perl`,
+	`permutations`, `phaser`, `pick`, `pickpairs`, `pid`, `placeholder`, `plan`, `plus`,
+	`polar`, `poll`, `polymod`, `pop`, `pos`, `positional`, `posix`, `postfix`, `postmatch`,
+	`precomp-ext`, `precomp-target`, `precompiled`, `pred`, `prefix`, `prematch`, `prepend`,
+	`primary`, `print`, `printf`, `print-nl`, `print-to`, `private`, `private_method_names`,
+	`private_method_table`, `proc`, `produce`, `Promise`, `promise`, `prompt`, `protect`,
+	`protect-or-queue-on-recursion`, `publish_method_cache`, `pull-one`, `push`, `push-all`,
+	`push-at-least`, `push-exactly`, `push-until-lazy`, `put`, `qualifier-type`, `quaternary`,
+	`quit`, `r`, `race`, `radix`, `raku`, `rand`, `Range`, `range`, `Rat`, `raw`, `re`, `read`,
+	`read-bits`, `read-int128`, `read-int16`, `read-int32`, `read-int64`, `read-int8`,
+	`read-num32`, `read-num64`, `read-ubits`, `read-uint128`, `read-uint16`, `read-uint32`,
+	`read-uint64`, `read-uint8`, `readchars`, `readonly`, `ready`, `Real`, `reallocate`,
+	`reals`, `reason`, `rebless`, `receive`, `recv`, `redispatcher`, `redo`, `reduce`,
+	`rel2abs`, `relative`, `release`, `remove`, `rename`, `repeated`, `replacement`,
+	`replace-with`, `repo`, `repo-id`, `report`, `required`, `reserved`, `resolve`, `restore`,
+	`result`, `resume`, `rethrow`, `return`, `return-rw`, `returns`, `reverse`, `right`,
+	`rindex`, `rmdir`, `role`, `roles_to_compose`, `rolish`, `roll`, `rootdir`, `roots`,
+	`rotate`, `rotor`, `round`, `roundrobin`, `routine-type`, `run`, `RUN-MAIN`, `rw`, `rwx`,
+	`samecase`, `samemark`, `samewith`, `say`, `schedule-on`, `scheduler`, `scope`, `sec`,
+	`sech`, `second`, `secondary`, `seek`, `self`, `send`, `Seq`, `Set`, `set`, `serial`,
+	`set_hidden`, `set_name`, `set_package`, `set_rw`, `set_value`, `set_api`, `set_auth`,
+	`set_composalizer`, `set_export_callback`, `set_is_mixin`, `set_mixin_attribute`,
+	`set_package`, `set_ver`, `set_why`, `SetHash`, `Setty`, `set-instruments`,
+	`setup_finalization`, `setup_mixin_cache`, `shape`, `share`, `shell`, `short-id`,
+	`short-name`, `shortname`, `shift`, `sibling`, `sigil`, `sign`, `signal`, `signals`,
+	`signature`, `sin`, `sinh`, `sink`, `sink-all`, `skip`, `skip-at-least`,
+	`skip-at-least-pull-one`, `skip-one`, `skip-rest`, `sleep`, `sleep-timer`, `sleep-until`,
+	`Slip`, `slip`, `slurp`, `slurp-rest`, `slurpy`, `snap`, `snapper`, `so`, `socket-host`,
+	`socket-port`, `sort`, `source`, `source-package`, `spawn`, `SPEC`, `splice`, `split`,
+	`splitdir`, `splitpath`, `sprintf`, `spurt`, `sqrt`, `squish`, `srand`, `stable`, `start`,
+	`started`, `starts-with`, `status`, `stderr`, `stdout`, `STORE`, `store-file`,
+	`store-repo-id`, `store-unit`, `Str`, `Stringy`, `sub_signature`, `subbuf`, `subbuf-rw`,
+	`subname`, `subparse`, `subst`, `subst-mutate`, `substr`, `substr-eq`, `substr-rw`,
+	`subtest`, `succ`, `sum`, `suffix`, `summary`, `Supply`, `symlink`, `T`, `t`, `tail`,
+	`take`, `take-rw`, `tan`, `tanh`, `tap`, `target`, `target-name`, `tc`, `tclc`, `tell`,
+	`term`, `tertiary`, `then`, `throttle`, `throw`, `throws-like`, `time`, `timezone`,
+	`tmpdir`, `to`, `today`, `todo`, `toggle`, `to-posix`, `total`, `total-memory`, `trailing`,
+	`trans`, `tree`, `trim`, `trim-leading`, `trim-trailing`, `truncate`, `truncated-to`,
+	`trusts`, `try_acquire`, `trying`, `twigil`, `type`, `type_captures`, `type_check`,
+	`typename`, `uc`, `udp`, `uncaught_handler`, `undefine`, `unimatch`, `unicmp`, `uniname`,
+	`uninames`, `uninstall`, `uniparse`, `uniprop`, `uniprops`, `unique`, `unival`, `univals`,
+	`unlike`, `unlink`, `unlock`, `unpack`, `unpolar`, `unset`, `unshift`, `unwrap`, `updir`,
+	`USAGE`, `usage-name`, `use-ok`, `utc`, `val`, `value`, `values`, `VAR`, `variable`, `ver`,
+	`verbose-config`, `Version`, `version`, `VMnames`, `volume`, `vow`, `w`, `wait`, `warn`,
+	`watch`, `watch-path`, `week`, `weekday-of-month`, `week-number`, `week-year`, `WHAT`,
+	`what`, `when`, `WHERE`, `WHEREFORE`, `WHICH`, `WHO`, `whole-second`, `WHY`, `why`,
+	`with-lock-hidden-from-recursion-check`, `wordcase`, `words`, `workaround`, `wrap`,
+	`write`, `write-bits`, `write-int128`, `write-int16`, `write-int32`, `write-int64`,
+	`write-int8`, `write-num32`, `write-num64`, `write-ubits`, `write-uint128`, `write-uint16`,
+	`write-uint32`, `write-uint64`, `write-uint8`, `write-to`, `x`, `yada`, `year`, `yield`,
+	`yyyy-mm-dd`, `z`, `zip`, `zip-latest`, `HOW`, `s`, `DEPRECATED`, `trait_mod`,
+}
+
+var builtinRoutinesPattern = Words(`(?<!['\w:-])`, `(?!['\w-])`, sortWords(builtinRoutines)...)
+
+// A map of opening and closing brackets
+var brackets = map[rune]rune{
+	'\u0028': '\u0029', '\u003c': '\u003e', '\u005b': '\u005d',
+	'\u007b': '\u007d', '\u00ab': '\u00bb', '\u0f3a': '\u0f3b',
+	'\u0f3c': '\u0f3d', '\u169b': '\u169c', '\u2018': '\u2019',
+	'\u201a': '\u2019', '\u201b': '\u2019', '\u201c': '\u201d',
+	'\u201e': '\u201d', '\u201f': '\u201d', '\u2039': '\u203a',
+	'\u2045': '\u2046', '\u207d': '\u207e', '\u208d': '\u208e',
+	'\u2208': '\u220b', '\u2209': '\u220c', '\u220a': '\u220d',
+	'\u2215': '\u29f5', '\u223c': '\u223d', '\u2243': '\u22cd',
+	'\u2252': '\u2253', '\u2254': '\u2255', '\u2264': '\u2265',
+	'\u2266': '\u2267', '\u2268': '\u2269', '\u226a': '\u226b',
+	'\u226e': '\u226f', '\u2270': '\u2271', '\u2272': '\u2273',
+	'\u2274': '\u2275', '\u2276': '\u2277', '\u2278': '\u2279',
+	'\u227a': '\u227b', '\u227c': '\u227d', '\u227e': '\u227f',
+	'\u2280': '\u2281', '\u2282': '\u2283', '\u2284': '\u2285',
+	'\u2286': '\u2287', '\u2288': '\u2289', '\u228a': '\u228b',
+	'\u228f': '\u2290', '\u2291': '\u2292', '\u2298': '\u29b8',
+	'\u22a2': '\u22a3', '\u22a6': '\u2ade', '\u22a8': '\u2ae4',
+	'\u22a9': '\u2ae3', '\u22ab': '\u2ae5', '\u22b0': '\u22b1',
+	'\u22b2': '\u22b3', '\u22b4': '\u22b5', '\u22b6': '\u22b7',
+	'\u22c9': '\u22ca', '\u22cb': '\u22cc', '\u22d0': '\u22d1',
+	'\u22d6': '\u22d7', '\u22d8': '\u22d9', '\u22da': '\u22db',
+	'\u22dc': '\u22dd', '\u22de': '\u22df', '\u22e0': '\u22e1',
+	'\u22e2': '\u22e3', '\u22e4': '\u22e5', '\u22e6': '\u22e7',
+	'\u22e8': '\u22e9', '\u22ea': '\u22eb', '\u22ec': '\u22ed',
+	'\u22f0': '\u22f1', '\u22f2': '\u22fa', '\u22f3': '\u22fb',
+	'\u22f4': '\u22fc', '\u22f6': '\u22fd', '\u22f7': '\u22fe',
+	'\u2308': '\u2309', '\u230a': '\u230b', '\u2329': '\u232a',
+	'\u23b4': '\u23b5', '\u2768': '\u2769', '\u276a': '\u276b',
+	'\u276c': '\u276d', '\u276e': '\u276f', '\u2770': '\u2771',
+	'\u2772': '\u2773', '\u2774': '\u2775', '\u27c3': '\u27c4',
+	'\u27c5': '\u27c6', '\u27d5': '\u27d6', '\u27dd': '\u27de',
+	'\u27e2': '\u27e3', '\u27e4': '\u27e5', '\u27e6': '\u27e7',
+	'\u27e8': '\u27e9', '\u27ea': '\u27eb', '\u2983': '\u2984',
+	'\u2985': '\u2986', '\u2987': '\u2988', '\u2989': '\u298a',
+	'\u298b': '\u298c', '\u298d': '\u298e', '\u298f': '\u2990',
+	'\u2991': '\u2992', '\u2993': '\u2994', '\u2995': '\u2996',
+	'\u2997': '\u2998', '\u29c0': '\u29c1', '\u29c4': '\u29c5',
+	'\u29cf': '\u29d0', '\u29d1': '\u29d2', '\u29d4': '\u29d5',
+	'\u29d8': '\u29d9', '\u29da': '\u29db', '\u29f8': '\u29f9',
+	'\u29fc': '\u29fd', '\u2a2b': '\u2a2c', '\u2a2d': '\u2a2e',
+	'\u2a34': '\u2a35', '\u2a3c': '\u2a3d', '\u2a64': '\u2a65',
+	'\u2a79': '\u2a7a', '\u2a7d': '\u2a7e', '\u2a7f': '\u2a80',
+	'\u2a81': '\u2a82', '\u2a83': '\u2a84', '\u2a8b': '\u2a8c',
+	'\u2a91': '\u2a92', '\u2a93': '\u2a94', '\u2a95': '\u2a96',
+	'\u2a97': '\u2a98', '\u2a99': '\u2a9a', '\u2a9b': '\u2a9c',
+	'\u2aa1': '\u2aa2', '\u2aa6': '\u2aa7', '\u2aa8': '\u2aa9',
+	'\u2aaa': '\u2aab', '\u2aac': '\u2aad', '\u2aaf': '\u2ab0',
+	'\u2ab3': '\u2ab4', '\u2abb': '\u2abc', '\u2abd': '\u2abe',
+	'\u2abf': '\u2ac0', '\u2ac1': '\u2ac2', '\u2ac3': '\u2ac4',
+	'\u2ac5': '\u2ac6', '\u2acd': '\u2ace', '\u2acf': '\u2ad0',
+	'\u2ad1': '\u2ad2', '\u2ad3': '\u2ad4', '\u2ad5': '\u2ad6',
+	'\u2aec': '\u2aed', '\u2af7': '\u2af8', '\u2af9': '\u2afa',
+	'\u2e02': '\u2e03', '\u2e04': '\u2e05', '\u2e09': '\u2e0a',
+	'\u2e0c': '\u2e0d', '\u2e1c': '\u2e1d', '\u2e20': '\u2e21',
+	'\u3008': '\u3009', '\u300a': '\u300b', '\u300c': '\u300d',
+	'\u300e': '\u300f', '\u3010': '\u3011', '\u3014': '\u3015',
+	'\u3016': '\u3017', '\u3018': '\u3019', '\u301a': '\u301b',
+	'\u301d': '\u301e', '\ufd3e': '\ufd3f', '\ufe17': '\ufe18',
+	'\ufe35': '\ufe36', '\ufe37': '\ufe38', '\ufe39': '\ufe3a',
+	'\ufe3b': '\ufe3c', '\ufe3d': '\ufe3e', '\ufe3f': '\ufe40',
+	'\ufe41': '\ufe42', '\ufe43': '\ufe44', '\ufe47': '\ufe48',
+	'\ufe59': '\ufe5a', '\ufe5b': '\ufe5c', '\ufe5d': '\ufe5e',
+	'\uff08': '\uff09', '\uff1c': '\uff1e', '\uff3b': '\uff3d',
+	'\uff5b': '\uff5d', '\uff5f': '\uff60', '\uff62': '\uff63',
+}
+
+var bracketsPattern = `[` + regexp.QuoteMeta(joinRuneMap(brackets)) + `]`
+
+// Joins keys and values of rune map
+func joinRuneMap(m map[rune]rune) string {
+	runes := make([]rune, 0, len(m)*2)
+	for k, v := range m {
+		runes = append(runes, k)
+		runes = append(runes, v)
+	}
+
+	return string(runes)
+}
+
+// Sorts words in descending order
+func sortWords(words []string) []string {
+	sort.Slice(words, func(i, j int) bool {
+		return len([]rune(words[i])) > len([]rune(words[j]))
+	})
+
+	return words
+}
+
+// Finds the index of substring in the string starting at position n
+func indexAt(str []rune, substr []rune, pos int) int {
+	var text = string(str[pos:])
+
+	idx := strings.Index(text, string(substr))
+	if idx > -1 {
+		idx = utf8.RuneCountInString(text[:idx])
+		idx += pos
+	}
+
+	return idx
+}
+
+// Tells if an array of string contains a string
+func contains(s []string, e string) bool {
+	for _, value := range s {
+		if value == e {
+			return true
+		}
+	}
+	return false
+}
+
+// Finds opening brackets and their closing counterparts (including pod and heredoc)
+// and modifies state groups and position accordingly
+func bracketsFinder(tokenClass RakuToken) MutatorFunc {
+	return func(state *LexerState) error {
+		var openingChars []rune
+		var adverbs []rune
+		switch tokenClass {
+		case rakuPodDeclaration:
+			openingChars = []rune(state.Groups[2])
+		case rakuPod:
+			openingChars = []rune(strings.Join(state.Groups[1:5], ``))
+		case rakuPodFormatter:
+			openingChars = []rune(state.Groups[2])
+		case rakuMultilineComment:
+			openingChars = []rune(state.Groups[1])
+		case rakuQuote:
+			adverbs = []rune(state.Groups[4])
+			openingChars = []rune(state.Groups[6])
+		case rakuSlashRegex:
+			openingChars = []rune(state.Groups[1])
+		case rakuSubstitutionSingleRegex, rakuSubstitutionRegex:
+			openingChars = []rune(state.Groups[2])
+		case rakuMatchRegex:
+			openingChars = []rune(state.Groups[2])
+		case rakuRegexInsideToken:
+			openingChars = []rune("{")
+		case rakuNameAttribute:
+			openingChars = []rune(state.Groups[3])
+		case rakuName:
+			openingChars = []rune(state.Groups[1])
+		}
+
+		var openingChar = openingChars[0]
+
+		var nChars = len(openingChars)
+
+		var closingChar rune
+		var closingCharExists bool
+		var closingChars []rune
+
+		switch tokenClass {
+		case rakuPod:
+			closingChars = []rune(state.Groups[1] + `=end ` + state.Groups[4])
+			closingCharExists = true
+		default:
+			closingChar, closingCharExists = brackets[openingChar]
+		}
+
+		switch tokenClass {
+		case rakuPodFormatter:
+			var stack, ok = state.Get("pod_formatter_stack").([]RakuFormatterRules)
+			if !ok {
+				stack = []RakuFormatterRules{}
+			}
+			var popRule = makeRuleAndPushMaybe(RuleMakingConfig{
+				delimiter:              []rune{closingChar},
+				numberOfDelimiterChars: nChars,
+				tokenType:              Punctuation,
+				mutator:                Mutators(Pop(1), MutatorFunc(podFormatterPopper)),
+			})
+			var formatter TokenType = StringOther
+			switch state.Groups[1] {
+			case "B":
+				formatter = GenericStrong
+			case "I":
+				formatter = GenericEmph
+			case "U":
+				formatter = GenericUnderline
+			}
+			var formattingRule = makeRuleAndPushMaybe(RuleMakingConfig{
+				pattern:   `.+?`,
+				tokenType: formatter,
+				mutator:   nil,
+			})
+			state.Set("pod_formatter_stack",
+				append(stack, RakuFormatterRules{popRule, formattingRule}))
+
+			return nil
+		case rakuSlashRegex, rakuMatchRegex, rakuSubstitutionRegex,
+			rakuSubstitutionSingleRegex, rakuRegexInsideToken:
+			// We're inside a regex!
+
+			switch tokenClass {
+			// If the regex knows its own delimiter and uses `UsingSelf("regex")`, then we only
+			// put a placeholder rule at the top of "regex" state and return
+			case rakuSlashRegex, rakuSubstitutionRegex:
+				makeRuleAndPushMaybe(RuleMakingConfig{
+					pattern:      `^$`,
+					rulePosition: topRule,
+					state:        state,
+					stateName:    "regex",
+				})
+
+				return nil
+			default:
+				// While matching a regex, the closing chars may have been used inside the regex
+				// so we have to push to regex state and pop on the matched closing chars
+				// and return
+				var delimiter []rune
+				if closingCharExists {
+					delimiter = []rune{closingChar}
+				} else {
+					delimiter = openingChars
+				}
+
+				makeRuleAndPushMaybe(RuleMakingConfig{
+					delimiter:              delimiter,
+					tokenType:              Punctuation,
+					mutator:                Pop(1),
+					rulePosition:           topRule,
+					state:                  state,
+					stateName:              "regex",
+					pushToStack:            true,
+					numberOfDelimiterChars: nChars,
+				})
+
+				// Remove inner punctuation matches
+				switch tokenClass {
+				case rakuMatchRegex, rakuSubstitutionSingleRegex:
+					state.Groups[3] = ""
+					state.Groups[4] = ""
+				}
+
+				return nil
+			}
+		}
+
+		var text = state.Text
+
+		var endPos int
+
+		var nonMirroredOpeningCharPosition int
+
+		if !closingCharExists {
+			// it's not a mirrored character, which means we
+			// just need to look for the next occurrence
+			nonMirroredOpeningCharPosition = indexAt(text, openingChars, state.Pos)
+			endPos = nonMirroredOpeningCharPosition
+		} else {
+			if tokenClass != rakuPod {
+				closingChars = []rune(strings.Repeat(string(closingChar), nChars))
+			}
+
+			// we need to look for the corresponding closing character,
+			// keep nesting in mind
+			var nestingLevel = 1
+
+			var searchPos = state.Pos - nChars
+
+			var nextClosePos int
+
+			for nestingLevel > 0 {
+				var nextOpenPos = indexAt(text, openingChars, searchPos+nChars)
+				nextClosePos = indexAt(text, closingChars, searchPos+nChars)
+
+				switch {
+				case nextClosePos == -1:
+					nextClosePos = len(text)
+					nestingLevel = 0
+				case nextOpenPos != -1 && nextOpenPos < nextClosePos:
+					nestingLevel++
+					nChars = len(openingChars)
+					searchPos = nextOpenPos
+				default: // next_close_pos < next_open_pos
+					nestingLevel--
+					nChars = len(closingChars)
+					searchPos = nextClosePos
+				}
+			}
+
+			endPos = nextClosePos
+		}
+
+		if endPos < 0 {
+			// if we didn't find a closer, just highlight the
+			// rest of the text in this class
+			endPos = len(text)
+		}
+
+		var adverbre = regexp.MustCompile(`:to\b|:heredoc\b`)
+		var heredocTerminator []rune
+		if adverbre.MatchString(string(adverbs)) {
+			heredocTerminator = text[state.Pos-1+nChars : endPos]
+			if len(heredocTerminator) > 0 {
+				var endHeredocPos = indexAt(text[endPos:], heredocTerminator, 0)
+				nChars = len(heredocTerminator)
+				endPos += endHeredocPos
+			} else {
+				endPos = len(text)
+			}
+		}
+
+		var textBetweenBrackets = string(text[state.Pos:endPos])
+		switch tokenClass {
+		case rakuPodDeclaration:
+			state.Groups[3] = ""
+			state.Groups[4] = ""
+			state.Groups[5] = textBetweenBrackets
+			state.Groups[6] = string(closingChars)
+		case rakuPod:
+			state.Groups[6] = textBetweenBrackets
+			state.Groups[7] = string(closingChars)
+		case rakuQuote:
+			state.Groups[7] = ""
+			state.Groups[8] = ""
+			if len(heredocTerminator) > 0 {
+				// Length of heredoc terminator + closing chars + `;`
+				var heredocFristPunctuationLen = len(heredocTerminator) + len(openingChars) + 1
+
+				state.Groups[6] = string(openingChars) +
+					string(text[state.Pos:state.Pos+heredocFristPunctuationLen])
+
+				state.Groups[9] =
+					string(text[state.Pos+heredocFristPunctuationLen : endPos])
+
+				state.Groups[10] = string(heredocTerminator)
+			} else {
+				state.Groups[9] = textBetweenBrackets
+				state.Groups[10] = string(closingChars)
+			}
+		case rakuNameAttribute:
+			state.Groups[4] = textBetweenBrackets
+			state.Groups[5] = string(closingChars)
+		default:
+			state.Groups = []string{state.Groups[0] + string(text[state.Pos:endPos+nChars])}
+		}
+
+		state.Pos = endPos + nChars
+
+		return nil
+	}
+}
+
+type RakuFormatterRules struct {
+	pop, formatter *CompiledRule
+}
+
+// Pop from the pod_formatter_stack and reformat the pod code
+func podFormatterPopper(state *LexerState) error {
+	var stack, ok = state.Get("pod_formatter_stack").([]RakuFormatterRules)
+
+	if ok && len(stack) > 0 {
+		// Pop from stack
+		stack = stack[:len(stack)-1]
+		state.Set("pod_formatter_stack", stack)
+		// Call podFormatter to use the last formatter rules
+		err := podFormatter(state)
+		if err != nil {
+			panic(err)
+		}
+	}
+
+	return nil
+}
+
+// Use the rules from pod_formatter_stack to format the pod code
+func podFormatter(state *LexerState) error {
+	var stack, ok = state.Get("pod_formatter_stack").([]RakuFormatterRules)
+	if ok && len(stack) > 0 {
+		var rules = stack[len(stack)-1]
+		state.Rules["pod-formatter"][0] = rules.pop
+		state.Rules["pod-formatter"][len(state.Rules["pod-formatter"])-1] = rules.formatter
+	}
+
+	return nil
+}
+
+type RulePosition int
+
+const (
+	topRule RulePosition = iota + 1000
+	bottomRule
+)
+
+type RuleMakingConfig struct {
+	delimiter              []rune
+	pattern                string
+	tokenType              TokenType
+	mutator                Mutator
+	rulePosition           RulePosition
+	state                  *LexerState
+	stateName              string
+	pushToStack            bool
+	numberOfDelimiterChars int
+}
+
+// Makes compiled rules and returns them, If rule position is given, rules are added to the state
+// If pushToStack is true, state name will be added to the state stack
+func makeRuleAndPushMaybe(config RuleMakingConfig) *CompiledRule {
+	var rePattern string
+	if len(config.delimiter) > 0 {
+		var delimiter = strings.Repeat(string(config.delimiter), config.numberOfDelimiterChars)
+		rePattern = regexp2.Escape(delimiter)
+	} else {
+		rePattern = config.pattern
+	}
+	var regex = regexp2.MustCompile(rePattern, regexp2.None)
+
+	var cRule = &CompiledRule{
+		Rule:   Rule{rePattern, config.tokenType, config.mutator},
+		Regexp: regex,
+	}
+	var state = config.state
+	var stateName = config.stateName
+	switch config.rulePosition {
+	case topRule:
+		state.Rules[stateName] =
+			append([]*CompiledRule{cRule}, state.Rules[stateName][1:]...)
+	case bottomRule:
+		state.Rules[stateName] =
+			append(state.Rules[stateName][:len(state.Rules[stateName])-1], cRule)
+	}
+
+	// Push state name to stack if asked
+	if config.pushToStack {
+		state.Stack = append(state.Stack, config.stateName)
+	}
+
+	return cRule
+}
+
+// Emitter for colon pairs, changes token state based on key and brackets
+func colonPair(tokenClass TokenType) Emitter {
+	return EmitterFunc(func(groups []string, lexer Lexer) Iterator {
+		iterators := []Iterator{}
+		tokens := []Token{
+			{Punctuation, groups[1]},
+			{Punctuation, groups[3]},
+			{Punctuation, groups[5]},
+		}
+
+		// Append colon
+		iterators = append(iterators, Literator(tokens[0]))
+
+		if tokenClass == NameAttribute {
+			iterators = append(iterators, Literator(Token{NameAttribute, groups[2]}))
+		} else {
+			var keyTokenState string
+			var keyre = regexp.MustCompile(`^\d+$`)
+			if keyre.MatchString(groups[2]) {
+				keyTokenState = "common"
+			} else {
+				keyTokenState = "Q"
+			}
+
+			// Use token state to Tokenise key
+			if keyTokenState != "" {
+				var iterator, err = lexer.Tokenise(
+					&TokeniseOptions{
+						State:  keyTokenState,
+						Nested: true,
+					}, groups[2])
+
+				if err != nil {
+					panic(err)
+				} else {
+					// Append key
+					iterators = append(iterators, iterator)
+				}
+			}
+		}
+
+		// Append punctuation
+		iterators = append(iterators, Literator(tokens[1]))
+
+		var valueTokenState string
+
+		switch groups[3] {
+		case "(", "{", "[":
+			valueTokenState = "root"
+		case "<<", "«":
+			valueTokenState = "ww"
+		case "<":
+			valueTokenState = "Q"
+		}
+
+		// Use token state to Tokenise value
+		if valueTokenState != "" {
+			var iterator, err = lexer.Tokenise(
+				&TokeniseOptions{
+					State:  valueTokenState,
+					Nested: true,
+				}, groups[4])
+
+			if err != nil {
+				panic(err)
+			} else {
+				// Append value
+				iterators = append(iterators, iterator)
+			}
+		}
+		iterators = append(iterators, Literator(tokens[2]))
+
+		return Concaterator(iterators...)
+	})
+}
+
+// Emitter for quoting constructs, changes token state based on quote name and adverbs
+func quote(groups []string, lexer Lexer) Iterator {
+	iterators := []Iterator{}
+	tokens := []Token{
+		{Keyword, groups[1]},
+		{StringAffix, groups[2]},
+		{Text, groups[3]},
+		{StringAffix, groups[4]},
+		{Text, groups[5]},
+		{Punctuation, groups[6]},
+		{Punctuation, groups[10]},
+	}
+
+	var tokenStates []string
+
+	// Set tokenStates based on adverbs
+	var adverbs = strings.Split(groups[4], ":")
+	for _, adverb := range adverbs {
+		switch adverb {
+		case "c", "closure":
+			tokenStates = append(tokenStates, "Q-closure")
+		case "qq":
+			tokenStates = append(tokenStates, "qq")
+		case "ww":
+			tokenStates = append(tokenStates, "ww")
+		case "s", "scalar", "a", "array", "h", "hash", "f", "function":
+			tokenStates = append(tokenStates, "Q-variable")
+		}
+	}
+
+	// Append all tokens before dealing with the main string
+	iterators = append(iterators, Literator(tokens[:6]...))
+
+	var tokenState string
+
+	switch {
+	case groups[1] == "qq" || contains(tokenStates, "qq"):
+		tokenState = "qq"
+	case groups[2] == "ww" || contains(tokenStates, "ww"):
+		tokenState = "ww"
+	case contains(tokenStates, "Q-closure") && contains(tokenStates, "Q-variable"):
+		tokenState = "qq"
+	case contains(tokenStates, "Q-closure"):
+		tokenState = "Q-closure"
+	case contains(tokenStates, "Q-variable"):
+		tokenState = "Q-variable"
+	default:
+		tokenState = "Q"
+	}
+
+	var iterator, err = lexer.Tokenise(
+		&TokeniseOptions{
+			State:  tokenState,
+			Nested: true,
+		}, groups[9])
+
+	if err != nil {
+		panic(err)
+	} else {
+		iterators = append(iterators, iterator)
+	}
+
+	// Append the last punctuation
+	iterators = append(iterators, Literator(tokens[6]))
+
+	return Concaterator(iterators...)
+}
+
+// Emitter for pod config, tokenises the properties with "colon-pair-attribute" state
+func podConfig(groups []string, lexer Lexer) Iterator {
+	// Tokenise pod config
+	var iterator, err = lexer.Tokenise(
+		&TokeniseOptions{
+			State:  "colon-pair-attribute",
+			Nested: true,
+		}, groups[0])
+
+	if err != nil {
+		panic(err)
+	} else {
+		return iterator
+	}
+}
+
+// Emitter for pod code, tokenises the code based on the lang specified
+func podCode(groups []string, lexer Lexer) Iterator {
+	iterators := []Iterator{}
+	tokens := []Token{
+		{Keyword, groups[1]},
+		{Keyword, groups[2]},
+		{Keyword, groups[3]},
+		{Keyword, groups[4]},
+		{StringDoc, groups[6]},
+		{Keyword, groups[7]},
+		{Keyword, groups[8]},
+		{Keyword, groups[9]},
+		{Keyword, groups[10]},
+	}
+
+	// Append all tokens before dealing with the pod config
+	iterators = append(iterators, Literator(tokens[:4]...))
+
+	// Tokenise pod config
+	iterators = append(iterators, podConfig([]string{groups[5]}, lexer))
+
+	var langMatch = regexp.MustCompile(`:lang\W+(\w+)`).FindStringSubmatch(groups[5])
+	var lang string
+	if len(langMatch) > 1 {
+		lang = langMatch[1]
+	}
+
+	// Tokenise code based on lang property
+	var sublexer = internal.Get(lang)
+	if sublexer != nil {
+		var codeIterator, codeIteratorError = sublexer.Tokenise(nil, groups[6])
+
+		if codeIteratorError != nil {
+			panic(codeIteratorError)
+		} else {
+			iterators = append(iterators, codeIterator)
+		}
+	} else {
+		iterators = append(iterators, Literator(tokens[4]))
+	}
+
+	// Append the rest of the tokens
+	iterators = append(iterators, Literator(tokens[5:]...))
+
+	return Concaterator(iterators...)
+}
diff --git a/lexers/s/solidity.go b/lexers/s/solidity.go
index b0682ff..62a3a40 100644
--- a/lexers/s/solidity.go
+++ b/lexers/s/solidity.go
@@ -39,17 +39,16 @@ func solidityRules() Rules {
 			{`/[*][\w\W]*`, CommentMultiline, nil},
 		},
 		"keywords-other": {
-			{Words(``, `\b`, `for`, `in`, `while`, `do`, `break`, `return`, `returns`, `continue`, `if`, `else`, `throw`, `new`, `delete`), Keyword, nil},
+			{Words(``, `\b`, `for`, `in`, `while`, `do`, `break`, `return`, `returns`, `continue`, `if`, `else`, `try`, `catch`, `throw`, `_`, `new`, `delete`, `is`, `as`, `from`, `memory`, `storage`), Keyword, nil},
 			{`assembly\b`, Keyword, Push("assembly")},
-			{Words(``, `\b`, `contract`, `interface`, `enum`, `event`, `function`, `library`, `mapping`, `modifier`, `struct`, `var`), KeywordDeclaration, nil},
+			{`(contract|interface|enum|event|struct)(\s+)([a-zA-Z_]\w*)`, ByGroups(KeywordDeclaration, Text, NameClass), nil},
+			{`(function|modifier)(\s+)([a-zA-Z_]\w*)`, ByGroups(KeywordDeclaration, Text, NameFunction), nil},
+			{Words(``, `\b`, `contract`, `interface`, `enum`, `event`, `constructor`, `function`, `library`, `mapping`, `modifier`, `struct`, `var`), KeywordDeclaration, nil},
+			{Words(``, `\b`, `abstract`, `external`, `internal`, `private`, `public`), Keyword, nil},
+			{Words(``, `\b`, `anonymous`, `constant`, `immutable`, `indexed`, `override`, `payable`, `pure`, `view`, `virtual`), Keyword, nil},
 			{`(import|using)\b`, KeywordNamespace, nil},
-			{`pragma (solidity|experimental)\b`, KeywordReserved, nil},
-			{`(_|as|constant|default|from|is)\b`, KeywordReserved, nil},
-			{`payable\b`, KeywordReserved, nil},
-			{`(memory|storage)\b`, KeywordReserved, nil},
-			{`(external|internal|private|public)\b`, KeywordReserved, nil},
-			{`(anonymous|indexed)\b`, KeywordReserved, nil},
-			{`(abstract|pure|static|view)\b`, KeywordReserved, nil},
+			{`pragma (solidity|experimental)\b`, Keyword, nil},
+			{Words(``, `\b`, `after`, `alias`, `apply`, `auto`, `case`, `copyof`, `default`, `define`, `final`, `implements`, `inline`, `let`, `macro`, `match`, `mutable`, `null`, `of`, `partial`, `promise`, `reference`, `relocatable`, `sealed`, `sizeof`, `static`, `supports`, `switch`, `typedef`, `typeof`, `unchecked`), KeywordReserved, nil},
 			{`(true|false)\b`, KeywordConstant, nil},
 			{`(wei|finney|szabo|ether)\b`, KeywordConstant, nil},
 			{`(seconds|minutes|hours|days|weeks|years)\b`, KeywordConstant, nil},
@@ -99,15 +98,20 @@ func solidityRules() Rules {
 			{`\+\+|--|\*\*|\?|:|~|&&|\|\||=>|==?|!=?|(<<|>>>?|[-<>+*%&|^/])=?`, Operator, nil},
 			{`[{(\[;,]`, Punctuation, nil},
 			{`[})\].]`, Punctuation, nil},
-			{`(block|msg|now|this|super|tx)\b`, NameBuiltin, nil},
-			{`(sender|origin)\b`, NameBuiltin, nil},
-			{`(gas|value)\b`, NameBuiltin, nil},
+			{`(abi|block|msg|tx)\b`, NameBuiltin, nil},
+			{`(?!abi\.)(decode|encode|encodePacked|encodeWithSelector|encodeWithSignature|encodeWithSelector)\b`, NameBuiltin, nil},
+			{`(?!block\.)(chainid|coinbase|difficulty|gaslimit|number|timestamp)\b`, NameBuiltin, nil},
+			{`(?!msg\.)(data|gas|sender|value)\b`, NameBuiltin, nil},
+			{`(?!tx\.)(gasprice|origin)\b`, NameBuiltin, nil},
+			{`(type)(\()([a-zA-Z_]\w*)(\))`, ByGroups(NameBuiltin, Punctuation, NameClass, Punctuation), nil},
+			{`(?!type\([a-zA-Z_]\w*\)\.)(creationCode|interfaceId|max|min|name|runtimeCode)\b`, NameBuiltin, nil},
+			{`(now|this|super|gasleft)\b`, NameBuiltin, nil},
 			{`(selfdestruct|suicide)\b`, NameBuiltin, nil},
-			{`(balance|send|transfer)\b`, NameBuiltin, nil},
+			{`(?!0x[0-9a-fA-F]+\.)(balance|code|codehash|send|transfer)\b`, NameBuiltin, nil},
 			{`(assert|revert|require)\b`, NameBuiltin, nil},
 			{`(call|callcode|delegatecall)\b`, NameBuiltin, nil},
 			{`selector\b`, NameBuiltin, nil},
-			{`(addmod|ecrecover|keccak256|mulmod|ripemd160|sha256|sha3)\b`, NameFunction, nil},
+			{`(addmod|blockhash|ecrecover|keccak256|mulmod|ripemd160|sha256|sha3)\b`, NameBuiltin, nil},
 			{`[a-zA-Z_]\w*`, Name, nil},
 		},
 	}
diff --git a/lexers/s/svelte.go b/lexers/s/svelte.go
new file mode 100644
index 0000000..1f91a21
--- /dev/null
+++ b/lexers/s/svelte.go
@@ -0,0 +1,73 @@
+package s
+
+import (
+	. "github.com/alecthomas/chroma" // nolint
+	"github.com/alecthomas/chroma/lexers/h"
+	"github.com/alecthomas/chroma/lexers/internal"
+	"github.com/alecthomas/chroma/lexers/t"
+)
+
+// Svelte lexer.
+var Svelte = internal.Register(DelegatingLexer(h.HTML, MustNewLazyLexer(
+	&Config{
+		Name:      "Svelte",
+		Aliases:   []string{"svelte"},
+		Filenames: []string{"*.svelte"},
+		MimeTypes: []string{"application/x-svelte"},
+		DotAll:    true,
+	},
+	svelteRules,
+)))
+
+func svelteRules() Rules {
+	return Rules{
+		"root": {
+			// Let HTML handle the comments, including comments containing script and style tags
+			{`<!--`, Other, Push("comment")},
+			{
+				// Highlight script and style tags based on lang attribute
+				// and allow attributes besides lang
+				`(<\s*(?:script|style).*?lang\s*=\s*['"])` +
+					`(.+?)(['"].*?>)` +
+					`(.+?)` +
+					`(<\s*/\s*(?:script|style)\s*>)`,
+				UsingByGroup(internal.Get, 2, 4, Other, Other, Other, Other, Other),
+				nil,
+			},
+			{
+				// Make sure `{` is not inside script or style tags
+				`(?<!<\s*(?:script|style)(?:(?!(?:script|style)\s*>).)*?)` +
+					`{` +
+					`(?!(?:(?!<\s*(?:script|style)).)*?(?:script|style)\s*>)`,
+				Punctuation,
+				Push("templates"),
+			},
+			// on:submit|preventDefault
+			{`(?<=\s+on:\w+(?:\|\w+)*)\|(?=\w+)`, Operator, nil},
+			{`.+?`, Other, nil},
+		},
+		"comment": {
+			{`-->`, Other, Pop(1)},
+			{`.+?`, Other, nil},
+		},
+		"templates": {
+			{`}`, Punctuation, Pop(1)},
+			// Let TypeScript handle strings and the curly braces inside them
+			{`(?<!(?<!\\)\\)(['"` + "`])" + `.*?(?<!(?<!\\)\\)\1`, Using(t.TypeScript), nil},
+			// If there is another opening curly brace push to templates again
+			{"{", Punctuation, Push("templates")},
+			{`@(debug|html)\b`, Keyword, nil},
+			{
+				`(#await)(\s+)(\w+)(\s+)(then|catch)(\s+)(\w+)`,
+				ByGroups(Keyword, Text, Using(t.TypeScript), Text,
+					Keyword, Text, Using(t.TypeScript),
+				),
+				nil,
+			},
+			{`(#|/)(await|each|if|key)\b`, Keyword, nil},
+			{`(:else)(\s+)(if)?\b`, ByGroups(Keyword, Text, Keyword), nil},
+			{`:(catch|then)\b`, Keyword, nil},
+			{`[^{}]+`, Using(t.TypeScript), nil},
+		},
+	}
+}
diff --git a/pygments-lexers.txt b/pygments-lexers.txt
index 9c9ced2..bf4d9de 100644
--- a/pygments-lexers.txt
+++ b/pygments-lexers.txt
@@ -2,9 +2,6 @@ Generated with:
 
   g 'class.*RegexLexer' | pawk --strict -F: '"pygments.lexers.%s.%s" % (f[0].split(".")[0], f[2].split()[1].split("(")[0])' > lexers.txt
 
-perl6:
-  Requires a bunch of helpers that I do not have the time to convert.
-
 kotlin:
   invalid unicode escape sequences
   FIXED: Have to disable wide Unicode characters in unistring.py


Test patch:
diff --git a/lexers/testdata/markdown.actual b/lexers/testdata/markdown.actual
index 146ae3c..3673c15 100644
--- a/lexers/testdata/markdown.actual
+++ b/lexers/testdata/markdown.actual
@@ -4,18 +4,20 @@
 
 Multiple **bold** on the **same line**.
 
+Multiple _italic_ on the *same_line*.
+
 ## user defined function in cql
 
 ```javascript
-  column.substring(0,num) 
+  column.substring(0,num)
 ```
 
 ```cql
 CREATE FUNCTION IF NOT EXISTS cycling.left (column TEXT,num int)
 RETURNS NULL ON NULL INPUT
 RETURNS text
-LANGUAGE javascript AS $$ 
-  column.substring(0,num) 
+LANGUAGE javascript AS $$
+  column.substring(0,num)
 $$;
 
 CREATE OR REPLACE FUNCTION cycling.fLog (input double)
@@ -34,7 +36,7 @@ CREATE TABLE emp (
   last_user text
 );
 
-select 
+select
   $my_tag$aoeuaoeu$my_tag$ as blah
 ;
 
diff --git a/lexers/testdata/markdown.expected b/lexers/testdata/markdown.expected
index e4506d6..d4b09cc 100644
--- a/lexers/testdata/markdown.expected
+++ b/lexers/testdata/markdown.expected
@@ -16,6 +16,10 @@
   {"type":"GenericStrong","value":"**bold**"},
   {"type":"Text","value":" on the "},
   {"type":"GenericStrong","value":"**same line**"},
+  {"type":"Text","value":".\n\nMultiple "},
+  {"type":"GenericEmph","value":"_italic_"},
+  {"type":"Text","value":" on the "},
+  {"type":"GenericEmph","value":"*same_line*"},
   {"type":"Text","value":".\n\n"},
   {"type":"GenericSubheading","value":"## user defined function in cql\n"},
   {"type":"Text","value":"\n"},
@@ -29,7 +33,7 @@
   {"type":"Punctuation","value":","},
   {"type":"NameOther","value":"num"},
   {"type":"Punctuation","value":")"},
-  {"type":"Text","value":" \n"},
+  {"type":"Text","value":"\n"},
   {"type":"LiteralString","value":"```"},
   {"type":"Text","value":"\n\n"},
   {"type":"LiteralString","value":"```cql\n"},
@@ -78,7 +82,7 @@
   {"type":"Keyword","value":"AS"},
   {"type":"TextWhitespace","value":" "},
   {"type":"LiteralStringHeredoc","value":"$$"},
-  {"type":"Text","value":" \n  "},
+  {"type":"Text","value":"\n  "},
   {"type":"NameOther","value":"column"},
   {"type":"Punctuation","value":"."},
   {"type":"NameOther","value":"substring"},
@@ -87,7 +91,7 @@
   {"type":"Punctuation","value":","},
   {"type":"NameOther","value":"num"},
   {"type":"Punctuation","value":")"},
-  {"type":"Text","value":" \n"},
+  {"type":"Text","value":"\n"},
   {"type":"LiteralStringHeredoc","value":"$$"},
   {"type":"Punctuation","value":";"},
   {"type":"TextWhitespace","value":"\n\n"},
@@ -191,7 +195,7 @@
   {"type":"Punctuation","value":");"},
   {"type":"Text","value":"\n\n"},
   {"type":"Keyword","value":"select"},
-  {"type":"Text","value":" \n  "},
+  {"type":"Text","value":"\n  "},
   {"type":"LiteralStringHeredoc","value":"$my_tag$aoeuaoeu$my_tag$"},
   {"type":"Text","value":" "},
   {"type":"Keyword","value":"as"},
diff --git a/lexers/testdata/raku.actual b/lexers/testdata/raku.actual
new file mode 100644
index 0000000..fd1aa98
--- /dev/null
+++ b/lexers/testdata/raku.actual
@@ -0,0 +1,390 @@
+#!/usr/bin/env raku
+
+=begin pod
+=head1 Some test data for B<Chroma>
+
+=begin code :lang<go>
+fmt.Println("Hello from Go")
+=end code
+
+=for defn :numbered
+               We
+               Need
+               Numbers
+
+=end pod
+
+say $=pod[0].config<numbered>;
+
+#| Fibonacci with Multiple dispatch
+multi sub fib (0 --> 0) {}
+multi sub fib (1 --> 1) {}
+multi sub fib (\n where * > 1) {
+    fib(n - 1) + fib(n - 2)
+}
+say fib 10;
+# OUTPUT: 55
+
+#| C<Shape> role
+role Shape {
+    method area { ... }
+
+    method print_area {
+        say "Area of {self.^name} is {self.area}.";
+    }
+}
+
+class Rectangle does Shape {
+    has $.width is required;
+    has $.height is required;
+
+    method area {
+        $!width * $!height
+    }
+}
+
+Rectangle.new(width => 5, height => 7).print_area;
+
+# Inifinite and lazy list
+my @fib = 0, 1, * + * ... ∞;
+say @fib[^11];
+# OUTPUT: (0 1 1 2 3 5 8 13 21 34 55)
+
+# Feed operator
+@fib[^20] ==> grep(&is-prime) ==> say();
+# OUTPUT: (2 3 5 13 89 233 1597)
+
+# Function composition
+my &reverse_primes = &reverse ∘ &grep.assuming(&is-prime);
+say reverse_primes ^20;
+# OUTPUT: (19 17 13 11 7 5 3 2)
+
+my @a = 1..4;
+my @b = 'a'..'d';
+# Zip two lists using Z meta operator
+say @a Z @b;
+# OUTPUT: ((1 a) (2 b) (3 c) (4 d))
+say @a Z=> @b;
+# OUTPUT: (1 => a 2 => b 3 => c 4 => d)
+say [\R<] 1, 5, 6;
+
+# Hyper Operators
+say @b «~» @a;
+# OUTPUT: [a1 b2 c3 d4]
+
+# Junctions
+say 'Find all the words starting with a lowercase vowel'.words.grep: *.starts-with: any <a e i o u>;
+
+sub MAIN(
+    Str   $file where *.IO.f = 'file.dat',  #= an existing file to frobnicate
+    Int  :size(:$length) = 24,              #= length/size needed for frobnication
+    Bool :$verbose,                         #= required verbosity
+) {
+    say $length if $length.defined;
+    say $file   if $file.defined;
+    say 'Verbosity ', ($verbose ?? 'on' !! 'off');
+}
+
+#|｢[
+INI Parser
+C<SomeCode>
+=head1 heading
+]｣
+grammar INIParser {
+    token TOP { <block> <section>* }
+    token section { <header> <block> }
+    token header { '[' ~ ']' \w+ \n+ }
+    token block { [<pair> | <comment>]* }
+    rule pair { <key> '=' <value> }
+    token comment { ';' \N* \n+ }
+    token key { \w+ }
+    token value { <-[\n ;]>+ }
+}
+
+my $match = INIParser.parse: q:to/END/;
+; Comment
+key1=value1
+key2 = value2
+
+; Section 1
+[section1]
+key3=value3
+END
+
+
+say $match<block><pair>[0]<value>;
+# OUTPUT: ｢value1｣
+
+say $match<section>[0]<block><pair>[0]<value>;
+# OUTPUT: ｢value3｣
+
+# Promise
+my $promise = start {
+    my $i = 0;
+    for 1 .. 10 {
+        $i += $_
+    }
+    $i
+}
+my $result = await $promise;
+say $result;
+# OUTPUT: 55
+
+# Supply
+my $bread-supplier = Supplier.new;
+my $vegetable-supplier = Supplier.new;
+
+my $supply = supply {
+    whenever $bread-supplier.Supply {
+        emit("We've got bread: " ~ $_);
+    };
+    whenever $vegetable-supplier.Supply {
+        emit("We've got a vegetable: " ~ $_);
+    };
+}
+$supply.tap(-> $v { say "$v" });
+
+$vegetable-supplier.emit("Radish");
+# OUTPUT: «We've got a vegetable: Radish␤»
+$bread-supplier.emit("Thick sliced");
+# OUTPUT: «We've got bread: Thick sliced␤»
+$vegetable-supplier.emit("Lettuce");
+# OUTPUT: «We've got a vegetable: Lettuce␤»
+
+say (1, 2, 3) »+« (4, 5, 6);
+say (1, 2, 3, 4) »~» <a b>;
+say (&sin, &cos, &sqrt)».(0.5);
+say (<a b>, <c d e>)».&{ .elems };
+say << '>>' >>;
+say "stuff here!!!".subst(:g, /<</, '|');
+my @array = <<an 'array of' {"many"} items>>;
+
+say [1,2,3] (&) [2,5,7];
+say [1,2,3] ∩ [2,5,7];
+say 2 =:= 3;
+say [1,2,3] Z [4,5,6];
+[1,2,3] RZ[=>] [4,5,6];
+
+rx/:i
+        \w+ # some comment
+        'text'
+        \d ** 2..5
+        "double quotes!"
+        <alnum>
+        <:N + alpha>+
+        <{1 + 2}>
+        <:madeup>
+        '[' \w+ ']' || \S+ \s* '=' \s* \S*
+        || '[' \w+ ']'
+        || \S+ \s* '=' \s* \S*
+        <:Script('Latin')>
+        <:Block<Basic Latin>>
+        if | if <.ws> else $0
+        <:Lu+:N>
+        < f fo foo food >
+        <:L + :!N>
+        <[ a .. c 1 2 3 ]>*
+        @variable
+        <[\d] - [13579]>
+        <?before a $0> && .
+        <:Zs + [\x9] - [\xA0]>
+        ^ raku $
+        ^ raku$
+        [^raku$|something$]else$
+        <[ \x[00C0] .. \x[00C6] ]>*
+        two<|w>\-<|w>words
+        <[\c[GREEK SMALL LETTER ALPHA]..\c[GREEK SMALL LETTER GAMMA]]>*
+        two<!|w><!|w>words
+        << br >>
+        own »
+        ^^ <?alnum> \d+
+        ^^ \d+ <!:Script<Tamil>>
+        abc <?[ d..f ]>
+        abc <?@some-array>
+        <?after ^^ | "." \s+> <:Lu>\S+
+        [ ab || cbc ]
+        (a || b)+
+        [a||b] (c)
+        (\d) ($0)
+        (\d) {} :my $c = $0; ($c)
+        :my $counter = 0; ( \V* { ++$counter } ) *%% \n
+        (a) b {} :my $c2 = $/;
+        test
+        (a) {say "Check so far ", ~$/} b :my $c3 = ~$0;
+        { say 'hi' }
+
+        $<myname> = [ \w+ ]
+
+        $<string>=( [ $<part>=[abc] ]* % '-' )
+        $<variable>=\w+ '=' $<value>=\w+
+        a <( b )> c
+        <(a <( b )> c)>
+        '(' ~ ')' <expression>
+        $<OPEN> = '(' <SETGOAL: ')'> <some-expression> [ $GOAL || <FAILGOAL> ]
+        <?> ~ ')' \d+
+        '(' <-[()]>* ')' || '('[ <-[()]>* <~~> <-[()]>* ]* ')'
+        @<named-regex>=<.ident>
+        <.named-regex>
+        <&named-regex>
+        <someregex('a')>
+        <capture-name=named-regex>
+        <capture-name=named-regex(2)>
+        <$test>
+        <@test>
+        $(1 + 2; $test)
+        $pattern3.flip # Nil
+        "$pattern3.flip()"
+        $([~] $pattern3.comb.reverse)
+        @(%h.keys)
+        \d ** 1..3 <?{ $/.Int <= 255 && $/.Int >= 0 }>
+        $/;
+
+constant \something:some<adverb> = 'something';
+
+my %hash = %(
+    query => something,
+    qq => 'something',
+    :23year,
+    m => $test,
+    :yes,
+    :!yes,
+    (Less) => $test,
+);
+
+my %hash2 = %(
+    :query(something),
+    :qq<something>,
+    :m(something),
+    :23('a'),
+    :test<something>,
+    :query1{1 + 2}
+    :list[1,2,3]
+);
+
+=for comment
+some comment
+
+=table
+  |col|
+  |row|
+
+say Q[｢some $text｣];
+say qq｢｢some $regex text｣｣;
+say qww｢｢some $variable 'some text' text｣｣;
+say q:ww｢｢some $variable 'some text' text｣｣;
+say q:w｢｢some $variable 'some text' text｣｣;
+say qq:w｢｢some $regex 'some text' text｣｣;
+say Q:c｢｢some $regex 'some text' { 2 + 1 } text｣｣;
+say q:a｢｢some @array 'some text' { 2 + 1 } text｣｣;
+say Q:a:c｢｢some @array 'some text' { 2 + 1 } text｣｣;
+Q[some \qq[$variable.method()] testing]
+Q:a:c[some \qq[$variable.method()] testing]
+say Q:c:h｢Testing {'toasting'} %h<one>｣;
+say Q:c:h｢Testing {'toasting'} %h<one><two>｣;
+say Q:c:h｢Testing {'toasting'} %h<<one>>｣;
+say Q:c:h｢Testing {'toasting'} %h«one»｣;
+say Q:b[Testing];
+'some \qq[$variable.method()] testing';
+'somes\' testing';
+"some \qq[$variable.method()] testing";
+"some $variable.method() testing";
+"some $variable:some<adverb>.method() testing";
+"some $variable:some('adverb').method() testing";
+"some func() testing";
+"some func:some<adverb>() testing";
+say "Something foo(2) $a.succ(2+3, $some_variable) $a.some-method()  @more $_.Str(2) $_: { $_ * 2 }";
+
+#`[[
+multiline comment]
+]]
+
+my $regex = /'match' \s* <[:-]> \s* \w 'something'/;
+
+say S/some/a/ given $text;
+say s/some/a/;
+say S%some%a% given $text;
+say $text ~~ s/(some) \d+ $<var>=<alnum>/a $0/;
+say $text ~~ s:Pos(2)/(some)/$0/;
+say $text ~~ s%some%a%;
+say $text ~~ s%s(.)me%a$0%;
+say $text ~~ s:r/some/a/;
+say $text ~~ m/^text [:i \d+]$/;
+say $text ~~ m:s/^<{2+5}>$/;
+say $text ~~ m%^text$%;
+say $text ~~ /^text$/;
+say $text ~~ tr/abcde/12345/;
+s{\w+} = 'test';
+
+say 1+1i;
+
+CATCH {
+    when X::AdHoc {}
+    when CX::Warn {}
+}
+
+say Q:heredoc｢FINISH｣;
+some long
+text
+here.
+FINISH
+
+$*IN.lines.first: { .say and .so with %a{.Int cmp n}}
+
+#| Grammar C<G>
+grammar G {
+    rule TOP { <function-define> }
+    rule function-define {
+        :my \var = 'something';
+        'sub' <identifier>
+        {
+            say "func " ~ $<identifier>.made;
+            make $<identifier>.made;
+        }
+        '(' <parameter> ')' '{' '}'
+        { say "end " ~ $/.made; }
+    }
+    token identifier { \w+ { make ~$/; } }
+    token parameter { \w+ { say "param " ~ $/; } }
+    token token { \w+ { say "param " ~ $/; } }
+}
+
+use Some::Module;
+use Some::Module:auth<author>:ver(v1.0.0);
+
+notes $trip: "Almost there";
+
+LABEL:
+for <a b c> {
+}
+
+#|[[
+multiline pod declaration]
+]]
+
+grammar Calculator {
+    token TOP { <calc-op> }
+
+    proto rule calc-op          {*}
+    proto rule calc-op($a)          {*}
+    rule calc-op:sym<add> { <num> '+' <num> }
+    rule calc-op:sym<add> { <num> ':' '+' <num> }
+    rule calc-op:sym<sub>($a) { <num> '-' <num> }
+
+    token num { \d+ }
+}
+
+class Calculations {
+    method TOP              ($/) { make $<calc-op>.made; }
+    method calc-op:sym<add> ($/) { make [+] $<num>; }
+    method calc-op:sym<sub> ($/) { make [-] $<num>; }
+    method calc-op:sym<sub>($/) { make [-] $<num>; }
+    method calc-op:sym($/) { make [-] $<num>; }
+    method calc-op:sym<sub> { make [-] $<num>; }
+}
+
+say Calculator.parse('2 + 3', actions => Calculations).made;
+
+=finish
+C<say> Date.today.year;
+# Output: 2020
+B<say> Date.today.later(:2years).year;
\ No newline at end of file
diff --git a/lexers/testdata/raku.expected b/lexers/testdata/raku.expected
new file mode 100644
index 0000000..e3bcbf5
--- /dev/null
+++ b/lexers/testdata/raku.expected
@@ -0,0 +1,3204 @@
+[
+  {"type":"CommentHashbang","value":"#!/usr/bin/env raku"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"Keyword","value":"=begin"},
+  {"type":"Comment","value":" "},
+  {"type":"Keyword","value":"pod"},
+  {"type":"LiteralStringDoc","value":"\n"},
+  {"type":"Keyword","value":"=head1"},
+  {"type":"GenericHeading","value":" Some test data for "},
+  {"type":"Keyword","value":"B"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"GenericStrong","value":"Chroma"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"GenericHeading","value":"\n"},
+  {"type":"LiteralStringDoc","value":"\n"},
+  {"type":"Keyword","value":"=begin code"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":":"},
+  {"type":"NameAttribute","value":"lang"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"LiteralString","value":"go"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":"\n"},
+  {"type":"NameOther","value":"fmt"},
+  {"type":"Punctuation","value":"."},
+  {"type":"NameFunction","value":"Println"},
+  {"type":"Punctuation","value":"("},
+  {"type":"LiteralString","value":"\"Hello from Go\""},
+  {"type":"Punctuation","value":")"},
+  {"type":"Text","value":"\n"},
+  {"type":"Keyword","value":"=end code"},
+  {"type":"LiteralStringDoc","value":"\n\n"},
+  {"type":"Keyword","value":"=for"},
+  {"type":"LiteralStringDoc","value":" "},
+  {"type":"Keyword","value":"defn"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":":"},
+  {"type":"NameAttribute","value":"numbered"},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralStringDoc","value":"               We\n               Need\n               Numbers\n\n"},
+  {"type":"Keyword","value":"=end pod"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$=pod"},
+  {"type":"Punctuation","value":"["},
+  {"type":"LiteralNumberInteger","value":"0"},
+  {"type":"Punctuation","value":"]"},
+  {"type":"Operator","value":"."},
+  {"type":"NameBuiltin","value":"config"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"LiteralString","value":"numbered"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":";\n\n"},
+  {"type":"Keyword","value":"#| "},
+  {"type":"LiteralStringDoc","value":"Fibonacci with Multiple dispatch\n"},
+  {"type":"Keyword","value":"multi"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"sub"},
+  {"type":"Text","value":" "},
+  {"type":"NameFunction","value":"fib"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"("},
+  {"type":"LiteralNumberInteger","value":"0"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"--\u003e"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"0"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{}"},
+  {"type":"Text","value":"\n"},
+  {"type":"Keyword","value":"multi"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"sub"},
+  {"type":"Text","value":" "},
+  {"type":"NameFunction","value":"fib"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"("},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"--\u003e"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{}"},
+  {"type":"Text","value":"\n"},
+  {"type":"Keyword","value":"multi"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"sub"},
+  {"type":"Text","value":" "},
+  {"type":"NameFunction","value":"fib"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"("},
+  {"type":"Text","value":"\\"},
+  {"type":"Name","value":"n"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"where"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"*"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"\u003e"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":"\n    "},
+  {"type":"NameFunction","value":"fib"},
+  {"type":"Punctuation","value":"("},
+  {"type":"Name","value":"n"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"-"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"+"},
+  {"type":"Text","value":" "},
+  {"type":"NameFunction","value":"fib"},
+  {"type":"Punctuation","value":"("},
+  {"type":"Name","value":"n"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"-"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"2"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Text","value":"\n"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Name","value":"fib"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"10"},
+  {"type":"Text","value":";\n"},
+  {"type":"CommentSingle","value":"# OUTPUT: 55"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"Keyword","value":"#| C"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"LiteralStringOther","value":"Shape"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringDoc","value":" role\n"},
+  {"type":"Keyword","value":"role"},
+  {"type":"Text","value":" "},
+  {"type":"NameClass","value":"Shape"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Keyword","value":"method"},
+  {"type":"Text","value":" "},
+  {"type":"NameFunction","value":"area"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"..."},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n\n    "},
+  {"type":"Keyword","value":"method"},
+  {"type":"Text","value":" "},
+  {"type":"NameFunction","value":"print_area"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":"\n        "},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"\""},
+  {"type":"LiteralStringDouble","value":"Area of "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"NameBuiltin","value":"self"},
+  {"type":"Operator","value":".^"},
+  {"type":"NameBuiltin","value":"name"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"LiteralStringDouble","value":" is "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"NameBuiltin","value":"self"},
+  {"type":"Operator","value":"."},
+  {"type":"NameFunction","value":"area"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"LiteralStringDouble","value":"."},
+  {"type":"Punctuation","value":"\""},
+  {"type":"Text","value":";\n    "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"Keyword","value":"class"},
+  {"type":"Text","value":" "},
+  {"type":"NameClass","value":"Rectangle"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"does"},
+  {"type":"Text","value":" "},
+  {"type":"NameClass","value":"Shape"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Keyword","value":"has"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$.width"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"is"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"required"},
+  {"type":"Text","value":";\n    "},
+  {"type":"Keyword","value":"has"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$.height"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"is"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"required"},
+  {"type":"Text","value":";\n\n    "},
+  {"type":"Keyword","value":"method"},
+  {"type":"Text","value":" "},
+  {"type":"NameFunction","value":"area"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":"\n        "},
+  {"type":"NameVariable","value":"$!width"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"*"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$!height"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"Name","value":"Rectangle"},
+  {"type":"Operator","value":"."},
+  {"type":"NameBuiltin","value":"new"},
+  {"type":"Punctuation","value":"("},
+  {"type":"LiteralString","value":"width"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"=\u003e"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"5"},
+  {"type":"Text","value":", "},
+  {"type":"LiteralString","value":"height"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"=\u003e"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"7"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Operator","value":"."},
+  {"type":"NameFunction","value":"print_area"},
+  {"type":"Text","value":";\n\n"},
+  {"type":"CommentSingle","value":"# Inifinite and lazy list"},
+  {"type":"Text","value":"\n"},
+  {"type":"Keyword","value":"my"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"@fib"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"="},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"0"},
+  {"type":"Operator","value":","},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Operator","value":","},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"*"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"+"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"*"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"..."},
+  {"type":"Text","value":" "},
+  {"type":"NameConstant","value":"∞"},
+  {"type":"Text","value":";\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"@fib"},
+  {"type":"Punctuation","value":"["},
+  {"type":"Operator","value":"^"},
+  {"type":"LiteralNumberInteger","value":"11"},
+  {"type":"Punctuation","value":"]"},
+  {"type":"Text","value":";\n"},
+  {"type":"CommentSingle","value":"# OUTPUT: (0 1 1 2 3 5 8 13 21 34 55)"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"CommentSingle","value":"# Feed operator"},
+  {"type":"Text","value":"\n"},
+  {"type":"NameVariable","value":"@fib"},
+  {"type":"Punctuation","value":"["},
+  {"type":"Operator","value":"^"},
+  {"type":"LiteralNumberInteger","value":"20"},
+  {"type":"Punctuation","value":"]"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"==\u003e"},
+  {"type":"Text","value":" "},
+  {"type":"NameBuiltin","value":"grep"},
+  {"type":"Punctuation","value":"("},
+  {"type":"NameVariable","value":"\u0026is-prime"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"==\u003e"},
+  {"type":"Text","value":" "},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Punctuation","value":"()"},
+  {"type":"Text","value":";\n"},
+  {"type":"CommentSingle","value":"# OUTPUT: (2 3 5 13 89 233 1597)"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"CommentSingle","value":"# Function composition"},
+  {"type":"Text","value":"\n"},
+  {"type":"Keyword","value":"my"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"\u0026reverse_primes"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"="},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"\u0026reverse"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"∘"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"\u0026grep"},
+  {"type":"Operator","value":"."},
+  {"type":"NameBuiltin","value":"assuming"},
+  {"type":"Punctuation","value":"("},
+  {"type":"NameVariable","value":"\u0026is-prime"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Text","value":";\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Name","value":"reverse_primes"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"^"},
+  {"type":"LiteralNumberInteger","value":"20"},
+  {"type":"Text","value":";\n"},
+  {"type":"CommentSingle","value":"# OUTPUT: (19 17 13 11 7 5 3 2)"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"Keyword","value":"my"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"@a"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"="},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Operator","value":".."},
+  {"type":"LiteralNumberInteger","value":"4"},
+  {"type":"Text","value":";\n"},
+  {"type":"Keyword","value":"my"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"@b"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"="},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"a"},
+  {"type":"Punctuation","value":"'"},
+  {"type":"Operator","value":".."},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"d"},
+  {"type":"Punctuation","value":"'"},
+  {"type":"Text","value":";\n"},
+  {"type":"CommentSingle","value":"# Zip two lists using Z meta operator"},
+  {"type":"Text","value":"\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"@a"},
+  {"type":"Text","value":" "},
+  {"type":"OperatorWord","value":"Z"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"@b"},
+  {"type":"Text","value":";\n"},
+  {"type":"CommentSingle","value":"# OUTPUT: ((1 a) (2 b) (3 c) (4 d))"},
+  {"type":"Text","value":"\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"@a"},
+  {"type":"Text","value":" "},
+  {"type":"OperatorWord","value":"Z"},
+  {"type":"Operator","value":"=\u003e"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"@b"},
+  {"type":"Text","value":";\n"},
+  {"type":"CommentSingle","value":"# OUTPUT: (1 =\u003e a 2 =\u003e b 3 =\u003e c 4 =\u003e d)"},
+  {"type":"Text","value":"\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"["},
+  {"type":"Text","value":"\\"},
+  {"type":"OperatorWord","value":"R"},
+  {"type":"Operator","value":"\u003c"},
+  {"type":"Punctuation","value":"]"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Operator","value":","},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"5"},
+  {"type":"Operator","value":","},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"6"},
+  {"type":"Text","value":";\n\n"},
+  {"type":"CommentSingle","value":"# Hyper Operators"},
+  {"type":"Text","value":"\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"@b"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"«~»"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"@a"},
+  {"type":"Text","value":";\n"},
+  {"type":"CommentSingle","value":"# OUTPUT: [a1 b2 c3 d4]"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"CommentSingle","value":"# Junctions"},
+  {"type":"Text","value":"\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"Find all the words starting with a lowercase vowel"},
+  {"type":"Punctuation","value":"'"},
+  {"type":"Operator","value":"."},
+  {"type":"NameBuiltin","value":"words"},
+  {"type":"Operator","value":"."},
+  {"type":"NameBuiltin","value":"grep"},
+  {"type":"Operator","value":":"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"*."},
+  {"type":"NameBuiltin","value":"starts-with"},
+  {"type":"Operator","value":":"},
+  {"type":"Text","value":" "},
+  {"type":"NameBuiltin","value":"any"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"LiteralString","value":"a e i o u"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":";\n\n"},
+  {"type":"Keyword","value":"sub"},
+  {"type":"Text","value":" "},
+  {"type":"NameBuiltin","value":"MAIN"},
+  {"type":"Punctuation","value":"("},
+  {"type":"Text","value":"\n    "},
+  {"type":"NameBuiltin","value":"Str"},
+  {"type":"Text","value":"   "},
+  {"type":"NameVariable","value":"$file"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"where"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"*."},
+  {"type":"NameBuiltin","value":"IO"},
+  {"type":"Operator","value":"."},
+  {"type":"NameBuiltin","value":"f"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"="},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"file.dat"},
+  {"type":"Punctuation","value":"'"},
+  {"type":"Operator","value":","},
+  {"type":"Text","value":"  "},
+  {"type":"Keyword","value":"#= "},
+  {"type":"LiteralStringDoc","value":"an existing file to frobnicate\n"},
+  {"type":"Text","value":"    "},
+  {"type":"NameBuiltin","value":"Int"},
+  {"type":"Text","value":"  "},
+  {"type":"Punctuation","value":":"},
+  {"type":"LiteralString","value":"size"},
+  {"type":"Punctuation","value":"("},
+  {"type":"Operator","value":":"},
+  {"type":"NameVariable","value":"$length"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"="},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"24"},
+  {"type":"Operator","value":","},
+  {"type":"Text","value":"              "},
+  {"type":"Keyword","value":"#= "},
+  {"type":"LiteralStringDoc","value":"length/size needed for frobnication\n"},
+  {"type":"Text","value":"    "},
+  {"type":"NameBuiltin","value":"Bool"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":":"},
+  {"type":"NameVariable","value":"$verbose"},
+  {"type":"Operator","value":","},
+  {"type":"Text","value":"                         "},
+  {"type":"Keyword","value":"#= "},
+  {"type":"LiteralStringDoc","value":"required verbosity\n"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":"\n    "},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$length"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"if"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$length"},
+  {"type":"Operator","value":"."},
+  {"type":"NameBuiltin","value":"defined"},
+  {"type":"Text","value":";\n    "},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$file"},
+  {"type":"Text","value":"   "},
+  {"type":"Keyword","value":"if"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$file"},
+  {"type":"Operator","value":"."},
+  {"type":"NameBuiltin","value":"defined"},
+  {"type":"Text","value":";\n    "},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"Verbosity "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"Operator","value":","},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"("},
+  {"type":"NameVariable","value":"$verbose"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"??"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"on"},
+  {"type":"Punctuation","value":"'"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"!!"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"off"},
+  {"type":"Punctuation","value":"')"},
+  {"type":"Text","value":";\n"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"Keyword","value":"#|"},
+  {"type":"Punctuation","value":"｢"},
+  {"type":"LiteralStringDoc","value":"[\nINI Parser\n"},
+  {"type":"Keyword","value":"C"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"LiteralStringOther","value":"SomeCode"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringDoc","value":"\n"},
+  {"type":"Keyword","value":"=head1"},
+  {"type":"GenericHeading","value":" heading\n"},
+  {"type":"LiteralStringDoc","value":"]"},
+  {"type":"Punctuation","value":"｣"},
+  {"type":"Text","value":"\n"},
+  {"type":"Keyword","value":"grammar"},
+  {"type":"Text","value":" "},
+  {"type":"NameClass","value":"INIParser"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Keyword","value":"token"},
+  {"type":"Text","value":" "},
+  {"type":"NameFunction","value":"TOP"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameFunction","value":"block"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameFunction","value":"section"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Operator","value":"*"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Keyword","value":"token"},
+  {"type":"Text","value":" "},
+  {"type":"NameFunction","value":"section"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameFunction","value":"header"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameFunction","value":"block"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Keyword","value":"token"},
+  {"type":"Text","value":" "},
+  {"type":"NameFunction","value":"header"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"["},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Operator","value":"~"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"]"},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"LiteralStringEscape","value":"\\w"},
+  {"type":"Operator","value":"+"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"LiteralStringEscape","value":"\\n"},
+  {"type":"Operator","value":"+"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Keyword","value":"token"},
+  {"type":"Text","value":" "},
+  {"type":"NameFunction","value":"block"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"[\u003c"},
+  {"type":"NameFunction","value":"pair"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Operator","value":"|"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameFunction","value":"comment"},
+  {"type":"Punctuation","value":"\u003e]"},
+  {"type":"Operator","value":"*"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Keyword","value":"rule"},
+  {"type":"Text","value":" "},
+  {"type":"NameFunction","value":"pair"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameFunction","value":"key"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"="},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameFunction","value":"value"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Keyword","value":"token"},
+  {"type":"Text","value":" "},
+  {"type":"NameFunction","value":"comment"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":";"},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"LiteralStringEscape","value":"\\N"},
+  {"type":"Operator","value":"*"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"LiteralStringEscape","value":"\\n"},
+  {"type":"Operator","value":"+"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Keyword","value":"token"},
+  {"type":"Text","value":" "},
+  {"type":"NameFunction","value":"key"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"LiteralStringEscape","value":"\\w"},
+  {"type":"Operator","value":"+"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Keyword","value":"token"},
+  {"type":"Text","value":" "},
+  {"type":"NameFunction","value":"value"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"Operator","value":"-"},
+  {"type":"Punctuation","value":"["},
+  {"type":"LiteralStringEscape","value":"\\n"},
+  {"type":"LiteralStringRegex","value":" ;"},
+  {"type":"Punctuation","value":"]\u003e"},
+  {"type":"Operator","value":"+"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"Keyword","value":"my"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$match"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"="},
+  {"type":"Text","value":" "},
+  {"type":"Name","value":"INIParser"},
+  {"type":"Operator","value":"."},
+  {"type":"NameBuiltin","value":"parse"},
+  {"type":"Operator","value":":"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"q"},
+  {"type":"LiteralStringAffix","value":":to"},
+  {"type":"Punctuation","value":"/END/;"},
+  {"type":"LiteralString","value":"\n; Comment\nkey1=value1\nkey2 = value2\n\n; Section 1\n[section1]\nkey3=value3\n"},
+  {"type":"Punctuation","value":"END"},
+  {"type":"Text","value":"\n\n\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$match"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"LiteralString","value":"block"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Operator","value":"\u003c"},
+  {"type":"NameBuiltin","value":"pair"},
+  {"type":"Operator","value":"\u003e"},
+  {"type":"Punctuation","value":"["},
+  {"type":"LiteralNumberInteger","value":"0"},
+  {"type":"Punctuation","value":"]"},
+  {"type":"Operator","value":"\u003c"},
+  {"type":"NameBuiltin","value":"value"},
+  {"type":"Operator","value":"\u003e"},
+  {"type":"Text","value":";\n"},
+  {"type":"CommentSingle","value":"# OUTPUT: ｢value1｣"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$match"},
+  {"type":"Operator","value":"\u003c"},
+  {"type":"Name","value":"section"},
+  {"type":"Operator","value":"\u003e"},
+  {"type":"Punctuation","value":"["},
+  {"type":"LiteralNumberInteger","value":"0"},
+  {"type":"Punctuation","value":"]"},
+  {"type":"Operator","value":"\u003c"},
+  {"type":"NameBuiltin","value":"block"},
+  {"type":"Operator","value":"\u003e\u003c"},
+  {"type":"NameBuiltin","value":"pair"},
+  {"type":"Operator","value":"\u003e"},
+  {"type":"Punctuation","value":"["},
+  {"type":"LiteralNumberInteger","value":"0"},
+  {"type":"Punctuation","value":"]"},
+  {"type":"Operator","value":"\u003c"},
+  {"type":"NameBuiltin","value":"value"},
+  {"type":"Operator","value":"\u003e"},
+  {"type":"Text","value":";\n"},
+  {"type":"CommentSingle","value":"# OUTPUT: ｢value3｣"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"CommentSingle","value":"# Promise"},
+  {"type":"Text","value":"\n"},
+  {"type":"Keyword","value":"my"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$promise"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"="},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"start"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Keyword","value":"my"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$i"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"="},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"0"},
+  {"type":"Text","value":";\n    "},
+  {"type":"Keyword","value":"for"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":".."},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"10"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":"\n        "},
+  {"type":"NameVariable","value":"$i"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"+="},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$_"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n    "},
+  {"type":"NameVariable","value":"$i"},
+  {"type":"Text","value":"\n"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n"},
+  {"type":"Keyword","value":"my"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$result"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"="},
+  {"type":"Text","value":" "},
+  {"type":"NameBuiltin","value":"await"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$promise"},
+  {"type":"Text","value":";\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$result"},
+  {"type":"Text","value":";\n"},
+  {"type":"CommentSingle","value":"# OUTPUT: 55"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"CommentSingle","value":"# Supply"},
+  {"type":"Text","value":"\n"},
+  {"type":"Keyword","value":"my"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$bread-supplier"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"="},
+  {"type":"Text","value":" "},
+  {"type":"NameBuiltin","value":"Supplier"},
+  {"type":"Operator","value":"."},
+  {"type":"NameBuiltin","value":"new"},
+  {"type":"Text","value":";\n"},
+  {"type":"Keyword","value":"my"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$vegetable-supplier"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"="},
+  {"type":"Text","value":" "},
+  {"type":"NameBuiltin","value":"Supplier"},
+  {"type":"Operator","value":"."},
+  {"type":"NameBuiltin","value":"new"},
+  {"type":"Text","value":";\n\n"},
+  {"type":"Keyword","value":"my"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$supply"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"="},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"supply"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Keyword","value":"whenever"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$bread-supplier"},
+  {"type":"Operator","value":"."},
+  {"type":"NameBuiltin","value":"Supply"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":"\n        "},
+  {"type":"NameBuiltin","value":"emit"},
+  {"type":"Punctuation","value":"(\""},
+  {"type":"LiteralStringDouble","value":"We've got bread: "},
+  {"type":"Punctuation","value":"\""},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"~"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$_"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Text","value":";\n    "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":";\n    "},
+  {"type":"Keyword","value":"whenever"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$vegetable-supplier"},
+  {"type":"Operator","value":"."},
+  {"type":"NameBuiltin","value":"Supply"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":"\n        "},
+  {"type":"NameBuiltin","value":"emit"},
+  {"type":"Punctuation","value":"(\""},
+  {"type":"LiteralStringDouble","value":"We've got a vegetable: "},
+  {"type":"Punctuation","value":"\""},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"~"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$_"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Text","value":";\n    "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":";\n"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n"},
+  {"type":"NameVariable","value":"$supply"},
+  {"type":"Operator","value":"."},
+  {"type":"NameBuiltin","value":"tap"},
+  {"type":"Punctuation","value":"("},
+  {"type":"Keyword","value":"-\u003e"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$v"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":" "},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"\""},
+  {"type":"NameVariable","value":"$v"},
+  {"type":"Punctuation","value":"\""},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"})"},
+  {"type":"Text","value":";\n\n"},
+  {"type":"NameVariable","value":"$vegetable-supplier"},
+  {"type":"Operator","value":"."},
+  {"type":"NameBuiltin","value":"emit"},
+  {"type":"Punctuation","value":"(\""},
+  {"type":"LiteralStringDouble","value":"Radish"},
+  {"type":"Punctuation","value":"\")"},
+  {"type":"Text","value":";\n"},
+  {"type":"CommentSingle","value":"# OUTPUT: «We've got a vegetable: Radish␤»"},
+  {"type":"Text","value":"\n"},
+  {"type":"NameVariable","value":"$bread-supplier"},
+  {"type":"Operator","value":"."},
+  {"type":"NameBuiltin","value":"emit"},
+  {"type":"Punctuation","value":"(\""},
+  {"type":"LiteralStringDouble","value":"Thick sliced"},
+  {"type":"Punctuation","value":"\")"},
+  {"type":"Text","value":";\n"},
+  {"type":"CommentSingle","value":"# OUTPUT: «We've got bread: Thick sliced␤»"},
+  {"type":"Text","value":"\n"},
+  {"type":"NameVariable","value":"$vegetable-supplier"},
+  {"type":"Operator","value":"."},
+  {"type":"NameBuiltin","value":"emit"},
+  {"type":"Punctuation","value":"(\""},
+  {"type":"LiteralStringDouble","value":"Lettuce"},
+  {"type":"Punctuation","value":"\")"},
+  {"type":"Text","value":";\n"},
+  {"type":"CommentSingle","value":"# OUTPUT: «We've got a vegetable: Lettuce␤»"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"("},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Operator","value":","},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"2"},
+  {"type":"Operator","value":","},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"3"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"»+«"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"("},
+  {"type":"LiteralNumberInteger","value":"4"},
+  {"type":"Operator","value":","},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"5"},
+  {"type":"Operator","value":","},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"6"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Text","value":";\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"("},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Operator","value":","},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"2"},
+  {"type":"Operator","value":","},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"3"},
+  {"type":"Operator","value":","},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"4"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"»~»"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"LiteralString","value":"a b"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":";\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"("},
+  {"type":"NameVariable","value":"\u0026sin"},
+  {"type":"Operator","value":","},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"\u0026cos"},
+  {"type":"Operator","value":","},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"\u0026sqrt"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Operator","value":"»."},
+  {"type":"Punctuation","value":"("},
+  {"type":"LiteralNumberFloat","value":"0.5"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Text","value":";\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"(\u003c"},
+  {"type":"LiteralString","value":"a b"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Operator","value":","},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"LiteralString","value":"c d e"},
+  {"type":"Punctuation","value":"\u003e)"},
+  {"type":"Operator","value":"».\u0026"},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"."},
+  {"type":"NameBuiltin","value":"elems"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":";\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"\u003c\u003c"},
+  {"type":"LiteralStringDouble","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"\u003e\u003e"},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringDouble","value":" "},
+  {"type":"Punctuation","value":"\u003e\u003e"},
+  {"type":"Text","value":";\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"\""},
+  {"type":"LiteralStringDouble","value":"stuff here!!!"},
+  {"type":"Punctuation","value":"\""},
+  {"type":"Operator","value":"."},
+  {"type":"NameBuiltin","value":"subst"},
+  {"type":"Punctuation","value":"(:"},
+  {"type":"LiteralString","value":"g"},
+  {"type":"Operator","value":","},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"/"},
+  {"type":"Operator","value":"\u003c\u003c"},
+  {"type":"Punctuation","value":"/"},
+  {"type":"Operator","value":","},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"|"},
+  {"type":"Punctuation","value":"')"},
+  {"type":"Text","value":";\n"},
+  {"type":"Keyword","value":"my"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"@array"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"="},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"\u003c\u003c"},
+  {"type":"LiteralStringDouble","value":"an "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"array of"},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringDouble","value":" "},
+  {"type":"Punctuation","value":"{\""},
+  {"type":"LiteralStringDouble","value":"many"},
+  {"type":"Punctuation","value":"\"}"},
+  {"type":"LiteralStringDouble","value":" items"},
+  {"type":"Punctuation","value":"\u003e\u003e"},
+  {"type":"Text","value":";\n\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"["},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Operator","value":","},
+  {"type":"LiteralNumberInteger","value":"2"},
+  {"type":"Operator","value":","},
+  {"type":"LiteralNumberInteger","value":"3"},
+  {"type":"Punctuation","value":"]"},
+  {"type":"Text","value":" "},
+  {"type":"OperatorWord","value":"(\u0026)"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"["},
+  {"type":"LiteralNumberInteger","value":"2"},
+  {"type":"Operator","value":","},
+  {"type":"LiteralNumberInteger","value":"5"},
+  {"type":"Operator","value":","},
+  {"type":"LiteralNumberInteger","value":"7"},
+  {"type":"Punctuation","value":"]"},
+  {"type":"Text","value":";\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"["},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Operator","value":","},
+  {"type":"LiteralNumberInteger","value":"2"},
+  {"type":"Operator","value":","},
+  {"type":"LiteralNumberInteger","value":"3"},
+  {"type":"Punctuation","value":"]"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"∩"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"["},
+  {"type":"LiteralNumberInteger","value":"2"},
+  {"type":"Operator","value":","},
+  {"type":"LiteralNumberInteger","value":"5"},
+  {"type":"Operator","value":","},
+  {"type":"LiteralNumberInteger","value":"7"},
+  {"type":"Punctuation","value":"]"},
+  {"type":"Text","value":";\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"2"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"=:="},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"3"},
+  {"type":"Text","value":";\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"["},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Operator","value":","},
+  {"type":"LiteralNumberInteger","value":"2"},
+  {"type":"Operator","value":","},
+  {"type":"LiteralNumberInteger","value":"3"},
+  {"type":"Punctuation","value":"]"},
+  {"type":"Text","value":" "},
+  {"type":"OperatorWord","value":"Z"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"["},
+  {"type":"LiteralNumberInteger","value":"4"},
+  {"type":"Operator","value":","},
+  {"type":"LiteralNumberInteger","value":"5"},
+  {"type":"Operator","value":","},
+  {"type":"LiteralNumberInteger","value":"6"},
+  {"type":"Punctuation","value":"]"},
+  {"type":"Text","value":";\n"},
+  {"type":"Punctuation","value":"["},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Operator","value":","},
+  {"type":"LiteralNumberInteger","value":"2"},
+  {"type":"Operator","value":","},
+  {"type":"LiteralNumberInteger","value":"3"},
+  {"type":"Punctuation","value":"]"},
+  {"type":"Text","value":" "},
+  {"type":"OperatorWord","value":"RZ"},
+  {"type":"Punctuation","value":"["},
+  {"type":"Operator","value":"=\u003e"},
+  {"type":"Punctuation","value":"]"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"["},
+  {"type":"LiteralNumberInteger","value":"4"},
+  {"type":"Operator","value":","},
+  {"type":"LiteralNumberInteger","value":"5"},
+  {"type":"Operator","value":","},
+  {"type":"LiteralNumberInteger","value":"6"},
+  {"type":"Punctuation","value":"]"},
+  {"type":"Text","value":";\n\n"},
+  {"type":"Keyword","value":"rx"},
+  {"type":"Punctuation","value":"/:"},
+  {"type":"NameAttribute","value":"i"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"LiteralStringEscape","value":"\\w"},
+  {"type":"Operator","value":"+"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"CommentSingle","value":"# some comment\n"},
+  {"type":"LiteralStringRegex","value":"        "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"text"},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"LiteralStringEscape","value":"\\d"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Operator","value":"**"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"LiteralNumberInteger","value":"2"},
+  {"type":"Operator","value":".."},
+  {"type":"LiteralNumberInteger","value":"5"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"\""},
+  {"type":"LiteralStringDouble","value":"double quotes!"},
+  {"type":"Punctuation","value":"\""},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameBuiltin","value":"alnum"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"\u003c:"},
+  {"type":"NameAttribute","value":"N"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"+"},
+  {"type":"Text","value":" "},
+  {"type":"NameBuiltin","value":"alpha"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Operator","value":"+"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"\u003c{"},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"+"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"2"},
+  {"type":"Punctuation","value":"}\u003e"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"\u003c:"},
+  {"type":"NameAttribute","value":"madeup"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"["},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"LiteralStringEscape","value":"\\w"},
+  {"type":"Operator","value":"+"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"]"},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Operator","value":"||"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"LiteralStringEscape","value":"\\S"},
+  {"type":"Operator","value":"+"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"LiteralStringEscape","value":"\\s"},
+  {"type":"Operator","value":"*"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"="},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"LiteralStringEscape","value":"\\s"},
+  {"type":"Operator","value":"*"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"LiteralStringEscape","value":"\\S"},
+  {"type":"Operator","value":"*"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Operator","value":"||"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"["},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"LiteralStringEscape","value":"\\w"},
+  {"type":"Operator","value":"+"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"]"},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Operator","value":"||"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"LiteralStringEscape","value":"\\S"},
+  {"type":"Operator","value":"+"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"LiteralStringEscape","value":"\\s"},
+  {"type":"Operator","value":"*"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"="},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"LiteralStringEscape","value":"\\s"},
+  {"type":"Operator","value":"*"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"LiteralStringEscape","value":"\\S"},
+  {"type":"Operator","value":"*"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"\u003c:"},
+  {"type":"NameAttribute","value":"Script"},
+  {"type":"Punctuation","value":"('"},
+  {"type":"LiteralStringSingle","value":"Latin"},
+  {"type":"Punctuation","value":"')\u003e"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"\u003c:"},
+  {"type":"NameAttribute","value":"Block"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"LiteralString","value":"Basic Latin"},
+  {"type":"Punctuation","value":"\u003e\u003e"},
+  {"type":"LiteralStringRegex","value":"\n        if "},
+  {"type":"Operator","value":"|"},
+  {"type":"LiteralStringRegex","value":" if "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"Operator","value":"."},
+  {"type":"OperatorWord","value":"ws"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":" else "},
+  {"type":"NameVariable","value":"$0"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"\u003c:"},
+  {"type":"NameAttribute","value":"Lu"},
+  {"type":"Operator","value":"+"},
+  {"type":"Punctuation","value":":"},
+  {"type":"NameAttribute","value":"N"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralStringRegex","value":"f"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralStringRegex","value":"fo"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralStringRegex","value":"foo"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralStringRegex","value":"food"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"\u003c:"},
+  {"type":"NameAttribute","value":"L"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"+"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":":!"},
+  {"type":"NameAttribute","value":"N"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"\u003c["},
+  {"type":"LiteralStringRegex","value":" a "},
+  {"type":"Operator","value":".."},
+  {"type":"LiteralStringRegex","value":" c "},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"LiteralNumberInteger","value":"2"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"LiteralNumberInteger","value":"3"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"]\u003e"},
+  {"type":"Operator","value":"*"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"NameVariable","value":"@variable"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"\u003c["},
+  {"type":"LiteralStringEscape","value":"\\d"},
+  {"type":"Punctuation","value":"]"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"-"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"["},
+  {"type":"LiteralNumberInteger","value":"13579"},
+  {"type":"Punctuation","value":"]\u003e"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"Operator","value":"?"},
+  {"type":"OperatorWord","value":"before"},
+  {"type":"LiteralStringRegex","value":" a "},
+  {"type":"NameVariable","value":"$0"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Operator","value":"\u0026\u0026"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"NameEntity","value":"."},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"\u003c:"},
+  {"type":"NameAttribute","value":"Zs"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"+"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"["},
+  {"type":"LiteralStringEscape","value":"\\x"},
+  {"type":"LiteralNumberHex","value":"9"},
+  {"type":"Punctuation","value":"]"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"-"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"["},
+  {"type":"LiteralStringEscape","value":"\\x"},
+  {"type":"LiteralNumberHex","value":"A0"},
+  {"type":"Punctuation","value":"]\u003e"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"NameEntity","value":"^"},
+  {"type":"LiteralStringRegex","value":" raku "},
+  {"type":"NameEntity","value":"$"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"NameEntity","value":"^"},
+  {"type":"LiteralStringRegex","value":" raku"},
+  {"type":"NameEntity","value":"$"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"["},
+  {"type":"NameEntity","value":"^"},
+  {"type":"LiteralStringRegex","value":"raku"},
+  {"type":"NameEntity","value":"$"},
+  {"type":"Operator","value":"|"},
+  {"type":"LiteralStringRegex","value":"something"},
+  {"type":"NameEntity","value":"$"},
+  {"type":"Punctuation","value":"]"},
+  {"type":"LiteralStringRegex","value":"else"},
+  {"type":"NameEntity","value":"$"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"\u003c["},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"LiteralStringEscape","value":"\\x"},
+  {"type":"Punctuation","value":"["},
+  {"type":"LiteralNumberHex","value":"00C0"},
+  {"type":"Punctuation","value":"]"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Operator","value":".."},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"LiteralStringEscape","value":"\\x"},
+  {"type":"Punctuation","value":"["},
+  {"type":"LiteralNumberHex","value":"00C6"},
+  {"type":"Punctuation","value":"]"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"]\u003e"},
+  {"type":"Operator","value":"*"},
+  {"type":"LiteralStringRegex","value":"\n        two"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"Operator","value":"|"},
+  {"type":"OperatorWord","value":"w"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":"\\-"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"Operator","value":"|"},
+  {"type":"OperatorWord","value":"w"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":"words\n        "},
+  {"type":"Punctuation","value":"\u003c["},
+  {"type":"LiteralStringEscape","value":"\\c"},
+  {"type":"Punctuation","value":"["},
+  {"type":"LiteralString","value":"GREEK SMALL LETTER ALPHA"},
+  {"type":"Punctuation","value":"]"},
+  {"type":"Operator","value":".."},
+  {"type":"LiteralStringEscape","value":"\\c"},
+  {"type":"Punctuation","value":"["},
+  {"type":"LiteralString","value":"GREEK SMALL LETTER GAMMA"},
+  {"type":"Punctuation","value":"]]\u003e"},
+  {"type":"Operator","value":"*"},
+  {"type":"LiteralStringRegex","value":"\n        two"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"Operator","value":"!|"},
+  {"type":"OperatorWord","value":"w"},
+  {"type":"Punctuation","value":"\u003e\u003c"},
+  {"type":"Operator","value":"!|"},
+  {"type":"OperatorWord","value":"w"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":"words\n        "},
+  {"type":"Operator","value":"\u003c\u003c"},
+  {"type":"LiteralStringRegex","value":" br "},
+  {"type":"Operator","value":"\u003e\u003e"},
+  {"type":"LiteralStringRegex","value":"\n        own "},
+  {"type":"Operator","value":"»"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"NameEntity","value":"^^"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"Operator","value":"?"},
+  {"type":"NameBuiltin","value":"alnum"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"LiteralStringEscape","value":"\\d"},
+  {"type":"Operator","value":"+"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"NameEntity","value":"^^"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"LiteralStringEscape","value":"\\d"},
+  {"type":"Operator","value":"+"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"Operator","value":"!"},
+  {"type":"Punctuation","value":":"},
+  {"type":"NameAttribute","value":"Script"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"LiteralString","value":"Tamil"},
+  {"type":"Punctuation","value":"\u003e\u003e"},
+  {"type":"LiteralStringRegex","value":"\n        abc "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"Operator","value":"?"},
+  {"type":"Punctuation","value":"["},
+  {"type":"LiteralStringRegex","value":" d"},
+  {"type":"Operator","value":".."},
+  {"type":"LiteralStringRegex","value":"f "},
+  {"type":"Punctuation","value":"]\u003e"},
+  {"type":"LiteralStringRegex","value":"\n        abc "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"Operator","value":"?"},
+  {"type":"NameVariable","value":"@some-array"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"Operator","value":"?"},
+  {"type":"OperatorWord","value":"after"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"NameEntity","value":"^^"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Operator","value":"|"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"\""},
+  {"type":"LiteralStringDouble","value":"."},
+  {"type":"Punctuation","value":"\""},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"LiteralStringEscape","value":"\\s"},
+  {"type":"Operator","value":"+"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"\u003c:"},
+  {"type":"NameAttribute","value":"Lu"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringEscape","value":"\\S"},
+  {"type":"Operator","value":"+"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"["},
+  {"type":"LiteralStringRegex","value":" ab "},
+  {"type":"Operator","value":"||"},
+  {"type":"LiteralStringRegex","value":" cbc "},
+  {"type":"Punctuation","value":"]"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"("},
+  {"type":"LiteralStringRegex","value":"a "},
+  {"type":"Operator","value":"||"},
+  {"type":"LiteralStringRegex","value":" b"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Operator","value":"+"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"["},
+  {"type":"LiteralStringRegex","value":"a"},
+  {"type":"Operator","value":"||"},
+  {"type":"LiteralStringRegex","value":"b"},
+  {"type":"Punctuation","value":"]"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"("},
+  {"type":"LiteralStringRegex","value":"c"},
+  {"type":"Punctuation","value":")"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"("},
+  {"type":"LiteralStringEscape","value":"\\d"},
+  {"type":"Punctuation","value":")"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"("},
+  {"type":"NameVariable","value":"$0"},
+  {"type":"Punctuation","value":")"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"("},
+  {"type":"LiteralStringEscape","value":"\\d"},
+  {"type":"Punctuation","value":")"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"{}"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Operator","value":":"},
+  {"type":"KeywordDeclaration","value":"my"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$c"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"="},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$0"},
+  {"type":"Text","value":";"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"("},
+  {"type":"NameVariable","value":"$c"},
+  {"type":"Punctuation","value":")"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Operator","value":":"},
+  {"type":"KeywordDeclaration","value":"my"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$counter"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"="},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"0"},
+  {"type":"Text","value":";"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"("},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"LiteralStringEscape","value":"\\V"},
+  {"type":"Operator","value":"*"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"++"},
+  {"type":"NameVariable","value":"$counter"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":")"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Operator","value":"*"},
+  {"type":"NameVariable","value":"%%"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"LiteralStringEscape","value":"\\n"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"("},
+  {"type":"LiteralStringRegex","value":"a"},
+  {"type":"Punctuation","value":")"},
+  {"type":"LiteralStringRegex","value":" b "},
+  {"type":"Punctuation","value":"{}"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Operator","value":":"},
+  {"type":"KeywordDeclaration","value":"my"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$c2"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"="},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$/"},
+  {"type":"Text","value":";"},
+  {"type":"LiteralStringRegex","value":"\n        test\n        "},
+  {"type":"Punctuation","value":"("},
+  {"type":"LiteralStringRegex","value":"a"},
+  {"type":"Punctuation","value":")"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"\""},
+  {"type":"LiteralStringDouble","value":"Check so far "},
+  {"type":"Punctuation","value":"\""},
+  {"type":"Operator","value":","},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"~"},
+  {"type":"NameVariable","value":"$/"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"LiteralStringRegex","value":" b "},
+  {"type":"Operator","value":":"},
+  {"type":"KeywordDeclaration","value":"my"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$c3"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"="},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"~"},
+  {"type":"NameVariable","value":"$0"},
+  {"type":"Text","value":";"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":" "},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"hi"},
+  {"type":"Punctuation","value":"'"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"LiteralStringRegex","value":"\n\n        "},
+  {"type":"NameVariable","value":"$\u003cmyname\u003e"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Operator","value":"="},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"["},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"LiteralStringEscape","value":"\\w"},
+  {"type":"Operator","value":"+"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"]"},
+  {"type":"LiteralStringRegex","value":"\n\n        "},
+  {"type":"NameVariable","value":"$\u003cstring\u003e"},
+  {"type":"Operator","value":"="},
+  {"type":"Punctuation","value":"("},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"["},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"NameVariable","value":"$\u003cpart\u003e"},
+  {"type":"Operator","value":"="},
+  {"type":"Punctuation","value":"["},
+  {"type":"LiteralStringRegex","value":"abc"},
+  {"type":"Punctuation","value":"]"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"]"},
+  {"type":"Operator","value":"*"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"NameVariable","value":"%"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"-"},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":")"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"NameVariable","value":"$\u003cvariable\u003e"},
+  {"type":"Operator","value":"="},
+  {"type":"LiteralStringEscape","value":"\\w"},
+  {"type":"Operator","value":"+"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"="},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"NameVariable","value":"$\u003cvalue\u003e"},
+  {"type":"Operator","value":"="},
+  {"type":"LiteralStringEscape","value":"\\w"},
+  {"type":"Operator","value":"+"},
+  {"type":"LiteralStringRegex","value":"\n        a "},
+  {"type":"Punctuation","value":"\u003c("},
+  {"type":"LiteralStringRegex","value":" b "},
+  {"type":"Punctuation","value":")\u003e"},
+  {"type":"LiteralStringRegex","value":" c\n        "},
+  {"type":"Punctuation","value":"\u003c("},
+  {"type":"LiteralStringRegex","value":"a "},
+  {"type":"Punctuation","value":"\u003c("},
+  {"type":"LiteralStringRegex","value":" b "},
+  {"type":"Punctuation","value":")\u003e"},
+  {"type":"LiteralStringRegex","value":" c"},
+  {"type":"Punctuation","value":")\u003e"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"("},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Operator","value":"~"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":")"},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameFunction","value":"expression"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"NameVariable","value":"$\u003cOPEN\u003e"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Operator","value":"="},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"("},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameFunction","value":"SETGOAL"},
+  {"type":"Punctuation","value":":"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":")"},
+  {"type":"Punctuation","value":"'\u003e"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameFunction","value":"some-expression"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"["},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"NameVariable","value":"$GOAL"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Operator","value":"||"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameFunction","value":"FAILGOAL"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"]"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"Operator","value":"?"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Operator","value":"~"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":")"},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"LiteralStringEscape","value":"\\d"},
+  {"type":"Operator","value":"+"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"("},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"Operator","value":"-"},
+  {"type":"Punctuation","value":"["},
+  {"type":"LiteralStringRegex","value":"()"},
+  {"type":"Punctuation","value":"]\u003e"},
+  {"type":"Operator","value":"*"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":")"},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Operator","value":"||"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"("},
+  {"type":"Punctuation","value":"'["},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"Operator","value":"-"},
+  {"type":"Punctuation","value":"["},
+  {"type":"LiteralStringRegex","value":"()"},
+  {"type":"Punctuation","value":"]\u003e"},
+  {"type":"Operator","value":"*"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Operator","value":"\u003c~~\u003e"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"Operator","value":"-"},
+  {"type":"Punctuation","value":"["},
+  {"type":"LiteralStringRegex","value":"()"},
+  {"type":"Punctuation","value":"]\u003e"},
+  {"type":"Operator","value":"*"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"]"},
+  {"type":"Operator","value":"*"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":")"},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"NameVariable","value":"@\u003cnamed-regex\u003e"},
+  {"type":"Operator","value":"="},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"Operator","value":"."},
+  {"type":"NameBuiltin","value":"ident"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"Operator","value":"."},
+  {"type":"NameFunction","value":"named-regex"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameVariable","value":"\u0026named-regex"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameFunction","value":"someregex"},
+  {"type":"Punctuation","value":"('"},
+  {"type":"LiteralStringSingle","value":"a"},
+  {"type":"Punctuation","value":"')\u003e"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameVariable","value":"capture-name"},
+  {"type":"Operator","value":"="},
+  {"type":"NameFunction","value":"named-regex"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameVariable","value":"capture-name"},
+  {"type":"Operator","value":"="},
+  {"type":"NameFunction","value":"named-regex"},
+  {"type":"Punctuation","value":"("},
+  {"type":"LiteralNumberInteger","value":"2"},
+  {"type":"Punctuation","value":")\u003e"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameVariable","value":"$test"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameVariable","value":"@test"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"NameVariable","value":"$"},
+  {"type":"Punctuation","value":"("},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Operator","value":"+"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"LiteralNumberInteger","value":"2"},
+  {"type":"LiteralStringRegex","value":"; "},
+  {"type":"NameVariable","value":"$test"},
+  {"type":"Punctuation","value":")"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"NameVariable","value":"$pattern3"},
+  {"type":"NameEntity","value":"."},
+  {"type":"LiteralStringRegex","value":"flip "},
+  {"type":"CommentSingle","value":"# Nil\n"},
+  {"type":"LiteralStringRegex","value":"        "},
+  {"type":"Punctuation","value":"\""},
+  {"type":"NameVariable","value":"$pattern3"},
+  {"type":"Operator","value":"."},
+  {"type":"NameFunction","value":"flip"},
+  {"type":"Punctuation","value":"()\""},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"NameVariable","value":"$"},
+  {"type":"Punctuation","value":"(["},
+  {"type":"Operator","value":"~"},
+  {"type":"Punctuation","value":"]"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"NameVariable","value":"$pattern3"},
+  {"type":"NameEntity","value":"."},
+  {"type":"LiteralStringRegex","value":"comb"},
+  {"type":"NameEntity","value":"."},
+  {"type":"LiteralStringRegex","value":"reverse"},
+  {"type":"Punctuation","value":")"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"NameVariable","value":"@"},
+  {"type":"Punctuation","value":"("},
+  {"type":"NameVariable","value":"%h"},
+  {"type":"NameEntity","value":"."},
+  {"type":"LiteralStringRegex","value":"keys"},
+  {"type":"Punctuation","value":")"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"LiteralStringEscape","value":"\\d"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Operator","value":"**"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Operator","value":".."},
+  {"type":"LiteralNumberInteger","value":"3"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"Operator","value":"?"},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$/"},
+  {"type":"Operator","value":"."},
+  {"type":"NameBuiltin","value":"Int"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"\u003c="},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"255"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"\u0026\u0026"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$/"},
+  {"type":"Operator","value":"."},
+  {"type":"NameBuiltin","value":"Int"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"\u003e="},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"0"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"}\u003e"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"NameEntity","value":"$"},
+  {"type":"Punctuation","value":"/"},
+  {"type":"Text","value":";\n\n"},
+  {"type":"Keyword","value":"constant"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"\\something"},
+  {"type":"Punctuation","value":":"},
+  {"type":"NameAttribute","value":"some"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"LiteralString","value":"adverb"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"="},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"something"},
+  {"type":"Punctuation","value":"'"},
+  {"type":"Text","value":";\n\n"},
+  {"type":"Keyword","value":"my"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"%hash"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"="},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"%"},
+  {"type":"Punctuation","value":"("},
+  {"type":"Text","value":"\n    "},
+  {"type":"LiteralString","value":"query"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"=\u003e"},
+  {"type":"Text","value":" "},
+  {"type":"Name","value":"something"},
+  {"type":"Text","value":",\n    "},
+  {"type":"LiteralString","value":"qq"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"=\u003e"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"something"},
+  {"type":"Punctuation","value":"'"},
+  {"type":"Text","value":",\n    "},
+  {"type":"Punctuation","value":":"},
+  {"type":"LiteralString","value":"23year"},
+  {"type":"Operator","value":","},
+  {"type":"Text","value":"\n    "},
+  {"type":"LiteralString","value":"m"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"=\u003e"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$test"},
+  {"type":"Text","value":",\n    "},
+  {"type":"Punctuation","value":":"},
+  {"type":"LiteralString","value":"yes"},
+  {"type":"Operator","value":","},
+  {"type":"Text","value":"\n    "},
+  {"type":"Punctuation","value":":!"},
+  {"type":"LiteralString","value":"yes"},
+  {"type":"Operator","value":","},
+  {"type":"Text","value":"\n    "},
+  {"type":"Punctuation","value":"("},
+  {"type":"NameBuiltin","value":"Less"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"=\u003e"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$test"},
+  {"type":"Text","value":",\n"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Text","value":";\n\n"},
+  {"type":"Keyword","value":"my"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"%hash2"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"="},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"%"},
+  {"type":"Punctuation","value":"("},
+  {"type":"Text","value":"\n    "},
+  {"type":"Punctuation","value":":"},
+  {"type":"LiteralString","value":"query"},
+  {"type":"Punctuation","value":"("},
+  {"type":"Name","value":"something"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Operator","value":","},
+  {"type":"Text","value":"\n    "},
+  {"type":"Punctuation","value":":"},
+  {"type":"LiteralString","value":"qq"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"LiteralString","value":"something"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Operator","value":","},
+  {"type":"Text","value":"\n    "},
+  {"type":"Punctuation","value":":"},
+  {"type":"LiteralString","value":"m"},
+  {"type":"Punctuation","value":"("},
+  {"type":"Name","value":"something"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Operator","value":","},
+  {"type":"Text","value":"\n    "},
+  {"type":"Punctuation","value":":"},
+  {"type":"LiteralNumberInteger","value":"23"},
+  {"type":"Punctuation","value":"('"},
+  {"type":"LiteralStringSingle","value":"a"},
+  {"type":"Punctuation","value":"')"},
+  {"type":"Operator","value":","},
+  {"type":"Text","value":"\n    "},
+  {"type":"Punctuation","value":":"},
+  {"type":"LiteralString","value":"test"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"LiteralString","value":"something"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Operator","value":","},
+  {"type":"Text","value":"\n    "},
+  {"type":"Punctuation","value":":"},
+  {"type":"LiteralString","value":"query1"},
+  {"type":"Punctuation","value":"{"},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"+"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"2"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Punctuation","value":":"},
+  {"type":"LiteralString","value":"list"},
+  {"type":"Punctuation","value":"["},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Operator","value":","},
+  {"type":"LiteralNumberInteger","value":"2"},
+  {"type":"Operator","value":","},
+  {"type":"LiteralNumberInteger","value":"3"},
+  {"type":"Punctuation","value":"]"},
+  {"type":"Text","value":"\n"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Text","value":";\n\n"},
+  {"type":"Keyword","value":"=for"},
+  {"type":"LiteralStringDoc","value":" "},
+  {"type":"Keyword","value":"comment"},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralStringDoc","value":"some comment\n\n"},
+  {"type":"Keyword","value":"=table"},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralStringDoc","value":"  |col|\n  |row|\n\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"Q"},
+  {"type":"Punctuation","value":"["},
+  {"type":"LiteralString","value":"｢some $text｣"},
+  {"type":"Punctuation","value":"]"},
+  {"type":"Text","value":";\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"qq"},
+  {"type":"Punctuation","value":"｢｢"},
+  {"type":"LiteralStringDouble","value":"some "},
+  {"type":"NameVariable","value":"$regex"},
+  {"type":"LiteralStringDouble","value":" text"},
+  {"type":"Punctuation","value":"｣｣"},
+  {"type":"Text","value":";\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"q"},
+  {"type":"LiteralStringAffix","value":"ww"},
+  {"type":"Punctuation","value":"｢｢"},
+  {"type":"LiteralStringDouble","value":"some "},
+  {"type":"NameVariable","value":"$variable"},
+  {"type":"LiteralStringDouble","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"some text"},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringDouble","value":" text"},
+  {"type":"Punctuation","value":"｣｣"},
+  {"type":"Text","value":";\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"q"},
+  {"type":"LiteralStringAffix","value":":ww"},
+  {"type":"Punctuation","value":"｢｢"},
+  {"type":"LiteralStringDouble","value":"some "},
+  {"type":"NameVariable","value":"$variable"},
+  {"type":"LiteralStringDouble","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"some text"},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringDouble","value":" text"},
+  {"type":"Punctuation","value":"｣｣"},
+  {"type":"Text","value":";\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"q"},
+  {"type":"LiteralStringAffix","value":":w"},
+  {"type":"Punctuation","value":"｢｢"},
+  {"type":"LiteralString","value":"some $variable 'some text' text"},
+  {"type":"Punctuation","value":"｣｣"},
+  {"type":"Text","value":";\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"qq"},
+  {"type":"LiteralStringAffix","value":":w"},
+  {"type":"Punctuation","value":"｢｢"},
+  {"type":"LiteralStringDouble","value":"some "},
+  {"type":"NameVariable","value":"$regex"},
+  {"type":"LiteralStringDouble","value":" 'some text' text"},
+  {"type":"Punctuation","value":"｣｣"},
+  {"type":"Text","value":";\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"Q"},
+  {"type":"LiteralStringAffix","value":":c"},
+  {"type":"Punctuation","value":"｢｢"},
+  {"type":"LiteralString","value":"some $regex 'some text' "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"2"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"+"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"LiteralString","value":" text"},
+  {"type":"Punctuation","value":"｣｣"},
+  {"type":"Text","value":";\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"q"},
+  {"type":"LiteralStringAffix","value":":a"},
+  {"type":"Punctuation","value":"｢｢"},
+  {"type":"LiteralString","value":"some "},
+  {"type":"NameVariable","value":"@array"},
+  {"type":"LiteralString","value":" 'some text' { 2 + 1 } text"},
+  {"type":"Punctuation","value":"｣｣"},
+  {"type":"Text","value":";\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"Q"},
+  {"type":"LiteralStringAffix","value":":a:c"},
+  {"type":"Punctuation","value":"｢｢"},
+  {"type":"LiteralStringDouble","value":"some "},
+  {"type":"NameVariable","value":"@array"},
+  {"type":"LiteralStringDouble","value":" 'some text' "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"2"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"+"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"LiteralStringDouble","value":" text"},
+  {"type":"Punctuation","value":"｣｣"},
+  {"type":"Text","value":";\n"},
+  {"type":"Keyword","value":"Q"},
+  {"type":"Punctuation","value":"["},
+  {"type":"LiteralString","value":"some "},
+  {"type":"LiteralStringEscape","value":"\\qq"},
+  {"type":"Punctuation","value":"["},
+  {"type":"NameVariable","value":"$variable"},
+  {"type":"Operator","value":"."},
+  {"type":"NameFunction","value":"method"},
+  {"type":"Punctuation","value":"()]"},
+  {"type":"LiteralString","value":" testing"},
+  {"type":"Punctuation","value":"]"},
+  {"type":"Text","value":"\n"},
+  {"type":"Keyword","value":"Q"},
+  {"type":"LiteralStringAffix","value":":a:c"},
+  {"type":"Punctuation","value":"["},
+  {"type":"LiteralStringDouble","value":"some "},
+  {"type":"LiteralStringEscape","value":"\\qq"},
+  {"type":"Punctuation","value":"["},
+  {"type":"NameVariable","value":"$variable"},
+  {"type":"Operator","value":"."},
+  {"type":"NameFunction","value":"method"},
+  {"type":"Punctuation","value":"()]"},
+  {"type":"LiteralStringDouble","value":" testing"},
+  {"type":"Punctuation","value":"]"},
+  {"type":"Text","value":"\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"Q"},
+  {"type":"LiteralStringAffix","value":":c:h"},
+  {"type":"Punctuation","value":"｢"},
+  {"type":"LiteralStringDouble","value":"Testing "},
+  {"type":"Punctuation","value":"{'"},
+  {"type":"LiteralStringSingle","value":"toasting"},
+  {"type":"Punctuation","value":"'}"},
+  {"type":"LiteralStringDouble","value":" "},
+  {"type":"NameVariable","value":"%h"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"LiteralString","value":"one"},
+  {"type":"Punctuation","value":"\u003e｣"},
+  {"type":"Text","value":";\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"Q"},
+  {"type":"LiteralStringAffix","value":":c:h"},
+  {"type":"Punctuation","value":"｢"},
+  {"type":"LiteralStringDouble","value":"Testing "},
+  {"type":"Punctuation","value":"{'"},
+  {"type":"LiteralStringSingle","value":"toasting"},
+  {"type":"Punctuation","value":"'}"},
+  {"type":"LiteralStringDouble","value":" "},
+  {"type":"NameVariable","value":"%h"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"LiteralString","value":"one"},
+  {"type":"Punctuation","value":"\u003e\u003c"},
+  {"type":"LiteralString","value":"two"},
+  {"type":"Punctuation","value":"\u003e｣"},
+  {"type":"Text","value":";\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"Q"},
+  {"type":"LiteralStringAffix","value":":c:h"},
+  {"type":"Punctuation","value":"｢"},
+  {"type":"LiteralStringDouble","value":"Testing "},
+  {"type":"Punctuation","value":"{'"},
+  {"type":"LiteralStringSingle","value":"toasting"},
+  {"type":"Punctuation","value":"'}"},
+  {"type":"LiteralStringDouble","value":" "},
+  {"type":"NameVariable","value":"%h"},
+  {"type":"Punctuation","value":"\u003c\u003c"},
+  {"type":"LiteralStringDouble","value":"one"},
+  {"type":"Punctuation","value":"\u003e\u003e｣"},
+  {"type":"Text","value":";\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"Q"},
+  {"type":"LiteralStringAffix","value":":c:h"},
+  {"type":"Punctuation","value":"｢"},
+  {"type":"LiteralStringDouble","value":"Testing "},
+  {"type":"Punctuation","value":"{'"},
+  {"type":"LiteralStringSingle","value":"toasting"},
+  {"type":"Punctuation","value":"'}"},
+  {"type":"LiteralStringDouble","value":" "},
+  {"type":"NameVariable","value":"%h"},
+  {"type":"LiteralStringDouble","value":"«one»"},
+  {"type":"Punctuation","value":"｣"},
+  {"type":"Text","value":";\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"Q"},
+  {"type":"LiteralStringAffix","value":":b"},
+  {"type":"Punctuation","value":"["},
+  {"type":"LiteralString","value":"Testing"},
+  {"type":"Punctuation","value":"]"},
+  {"type":"Text","value":";\n"},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"some "},
+  {"type":"LiteralStringEscape","value":"\\qq"},
+  {"type":"Punctuation","value":"["},
+  {"type":"NameVariable","value":"$variable"},
+  {"type":"Operator","value":"."},
+  {"type":"NameFunction","value":"method"},
+  {"type":"Punctuation","value":"()]"},
+  {"type":"LiteralStringSingle","value":" testing"},
+  {"type":"Punctuation","value":"'"},
+  {"type":"Text","value":";\n"},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"somes\\' testing"},
+  {"type":"Punctuation","value":"'"},
+  {"type":"Text","value":";\n"},
+  {"type":"Punctuation","value":"\""},
+  {"type":"LiteralStringDouble","value":"some "},
+  {"type":"LiteralStringEscape","value":"\\qq"},
+  {"type":"Punctuation","value":"["},
+  {"type":"NameVariable","value":"$variable"},
+  {"type":"Operator","value":"."},
+  {"type":"NameFunction","value":"method"},
+  {"type":"Punctuation","value":"()]"},
+  {"type":"LiteralStringDouble","value":" testing"},
+  {"type":"Punctuation","value":"\""},
+  {"type":"Text","value":";\n"},
+  {"type":"Punctuation","value":"\""},
+  {"type":"LiteralStringDouble","value":"some "},
+  {"type":"NameVariable","value":"$variable"},
+  {"type":"Operator","value":"."},
+  {"type":"NameFunction","value":"method"},
+  {"type":"Punctuation","value":"()"},
+  {"type":"LiteralStringDouble","value":" testing"},
+  {"type":"Punctuation","value":"\""},
+  {"type":"Text","value":";\n"},
+  {"type":"Punctuation","value":"\""},
+  {"type":"LiteralStringDouble","value":"some "},
+  {"type":"NameVariable","value":"$variable"},
+  {"type":"Punctuation","value":":"},
+  {"type":"NameAttribute","value":"some"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"LiteralString","value":"adverb"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Operator","value":"."},
+  {"type":"NameFunction","value":"method"},
+  {"type":"Punctuation","value":"()"},
+  {"type":"LiteralStringDouble","value":" testing"},
+  {"type":"Punctuation","value":"\""},
+  {"type":"Text","value":";\n"},
+  {"type":"Punctuation","value":"\""},
+  {"type":"LiteralStringDouble","value":"some "},
+  {"type":"NameVariable","value":"$variable"},
+  {"type":"Punctuation","value":":"},
+  {"type":"NameAttribute","value":"some"},
+  {"type":"Punctuation","value":"('"},
+  {"type":"LiteralStringSingle","value":"adverb"},
+  {"type":"Punctuation","value":"')"},
+  {"type":"Operator","value":"."},
+  {"type":"NameFunction","value":"method"},
+  {"type":"Punctuation","value":"()"},
+  {"type":"LiteralStringDouble","value":" testing"},
+  {"type":"Punctuation","value":"\""},
+  {"type":"Text","value":";\n"},
+  {"type":"Punctuation","value":"\""},
+  {"type":"LiteralStringDouble","value":"some "},
+  {"type":"NameFunction","value":"func"},
+  {"type":"Punctuation","value":"()"},
+  {"type":"LiteralStringDouble","value":" testing"},
+  {"type":"Punctuation","value":"\""},
+  {"type":"Text","value":";\n"},
+  {"type":"Punctuation","value":"\""},
+  {"type":"LiteralStringDouble","value":"some "},
+  {"type":"NameFunction","value":"func"},
+  {"type":"Punctuation","value":":"},
+  {"type":"NameAttribute","value":"some"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"LiteralString","value":"adverb"},
+  {"type":"Punctuation","value":"\u003e()"},
+  {"type":"LiteralStringDouble","value":" testing"},
+  {"type":"Punctuation","value":"\""},
+  {"type":"Text","value":";\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"\""},
+  {"type":"LiteralStringDouble","value":"Something "},
+  {"type":"NameFunction","value":"foo"},
+  {"type":"Punctuation","value":"("},
+  {"type":"LiteralNumberInteger","value":"2"},
+  {"type":"Punctuation","value":")"},
+  {"type":"LiteralStringDouble","value":" "},
+  {"type":"NameVariable","value":"$a"},
+  {"type":"Operator","value":"."},
+  {"type":"NameFunction","value":"succ"},
+  {"type":"Punctuation","value":"("},
+  {"type":"LiteralNumberInteger","value":"2"},
+  {"type":"Operator","value":"+"},
+  {"type":"LiteralNumberInteger","value":"3"},
+  {"type":"Operator","value":","},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$some_variable"},
+  {"type":"Punctuation","value":")"},
+  {"type":"LiteralStringDouble","value":" "},
+  {"type":"NameVariable","value":"$a"},
+  {"type":"Operator","value":"."},
+  {"type":"NameFunction","value":"some-method"},
+  {"type":"Punctuation","value":"()"},
+  {"type":"LiteralStringDouble","value":"  "},
+  {"type":"NameVariable","value":"@more"},
+  {"type":"LiteralStringDouble","value":" "},
+  {"type":"NameVariable","value":"$_"},
+  {"type":"Operator","value":"."},
+  {"type":"NameFunction","value":"Str"},
+  {"type":"Punctuation","value":"("},
+  {"type":"LiteralNumberInteger","value":"2"},
+  {"type":"Punctuation","value":")"},
+  {"type":"LiteralStringDouble","value":" "},
+  {"type":"NameVariable","value":"$_:"},
+  {"type":"LiteralStringDouble","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$_"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"*"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"2"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"}\""},
+  {"type":"Text","value":";\n\n"},
+  {"type":"CommentMultiline","value":"#`[[\nmultiline comment]\n]]"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"Keyword","value":"my"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$regex"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"="},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"/'"},
+  {"type":"LiteralStringSingle","value":"match"},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"LiteralStringEscape","value":"\\s"},
+  {"type":"Operator","value":"*"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"\u003c["},
+  {"type":"LiteralStringRegex","value":":-"},
+  {"type":"Punctuation","value":"]\u003e"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"LiteralStringEscape","value":"\\s"},
+  {"type":"Operator","value":"*"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"LiteralStringEscape","value":"\\w"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"something"},
+  {"type":"Punctuation","value":"'/"},
+  {"type":"Text","value":";\n\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"S"},
+  {"type":"Punctuation","value":"/"},
+  {"type":"LiteralStringRegex","value":"some"},
+  {"type":"Punctuation","value":"/"},
+  {"type":"LiteralStringDouble","value":"a"},
+  {"type":"Punctuation","value":"/"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"given"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$text"},
+  {"type":"Text","value":";\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"s"},
+  {"type":"Punctuation","value":"/"},
+  {"type":"LiteralStringRegex","value":"some"},
+  {"type":"Punctuation","value":"/"},
+  {"type":"LiteralStringDouble","value":"a"},
+  {"type":"Punctuation","value":"/"},
+  {"type":"Text","value":";\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"S"},
+  {"type":"Punctuation","value":"%"},
+  {"type":"LiteralStringRegex","value":"some"},
+  {"type":"Punctuation","value":"%"},
+  {"type":"LiteralStringDouble","value":"a"},
+  {"type":"Punctuation","value":"%"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"given"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$text"},
+  {"type":"Text","value":";\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$text"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"~~"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"s"},
+  {"type":"Punctuation","value":"/("},
+  {"type":"LiteralStringRegex","value":"some"},
+  {"type":"Punctuation","value":")"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"LiteralStringEscape","value":"\\d"},
+  {"type":"Operator","value":"+"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"NameVariable","value":"$\u003cvar\u003e"},
+  {"type":"Operator","value":"="},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameBuiltin","value":"alnum"},
+  {"type":"Punctuation","value":"\u003e/"},
+  {"type":"LiteralStringDouble","value":"a "},
+  {"type":"NameVariable","value":"$0"},
+  {"type":"Punctuation","value":"/"},
+  {"type":"Text","value":";\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$text"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"~~"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"s"},
+  {"type":"Punctuation","value":":"},
+  {"type":"NameAttribute","value":"Pos"},
+  {"type":"Punctuation","value":"("},
+  {"type":"LiteralNumberInteger","value":"2"},
+  {"type":"Punctuation","value":")/("},
+  {"type":"LiteralStringRegex","value":"some"},
+  {"type":"Punctuation","value":")/"},
+  {"type":"NameVariable","value":"$0"},
+  {"type":"Punctuation","value":"/"},
+  {"type":"Text","value":";\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$text"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"~~"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"s"},
+  {"type":"Punctuation","value":"%"},
+  {"type":"LiteralStringRegex","value":"some"},
+  {"type":"Punctuation","value":"%"},
+  {"type":"LiteralStringDouble","value":"a"},
+  {"type":"Punctuation","value":"%"},
+  {"type":"Text","value":";\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$text"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"~~"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"s"},
+  {"type":"Punctuation","value":"%"},
+  {"type":"LiteralStringRegex","value":"s"},
+  {"type":"Punctuation","value":"("},
+  {"type":"NameEntity","value":"."},
+  {"type":"Punctuation","value":")"},
+  {"type":"LiteralStringRegex","value":"me"},
+  {"type":"Punctuation","value":"%"},
+  {"type":"LiteralStringDouble","value":"a"},
+  {"type":"NameVariable","value":"$0"},
+  {"type":"Punctuation","value":"%"},
+  {"type":"Text","value":";\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$text"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"~~"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"s"},
+  {"type":"Punctuation","value":":"},
+  {"type":"NameAttribute","value":"r"},
+  {"type":"Punctuation","value":"/"},
+  {"type":"LiteralStringRegex","value":"some"},
+  {"type":"Punctuation","value":"/"},
+  {"type":"LiteralStringDouble","value":"a"},
+  {"type":"Punctuation","value":"/"},
+  {"type":"Text","value":";\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$text"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"~~"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"m"},
+  {"type":"Punctuation","value":"/"},
+  {"type":"NameEntity","value":"^"},
+  {"type":"LiteralStringRegex","value":"text "},
+  {"type":"Punctuation","value":"[:"},
+  {"type":"NameAttribute","value":"i"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"LiteralStringEscape","value":"\\d"},
+  {"type":"Operator","value":"+"},
+  {"type":"Punctuation","value":"]"},
+  {"type":"NameEntity","value":"$"},
+  {"type":"Punctuation","value":"/"},
+  {"type":"Text","value":";\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$text"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"~~"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"m"},
+  {"type":"Punctuation","value":":"},
+  {"type":"NameAttribute","value":"s"},
+  {"type":"Punctuation","value":"/"},
+  {"type":"NameEntity","value":"^"},
+  {"type":"Punctuation","value":"\u003c{"},
+  {"type":"LiteralNumberInteger","value":"2"},
+  {"type":"Operator","value":"+"},
+  {"type":"LiteralNumberInteger","value":"5"},
+  {"type":"Punctuation","value":"}\u003e"},
+  {"type":"NameEntity","value":"$"},
+  {"type":"Punctuation","value":"/"},
+  {"type":"Text","value":";\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$text"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"~~"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"m"},
+  {"type":"Punctuation","value":"%"},
+  {"type":"NameEntity","value":"^"},
+  {"type":"LiteralStringRegex","value":"text"},
+  {"type":"NameEntity","value":"$"},
+  {"type":"Punctuation","value":"%"},
+  {"type":"Text","value":";\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$text"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"~~"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"/"},
+  {"type":"NameEntity","value":"^"},
+  {"type":"LiteralStringRegex","value":"text"},
+  {"type":"NameEntity","value":"$"},
+  {"type":"Punctuation","value":"/"},
+  {"type":"Text","value":";\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$text"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"~~"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"tr"},
+  {"type":"Punctuation","value":"/"},
+  {"type":"LiteralStringRegex","value":"abcde"},
+  {"type":"Punctuation","value":"/"},
+  {"type":"LiteralStringDouble","value":"12345"},
+  {"type":"Punctuation","value":"/"},
+  {"type":"Text","value":";\n"},
+  {"type":"Keyword","value":"s"},
+  {"type":"Punctuation","value":"{"},
+  {"type":"LiteralStringEscape","value":"\\w"},
+  {"type":"Operator","value":"+"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"="},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"test"},
+  {"type":"Punctuation","value":"'"},
+  {"type":"Text","value":";\n\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Operator","value":"+"},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"NameConstant","value":"i"},
+  {"type":"Text","value":";\n\n"},
+  {"type":"Keyword","value":"CATCH"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Keyword","value":"when"},
+  {"type":"Text","value":" "},
+  {"type":"NameException","value":"X::AdHoc"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{}"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Keyword","value":"when"},
+  {"type":"Text","value":" "},
+  {"type":"NameException","value":"CX::Warn"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{}"},
+  {"type":"Text","value":"\n"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"Q"},
+  {"type":"LiteralStringAffix","value":":heredoc"},
+  {"type":"Punctuation","value":"｢FINISH｣;"},
+  {"type":"LiteralString","value":"\nsome long\ntext\nhere.\n"},
+  {"type":"Punctuation","value":"FINISH"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"NameVariableGlobal","value":"$*IN"},
+  {"type":"Operator","value":"."},
+  {"type":"NameBuiltin","value":"lines"},
+  {"type":"Operator","value":"."},
+  {"type":"NameBuiltin","value":"first"},
+  {"type":"Operator","value":":"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"."},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"OperatorWord","value":"and"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"."},
+  {"type":"NameBuiltin","value":"so"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"with"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"%a"},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Operator","value":"."},
+  {"type":"NameBuiltin","value":"Int"},
+  {"type":"Text","value":" "},
+  {"type":"OperatorWord","value":"cmp"},
+  {"type":"Text","value":" "},
+  {"type":"Name","value":"n"},
+  {"type":"Punctuation","value":"}}"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"Keyword","value":"#| "},
+  {"type":"LiteralStringDoc","value":"Grammar "},
+  {"type":"Keyword","value":"C"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"LiteralStringOther","value":"G"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringDoc","value":"\n"},
+  {"type":"Keyword","value":"grammar"},
+  {"type":"Text","value":" "},
+  {"type":"NameClass","value":"G"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Keyword","value":"rule"},
+  {"type":"Text","value":" "},
+  {"type":"NameFunction","value":"TOP"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameFunction","value":"function-define"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Keyword","value":"rule"},
+  {"type":"Text","value":" "},
+  {"type":"NameFunction","value":"function-define"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Operator","value":":"},
+  {"type":"KeywordDeclaration","value":"my"},
+  {"type":"Text","value":" \\"},
+  {"type":"Name","value":"var"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"="},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"something"},
+  {"type":"Punctuation","value":"'"},
+  {"type":"Text","value":";"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"sub"},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameFunction","value":"identifier"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":"\n            "},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"\""},
+  {"type":"LiteralStringDouble","value":"func "},
+  {"type":"Punctuation","value":"\""},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"~"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$\u003cidentifier\u003e"},
+  {"type":"Operator","value":"."},
+  {"type":"Keyword","value":"made"},
+  {"type":"Text","value":";\n            "},
+  {"type":"Keyword","value":"make"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$\u003cidentifier\u003e"},
+  {"type":"Operator","value":"."},
+  {"type":"Keyword","value":"made"},
+  {"type":"Text","value":";\n        "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"("},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameFunction","value":"parameter"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":")"},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"{"},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"}"},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringRegex","value":"\n        "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":" "},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"\""},
+  {"type":"LiteralStringDouble","value":"end "},
+  {"type":"Punctuation","value":"\""},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"~"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$/"},
+  {"type":"Operator","value":"."},
+  {"type":"Keyword","value":"made"},
+  {"type":"Text","value":"; "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"LiteralStringRegex","value":"\n    "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Keyword","value":"token"},
+  {"type":"Text","value":" "},
+  {"type":"NameFunction","value":"identifier"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"LiteralStringEscape","value":"\\w"},
+  {"type":"Operator","value":"+"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"make"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"~"},
+  {"type":"NameVariable","value":"$/"},
+  {"type":"Text","value":"; "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Keyword","value":"token"},
+  {"type":"Text","value":" "},
+  {"type":"NameFunction","value":"parameter"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"LiteralStringEscape","value":"\\w"},
+  {"type":"Operator","value":"+"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":" "},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"\""},
+  {"type":"LiteralStringDouble","value":"param "},
+  {"type":"Punctuation","value":"\""},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"~"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$/"},
+  {"type":"Text","value":"; "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Keyword","value":"token"},
+  {"type":"Text","value":" "},
+  {"type":"NameFunction","value":"token"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"LiteralStringEscape","value":"\\w"},
+  {"type":"Operator","value":"+"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":" "},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"\""},
+  {"type":"LiteralStringDouble","value":"param "},
+  {"type":"Punctuation","value":"\""},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"~"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$/"},
+  {"type":"Text","value":"; "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"Keyword","value":"use"},
+  {"type":"Text","value":" "},
+  {"type":"NameNamespace","value":"Some::Module"},
+  {"type":"Text","value":";\n"},
+  {"type":"Keyword","value":"use"},
+  {"type":"Text","value":" "},
+  {"type":"NameNamespace","value":"Some::Module"},
+  {"type":"Punctuation","value":":"},
+  {"type":"NameAttribute","value":"auth"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"LiteralString","value":"author"},
+  {"type":"Punctuation","value":"\u003e:"},
+  {"type":"NameAttribute","value":"ver"},
+  {"type":"Punctuation","value":"("},
+  {"type":"Keyword","value":"v"},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"NameEntity","value":".0.0"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Text","value":";\n\n"},
+  {"type":"NameFunction","value":"notes"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$trip:"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"\""},
+  {"type":"LiteralStringDouble","value":"Almost there"},
+  {"type":"Punctuation","value":"\""},
+  {"type":"Text","value":";\n\n"},
+  {"type":"NameLabel","value":"LABEL"},
+  {"type":"Operator","value":":"},
+  {"type":"Text","value":"\n"},
+  {"type":"Keyword","value":"for"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"LiteralString","value":"a b c"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":"\n"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"Keyword","value":"#|"},
+  {"type":"Punctuation","value":"[["},
+  {"type":"LiteralStringDoc","value":"\nmultiline pod declaration]\n"},
+  {"type":"Punctuation","value":"]]"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"Keyword","value":"grammar"},
+  {"type":"Text","value":" "},
+  {"type":"NameClass","value":"Calculator"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Keyword","value":"token"},
+  {"type":"Text","value":" "},
+  {"type":"NameFunction","value":"TOP"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameFunction","value":"calc-op"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n\n    "},
+  {"type":"Keyword","value":"proto"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"rule"},
+  {"type":"Text","value":" "},
+  {"type":"NameFunction","value":"calc-op"},
+  {"type":"Text","value":"          "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Operator","value":"*"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Keyword","value":"proto"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"rule"},
+  {"type":"Text","value":" "},
+  {"type":"NameFunction","value":"calc-op"},
+  {"type":"Punctuation","value":"("},
+  {"type":"NameVariable","value":"$a"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Text","value":"          "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Operator","value":"*"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Keyword","value":"rule"},
+  {"type":"Text","value":" "},
+  {"type":"NameFunction","value":"calc-op"},
+  {"type":"Punctuation","value":":"},
+  {"type":"NameAttribute","value":"sym"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"LiteralString","value":"add"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameFunction","value":"num"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"+"},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameFunction","value":"num"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Keyword","value":"rule"},
+  {"type":"Text","value":" "},
+  {"type":"NameFunction","value":"calc-op"},
+  {"type":"Punctuation","value":":"},
+  {"type":"NameAttribute","value":"sym"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"LiteralString","value":"add"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameFunction","value":"num"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":":"},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"+"},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameFunction","value":"num"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Keyword","value":"rule"},
+  {"type":"Text","value":" "},
+  {"type":"NameFunction","value":"calc-op"},
+  {"type":"Punctuation","value":":"},
+  {"type":"NameAttribute","value":"sym"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"LiteralString","value":"sub"},
+  {"type":"Punctuation","value":"\u003e("},
+  {"type":"NameVariable","value":"$a"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameFunction","value":"num"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringSingle","value":"-"},
+  {"type":"Punctuation","value":"'"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameFunction","value":"num"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n\n    "},
+  {"type":"Keyword","value":"token"},
+  {"type":"Text","value":" "},
+  {"type":"NameFunction","value":"num"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"LiteralStringEscape","value":"\\d"},
+  {"type":"Operator","value":"+"},
+  {"type":"LiteralStringRegex","value":" "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"Keyword","value":"class"},
+  {"type":"Text","value":" "},
+  {"type":"NameClass","value":"Calculations"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Keyword","value":"method"},
+  {"type":"Text","value":" "},
+  {"type":"NameFunction","value":"TOP"},
+  {"type":"Text","value":"              "},
+  {"type":"Punctuation","value":"("},
+  {"type":"NameVariable","value":"$/"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"make"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$\u003ccalc-op\u003e"},
+  {"type":"Operator","value":"."},
+  {"type":"Keyword","value":"made"},
+  {"type":"Text","value":"; "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Keyword","value":"method"},
+  {"type":"Text","value":" "},
+  {"type":"NameFunction","value":"calc-op"},
+  {"type":"Punctuation","value":":"},
+  {"type":"NameAttribute","value":"sym"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"LiteralString","value":"add"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"("},
+  {"type":"NameVariable","value":"$/"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"make"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"["},
+  {"type":"Operator","value":"+"},
+  {"type":"Punctuation","value":"]"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$\u003cnum\u003e"},
+  {"type":"Text","value":"; "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Keyword","value":"method"},
+  {"type":"Text","value":" "},
+  {"type":"NameFunction","value":"calc-op"},
+  {"type":"Punctuation","value":":"},
+  {"type":"NameAttribute","value":"sym"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"LiteralString","value":"sub"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"("},
+  {"type":"NameVariable","value":"$/"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"make"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"["},
+  {"type":"Operator","value":"-"},
+  {"type":"Punctuation","value":"]"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$\u003cnum\u003e"},
+  {"type":"Text","value":"; "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Keyword","value":"method"},
+  {"type":"Text","value":" "},
+  {"type":"NameFunction","value":"calc-op"},
+  {"type":"Punctuation","value":":"},
+  {"type":"NameAttribute","value":"sym"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"LiteralString","value":"sub"},
+  {"type":"Punctuation","value":"\u003e("},
+  {"type":"NameVariable","value":"$/"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"make"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"["},
+  {"type":"Operator","value":"-"},
+  {"type":"Punctuation","value":"]"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$\u003cnum\u003e"},
+  {"type":"Text","value":"; "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Keyword","value":"method"},
+  {"type":"Text","value":" "},
+  {"type":"NameFunction","value":"calc-op:sym"},
+  {"type":"Punctuation","value":"("},
+  {"type":"NameVariable","value":"$/"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"make"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"["},
+  {"type":"Operator","value":"-"},
+  {"type":"Punctuation","value":"]"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$\u003cnum\u003e"},
+  {"type":"Text","value":"; "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Keyword","value":"method"},
+  {"type":"Text","value":" "},
+  {"type":"NameFunction","value":"calc-op:sym"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"LiteralString","value":"sub"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"make"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"["},
+  {"type":"Operator","value":"-"},
+  {"type":"Punctuation","value":"]"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$\u003cnum\u003e"},
+  {"type":"Text","value":"; "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"NameBuiltin","value":"say"},
+  {"type":"Text","value":" "},
+  {"type":"Name","value":"Calculator"},
+  {"type":"Operator","value":"."},
+  {"type":"NameBuiltin","value":"parse"},
+  {"type":"Punctuation","value":"('"},
+  {"type":"LiteralStringSingle","value":"2 + 3"},
+  {"type":"Punctuation","value":"'"},
+  {"type":"Operator","value":","},
+  {"type":"Text","value":" "},
+  {"type":"LiteralString","value":"actions"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"=\u003e"},
+  {"type":"Text","value":" "},
+  {"type":"Name","value":"Calculations"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Operator","value":"."},
+  {"type":"Keyword","value":"made"},
+  {"type":"Text","value":";\n\n"},
+  {"type":"Keyword","value":"=finish"},
+  {"type":"LiteralStringDoc","value":"\n"},
+  {"type":"Keyword","value":"C"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"LiteralStringOther","value":"say"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringDoc","value":" Date.today.year;\n# Output: 2020\n"},
+  {"type":"Keyword","value":"B"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"GenericStrong","value":"say"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"LiteralStringDoc","value":" Date.today.later(:2years).year;"}
+]
diff --git a/lexers/testdata/solidity.expected b/lexers/testdata/solidity.expected
index fdc052a..0541d70 100644
--- a/lexers/testdata/solidity.expected
+++ b/lexers/testdata/solidity.expected
@@ -1,5 +1,5 @@
 [
-  {"type":"KeywordReserved","value":"pragma solidity"},
+  {"type":"Keyword","value":"pragma solidity"},
   {"type":"Text","value":" "},
   {"type":"Operator","value":"^"},
   {"type":"LiteralNumberInteger","value":"0"},
@@ -11,30 +11,30 @@
   {"type":"Text","value":"\n\n"},
   {"type":"KeywordDeclaration","value":"contract"},
   {"type":"Text","value":" "},
-  {"type":"Name","value":"ReactExample"},
+  {"type":"NameClass","value":"ReactExample"},
   {"type":"Text","value":" "},
   {"type":"Punctuation","value":"{"},
   {"type":"Text","value":"\n    "},
   {"type":"KeywordType","value":"address"},
   {"type":"Text","value":" "},
-  {"type":"KeywordReserved","value":"private"},
+  {"type":"Keyword","value":"private"},
   {"type":"Text","value":" "},
   {"type":"Name","value":"owner"},
   {"type":"Punctuation","value":";"},
   {"type":"Text","value":"\n    "},
   {"type":"KeywordType","value":"string"},
   {"type":"Text","value":" "},
-  {"type":"KeywordReserved","value":"public"},
+  {"type":"Keyword","value":"public"},
   {"type":"Text","value":" "},
   {"type":"Name","value":"you_awesome"},
   {"type":"Punctuation","value":";"},
   {"type":"Text","value":"\n    \n    "},
   {"type":"KeywordDeclaration","value":"function"},
   {"type":"Text","value":" "},
-  {"type":"Name","value":"ReactExample"},
+  {"type":"NameFunction","value":"ReactExample"},
   {"type":"Punctuation","value":"()"},
   {"type":"Text","value":" "},
-  {"type":"KeywordReserved","value":"public"},
+  {"type":"Keyword","value":"public"},
   {"type":"Text","value":" "},
   {"type":"Punctuation","value":"{"},
   {"type":"Text","value":"\n        "},
@@ -58,10 +58,10 @@
   {"type":"Text","value":"\n    \n    "},
   {"type":"KeywordDeclaration","value":"function"},
   {"type":"Text","value":" "},
-  {"type":"Name","value":"kill"},
+  {"type":"NameFunction","value":"kill"},
   {"type":"Punctuation","value":"()"},
   {"type":"Text","value":" "},
-  {"type":"KeywordReserved","value":"public"},
+  {"type":"Keyword","value":"public"},
   {"type":"Text","value":" "},
   {"type":"Punctuation","value":"{"},
   {"type":"Text","value":"\n        "},
@@ -85,9 +85,9 @@
   {"type":"Text","value":" "},
   {"type":"Punctuation","value":"()"},
   {"type":"Text","value":" "},
-  {"type":"KeywordReserved","value":"public"},
+  {"type":"Keyword","value":"public"},
   {"type":"Text","value":" "},
-  {"type":"KeywordReserved","value":"payable"},
+  {"type":"Keyword","value":"payable"},
   {"type":"Text","value":" "},
   {"type":"Punctuation","value":"{"},
   {"type":"Text","value":"\n        "},
diff --git a/lexers/testdata/svelte.actual b/lexers/testdata/svelte.actual
new file mode 100644
index 0000000..5bba9a6
--- /dev/null
+++ b/lexers/testdata/svelte.actual
@@ -0,0 +1,86 @@
+<script lang="typescript">
+	// Nested is defined elsewhere
+	import Nested from './Nested.svelte';
+
+	let src = 'example.png';
+	let name = 'world';
+
+	let names = [
+		{ id: 'id0001', name: 'Name 1' },
+		{ id: 'id0002', name: 'Name 2' },
+		{ id: 'id0003', name: 'Name 3' }
+	];
+</script>
+
+<style>
+	h1 {
+		color: red;
+		font-family: Arial, Helvetica, sans-serif;
+		font-size: 2em;
+	}
+</style>
+
+<style lang="sass">
+$color: red
+h1
+  color: $color
+  font-family: Arial, Helvetica, sans-serif
+  font-size: 2em
+</style>
+
+<h1>Hello {name}!</h1>
+<img {src} alt="Example image">
+
+<!-- import external component -->
+<Nested/>
+
+<ul>
+    {#each names as { id, name }, i}
+	<li>{name} ({id})</li>
+	{/each}
+</ul>
+
+<template>
+    <form on:submit|preventDefault="{submitSearch}">
+        <input type="search" bind:value="{name}" required />
+        <button type="submit">Search</button>
+    </form>
+
+    {#if porridge.temperature > 100}
+	<p>too hot!</p>
+    {:else if 80 > porridge.temperature}
+	<p>too cold!</p>
+    {:else}
+	<p>just right!</p>
+    {/if}
+
+    {#await promise}
+	<!-- promise is pending -->
+	<p>waiting for the promise to resolve...</p>
+    {:then value}
+	<!-- promise was fulfilled -->
+	<p>The value is {value}</p>
+    {:catch error}
+	<!-- promise was rejected -->
+	<p>Something went wrong: {error.message}</p>
+    {/await}
+
+    {#await promise then value}
+	<p>The value is {value}</p>
+    {/await}
+
+    {#await promise catch error}
+	<p>The error is {error}</p>
+    {/await}
+
+    {#key value}
+	<div transition:fade>{value}</div>
+    {/key}
+
+    <div class="blog-post">
+	    <h1>{post.title}</h1>
+	    {@html post.content}
+    </div>
+
+    {@debug user}
+</template>
\ No newline at end of file
diff --git a/lexers/testdata/svelte.expected b/lexers/testdata/svelte.expected
new file mode 100644
index 0000000..68358f0
--- /dev/null
+++ b/lexers/testdata/svelte.expected
@@ -0,0 +1,533 @@
+[
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameTag","value":"script"},
+  {"type":"Text","value":" "},
+  {"type":"NameAttribute","value":"lang"},
+  {"type":"Operator","value":"="},
+  {"type":"LiteralString","value":"\"typescript\""},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":"\n\t"},
+  {"type":"CommentSingle","value":"// Nested is defined elsewhere\n"},
+  {"type":"Text","value":"\t"},
+  {"type":"KeywordReserved","value":"import"},
+  {"type":"Text","value":" "},
+  {"type":"NameOther","value":"Nested"},
+  {"type":"Text","value":" "},
+  {"type":"KeywordReserved","value":"from"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralStringSingle","value":"'./Nested.svelte'"},
+  {"type":"Punctuation","value":";"},
+  {"type":"Text","value":"\n\n\t"},
+  {"type":"KeywordDeclaration","value":"let"},
+  {"type":"Text","value":" "},
+  {"type":"NameOther","value":"src"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"="},
+  {"type":"Text","value":" "},
+  {"type":"LiteralStringSingle","value":"'example.png'"},
+  {"type":"Punctuation","value":";"},
+  {"type":"Text","value":"\n\t"},
+  {"type":"KeywordDeclaration","value":"let"},
+  {"type":"Text","value":" "},
+  {"type":"NameOther","value":"name"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"="},
+  {"type":"Text","value":" "},
+  {"type":"LiteralStringSingle","value":"'world'"},
+  {"type":"Punctuation","value":";"},
+  {"type":"Text","value":"\n\n\t"},
+  {"type":"KeywordDeclaration","value":"let"},
+  {"type":"Text","value":" "},
+  {"type":"NameOther","value":"names"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"="},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"["},
+  {"type":"Text","value":"\n\t\t"},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":" "},
+  {"type":"NameOther","value":"id"},
+  {"type":"Operator","value":":"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralStringSingle","value":"'id0001'"},
+  {"type":"Punctuation","value":","},
+  {"type":"Text","value":" "},
+  {"type":"NameOther","value":"name"},
+  {"type":"Operator","value":":"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralStringSingle","value":"'Name 1'"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"},"},
+  {"type":"Text","value":"\n\t\t"},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":" "},
+  {"type":"NameOther","value":"id"},
+  {"type":"Operator","value":":"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralStringSingle","value":"'id0002'"},
+  {"type":"Punctuation","value":","},
+  {"type":"Text","value":" "},
+  {"type":"NameOther","value":"name"},
+  {"type":"Operator","value":":"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralStringSingle","value":"'Name 2'"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"},"},
+  {"type":"Text","value":"\n\t\t"},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":" "},
+  {"type":"NameOther","value":"id"},
+  {"type":"Operator","value":":"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralStringSingle","value":"'id0003'"},
+  {"type":"Punctuation","value":","},
+  {"type":"Text","value":" "},
+  {"type":"NameOther","value":"name"},
+  {"type":"Operator","value":":"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralStringSingle","value":"'Name 3'"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n\t"},
+  {"type":"Punctuation","value":"];"},
+  {"type":"Text","value":"\n"},
+  {"type":"Punctuation","value":"\u003c/"},
+  {"type":"NameTag","value":"script"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameTag","value":"style"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":"\n\t"},
+  {"type":"NameTag","value":"h1"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":"\n\t\t"},
+  {"type":"Keyword","value":"color"},
+  {"type":"Punctuation","value":":"},
+  {"type":"Text","value":" "},
+  {"type":"KeywordConstant","value":"red"},
+  {"type":"Punctuation","value":";"},
+  {"type":"Text","value":"\n\t\t"},
+  {"type":"Keyword","value":"font-family"},
+  {"type":"Punctuation","value":":"},
+  {"type":"Text","value":" "},
+  {"type":"Name","value":"Arial"},
+  {"type":"Punctuation","value":","},
+  {"type":"Text","value":" "},
+  {"type":"Name","value":"Helvetica"},
+  {"type":"Punctuation","value":","},
+  {"type":"Text","value":" "},
+  {"type":"KeywordConstant","value":"sans-serif"},
+  {"type":"Punctuation","value":";"},
+  {"type":"Text","value":"\n\t\t"},
+  {"type":"Keyword","value":"font-size"},
+  {"type":"Punctuation","value":":"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"2"},
+  {"type":"KeywordType","value":"em"},
+  {"type":"Punctuation","value":";"},
+  {"type":"Text","value":"\n\t"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n"},
+  {"type":"Punctuation","value":"\u003c/"},
+  {"type":"NameTag","value":"style"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameTag","value":"style"},
+  {"type":"Text","value":" "},
+  {"type":"NameAttribute","value":"lang"},
+  {"type":"Operator","value":"="},
+  {"type":"LiteralString","value":"\"sass\""},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":"\n"},
+  {"type":"NameVariable","value":"$color"},
+  {"type":"Operator","value":":"},
+  {"type":"Text","value":" "},
+  {"type":"NameEntity","value":"red"},
+  {"type":"Text","value":"\n"},
+  {"type":"NameTag","value":"h1"},
+  {"type":"Text","value":"\n"},
+  {"type":"Error","value":"  "},
+  {"type":"NameAttribute","value":"color"},
+  {"type":"Operator","value":":"},
+  {"type":"Text","value":" "},
+  {"type":"NameVariable","value":"$color"},
+  {"type":"Text","value":"\n"},
+  {"type":"Error","value":"  "},
+  {"type":"NameAttribute","value":"font-family"},
+  {"type":"Operator","value":":"},
+  {"type":"Text","value":" "},
+  {"type":"Name","value":"Arial"},
+  {"type":"Operator","value":","},
+  {"type":"Text","value":" "},
+  {"type":"Name","value":"Helvetica"},
+  {"type":"Operator","value":","},
+  {"type":"Text","value":" "},
+  {"type":"NameConstant","value":"sans-serif"},
+  {"type":"Text","value":"\n"},
+  {"type":"Error","value":"  "},
+  {"type":"NameAttribute","value":"font-size"},
+  {"type":"Operator","value":":"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"2"},
+  {"type":"KeywordType","value":"em"},
+  {"type":"Text","value":"\n"},
+  {"type":"Punctuation","value":"\u003c/"},
+  {"type":"NameTag","value":"style"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameTag","value":"h1"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":"Hello "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"NameOther","value":"name"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"!"},
+  {"type":"Punctuation","value":"\u003c/"},
+  {"type":"NameTag","value":"h1"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":"\n"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameTag","value":"img"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"NameOther","value":"src"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":" "},
+  {"type":"NameAttribute","value":"alt"},
+  {"type":"Operator","value":"="},
+  {"type":"LiteralString","value":"\"Example image\""},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"Comment","value":"\u003c!-- import external component --\u003e"},
+  {"type":"Text","value":"\n"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameTag","value":"Nested"},
+  {"type":"Punctuation","value":"/\u003e"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameTag","value":"ul"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Keyword","value":"#each"},
+  {"type":"Text","value":" "},
+  {"type":"NameOther","value":"names"},
+  {"type":"Text","value":" "},
+  {"type":"KeywordReserved","value":"as"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Text","value":" "},
+  {"type":"NameOther","value":"id"},
+  {"type":"Punctuation","value":","},
+  {"type":"Text","value":" "},
+  {"type":"NameOther","value":"name"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"},"},
+  {"type":"Text","value":" "},
+  {"type":"NameOther","value":"i"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n\t"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameTag","value":"li"},
+  {"type":"Punctuation","value":"\u003e{"},
+  {"type":"NameOther","value":"name"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":" ("},
+  {"type":"Punctuation","value":"{"},
+  {"type":"NameOther","value":"id"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":")"},
+  {"type":"Punctuation","value":"\u003c/"},
+  {"type":"NameTag","value":"li"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":"\n\t"},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Keyword","value":"/each"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n"},
+  {"type":"Punctuation","value":"\u003c/"},
+  {"type":"NameTag","value":"ul"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameTag","value":"template"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameTag","value":"form"},
+  {"type":"Text","value":" "},
+  {"type":"NameAttribute","value":"on:submit"},
+  {"type":"Operator","value":"|"},
+  {"type":"NameAttribute","value":"preventDefault"},
+  {"type":"Operator","value":"="},
+  {"type":"LiteralString","value":"\""},
+  {"type":"Punctuation","value":"{"},
+  {"type":"NameOther","value":"submitSearch"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"LiteralString","value":"\""},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":"\n        "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameTag","value":"input"},
+  {"type":"Text","value":" "},
+  {"type":"NameAttribute","value":"type"},
+  {"type":"Operator","value":"="},
+  {"type":"LiteralString","value":"\"search\""},
+  {"type":"Text","value":" "},
+  {"type":"NameAttribute","value":"bind:value"},
+  {"type":"Operator","value":"="},
+  {"type":"LiteralString","value":"\""},
+  {"type":"Punctuation","value":"{"},
+  {"type":"NameOther","value":"name"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"LiteralString","value":"\""},
+  {"type":"Text","value":" "},
+  {"type":"NameAttribute","value":"required"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"/\u003e"},
+  {"type":"Text","value":"\n        "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameTag","value":"button"},
+  {"type":"Text","value":" "},
+  {"type":"NameAttribute","value":"type"},
+  {"type":"Operator","value":"="},
+  {"type":"LiteralString","value":"\"submit\""},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":"Search"},
+  {"type":"Punctuation","value":"\u003c/"},
+  {"type":"NameTag","value":"button"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Punctuation","value":"\u003c/"},
+  {"type":"NameTag","value":"form"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":"\n\n    "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Keyword","value":"#if"},
+  {"type":"Text","value":" "},
+  {"type":"NameOther","value":"porridge"},
+  {"type":"Punctuation","value":"."},
+  {"type":"NameOther","value":"temperature"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"\u003e"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"100"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n\t"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameTag","value":"p"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":"too hot!"},
+  {"type":"Punctuation","value":"\u003c/"},
+  {"type":"NameTag","value":"p"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Keyword","value":":else"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"if"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"80"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"\u003e"},
+  {"type":"Text","value":" "},
+  {"type":"NameOther","value":"porridge"},
+  {"type":"Punctuation","value":"."},
+  {"type":"NameOther","value":"temperature"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n\t"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameTag","value":"p"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":"too cold!"},
+  {"type":"Punctuation","value":"\u003c/"},
+  {"type":"NameTag","value":"p"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Operator","value":":"},
+  {"type":"Keyword","value":"else"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n\t"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameTag","value":"p"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":"just right!"},
+  {"type":"Punctuation","value":"\u003c/"},
+  {"type":"NameTag","value":"p"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Keyword","value":"/if"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n\n    "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Keyword","value":"#await"},
+  {"type":"Text","value":" "},
+  {"type":"NameOther","value":"promise"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n\t"},
+  {"type":"Comment","value":"\u003c!-- promise is pending --\u003e"},
+  {"type":"Text","value":"\n\t"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameTag","value":"p"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":"waiting for the promise to resolve..."},
+  {"type":"Punctuation","value":"\u003c/"},
+  {"type":"NameTag","value":"p"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Keyword","value":":then"},
+  {"type":"Text","value":" "},
+  {"type":"NameOther","value":"value"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n\t"},
+  {"type":"Comment","value":"\u003c!-- promise was fulfilled --\u003e"},
+  {"type":"Text","value":"\n\t"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameTag","value":"p"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":"The value is "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"NameOther","value":"value"},
+  {"type":"Punctuation","value":"}\u003c/"},
+  {"type":"NameTag","value":"p"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Keyword","value":":catch"},
+  {"type":"Text","value":" "},
+  {"type":"NameOther","value":"error"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n\t"},
+  {"type":"Comment","value":"\u003c!-- promise was rejected --\u003e"},
+  {"type":"Text","value":"\n\t"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameTag","value":"p"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":"Something went wrong: "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"NameOther","value":"error"},
+  {"type":"Punctuation","value":"."},
+  {"type":"NameOther","value":"message"},
+  {"type":"Punctuation","value":"}\u003c/"},
+  {"type":"NameTag","value":"p"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Keyword","value":"/await"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n\n    "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Keyword","value":"#await"},
+  {"type":"Text","value":" "},
+  {"type":"NameOther","value":"promise"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"then"},
+  {"type":"Text","value":" "},
+  {"type":"NameOther","value":"value"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n\t"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameTag","value":"p"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":"The value is "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"NameOther","value":"value"},
+  {"type":"Punctuation","value":"}\u003c/"},
+  {"type":"NameTag","value":"p"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Keyword","value":"/await"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n\n    "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Keyword","value":"#await"},
+  {"type":"Text","value":" "},
+  {"type":"NameOther","value":"promise"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"catch"},
+  {"type":"Text","value":" "},
+  {"type":"NameOther","value":"error"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n\t"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameTag","value":"p"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":"The error is "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"NameOther","value":"error"},
+  {"type":"Punctuation","value":"}\u003c/"},
+  {"type":"NameTag","value":"p"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Keyword","value":"/await"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n\n    "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Keyword","value":"#key"},
+  {"type":"Text","value":" "},
+  {"type":"NameOther","value":"value"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n\t"},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameTag","value":"div"},
+  {"type":"Text","value":" "},
+  {"type":"NameAttribute","value":"transition:fade"},
+  {"type":"Punctuation","value":"\u003e{"},
+  {"type":"NameOther","value":"value"},
+  {"type":"Punctuation","value":"}\u003c/"},
+  {"type":"NameTag","value":"div"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Keyword","value":"/key"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n\n    "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameTag","value":"div"},
+  {"type":"Text","value":" "},
+  {"type":"NameAttribute","value":"class"},
+  {"type":"Operator","value":"="},
+  {"type":"LiteralString","value":"\"blog-post\""},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":"\n\t    "},
+  {"type":"Punctuation","value":"\u003c"},
+  {"type":"NameTag","value":"h1"},
+  {"type":"Punctuation","value":"\u003e{"},
+  {"type":"NameOther","value":"post"},
+  {"type":"Punctuation","value":"."},
+  {"type":"NameOther","value":"title"},
+  {"type":"Punctuation","value":"}\u003c/"},
+  {"type":"NameTag","value":"h1"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":"\n\t    "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Keyword","value":"@html"},
+  {"type":"Text","value":" "},
+  {"type":"NameOther","value":"post"},
+  {"type":"Punctuation","value":"."},
+  {"type":"NameOther","value":"content"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n    "},
+  {"type":"Punctuation","value":"\u003c/"},
+  {"type":"NameTag","value":"div"},
+  {"type":"Punctuation","value":"\u003e"},
+  {"type":"Text","value":"\n\n    "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Keyword","value":"@debug"},
+  {"type":"Text","value":" "},
+  {"type":"NameOther","value":"user"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n"},
+  {"type":"Punctuation","value":"\u003c/"},
+  {"type":"NameTag","value":"template"},
+  {"type":"Punctuation","value":"\u003e"}
+]