Repository: alecthomas/chroma
Pull request #472 (2021-04-18 03:01:24)

Update Julia syntax highlighting from pygments
This PR is a mostly-automatic update based on pygments/pygments#1715 to update and improve Julia syntax highlighting. The specific sequence of changes is documented below to show where the automatic conversion from pygments was insufficient.

---

```bash
$ PYTHONPATH=~/devel/pygments/ \
    python3 _tools/pygments2chroma.py pygments.lexers.JuliaLexer \
    > lexers/j/julia_new.go

$ gofmt -s -w lexers/j/julia_new.go 
lexers/j/julia_new.go:41:36: escape sequence is invalid Unicode code point

$ sed -e 's@\\udbff\\udfff@\\U0010ffff@g' -i lexers/j/julia_new.go
$ gofmt -s -w lexers/j/julia_new.go 

# Copy and paste the contents of `Rules{` block from julia_new.go to julia.go
#   since the pygments2chroma.py converter does not create the lazy lexer
#   code format.

$ rm lexers/j/julia_new.go
```


Patch:
diff --git a/lexers/j/julia.go b/lexers/j/julia.go
index 6c9fc28..6ea954e 100644
--- a/lexers/j/julia.go
+++ b/lexers/j/julia.go
@@ -23,36 +23,44 @@ func juliaRules() Rules {
 			{`[^\S\n]+`, Text, nil},
 			{`#=`, CommentMultiline, Push("blockcomment")},
 			{`#.*$`, Comment, nil},
-			{`[\[\]{}(),;]`, Punctuation, nil},
-			{`in\b`, KeywordPseudo, nil},
-			{`isa\b`, KeywordPseudo, nil},
-			{`(true|false)\b`, KeywordConstant, nil},
-			{`(local|global|const)\b`, KeywordDeclaration, nil},
-			{Words(``, `\b`, `function`, `abstract type`, `primitive type`, `baremodule`, `begin`, `bitstype`, `break`, `catch`, `ccall`, `continue`, `do`, `else`, `elseif`, `end`, `export`, `finally`, `for`, `if`, `import`, `let`, `macro`, `module`, `mutable`, `quote`, `return`, `struct`, `try`, `using`, `while`), Keyword, nil},
-			{Words(``, `\b`, `ASCIIString`, `AbstractArray`, `AbstractChannel`, `AbstractDict`, `AbstractFloat`, `AbstractMatrix`, `AbstractRNG`, `AbstractSparseArray`, `AbstractSparseMatrix`, `AbstractSparseVector`, `AbstractString`, `AbstractVecOrMat`, `AbstractVector`, `Any`, `ArgumentError`, `Array`, `AssertionError`, `Base64DecodePipe`, `Base64EncodePipe`, `Bidiagonal`, `BigFloat`, `BigInt`, `BitArray`, `BitMatrix`, `BitVector`, `Bool`, `BoundsError`, `Box`, `BufferStream`, `CapturedException`, `CartesianIndex`, `CartesianRange`, `Cchar`, `Cdouble`, `Cfloat`, `Channel`, `Char`, `Cint`, `Cintmax_t`, `Clong`, `Clonglong`, `ClusterManager`, `Cmd`, `Coff_t`, `Colon`, `Complex`, `Complex128`, `Complex32`, `Complex64`, `CompositeException`, `Condition`, `Cptrdiff_t`, `Cshort`, `Csize_t`, `Cssize_t`, `Cstring`, `Cuchar`, `Cuint`, `Cuintmax_t`, `Culong`, `Culonglong`, `Cushort`, `Cwchar_t`, `Cwstring`, `DataType`, `Date`, `DateTime`, `DenseArray`, `DenseMatrix`, `DenseVecOrMat`, `DenseVector`, `Diagonal`, `Dict`, `DimensionMismatch`, `Dims`, `DirectIndexString`, `Display`, `DivideError`, `DomainError`, `EOFError`, `EachLine`, `Enum`, `Enumerate`, `ErrorException`, `Exception`, `Expr`, `Factorization`, `FileMonitor`, `FileOffset`, `Filter`, `Float16`, `Float32`, `Float64`, `FloatRange`, `Function`, `GenSym`, `GlobalRef`, `GotoNode`, `HTML`, `Hermitian`, `IO`, `IOBuffer`, `IOStream`, `IPv4`, `IPv6`, `InexactError`, `InitError`, `Int`, `Int128`, `Int16`, `Int32`, `Int64`, `Int8`, `IntSet`, `Integer`, `InterruptException`, `IntrinsicFunction`, `InvalidStateException`, `Irrational`, `KeyError`, `LabelNode`, `LambdaStaticData`, `LinSpace`, `LineNumberNode`, `LoadError`, `LocalProcess`, `LowerTriangular`, `MIME`, `Matrix`, `MersenneTwister`, `Method`, `MethodError`, `MethodTable`, `Module`, `NTuple`, `NewvarNode`, `NullException`, `Nullable`, `Number`, `ObjectIdDict`, `OrdinalRange`, `OutOfMemoryError`, `OverflowError`, `Pair`, `ParseError`, `PartialQuickSort`, `Pipe`, `PollingFileWatcher`, `ProcessExitedException`, `ProcessGroup`, `Ptr`, `QuoteNode`, `RandomDevice`, `Range`, `Rational`, `RawFD`, `ReadOnlyMemoryError`, `Real`, `ReentrantLock`, `Ref`, `Regex`, `RegexMatch`, `RemoteException`, `RemoteRef`, `RepString`, `RevString`, `RopeString`, `RoundingMode`, `SegmentationFault`, `SerializationState`, `Set`, `SharedArray`, `SharedMatrix`, `SharedVector`, `Signed`, `SimpleVector`, `SparseMatrixCSC`, `StackOverflowError`, `StatStruct`, `StepRange`, `StridedArray`, `StridedMatrix`, `StridedVecOrMat`, `StridedVector`, `SubArray`, `SubString`, `SymTridiagonal`, `Symbol`, `SymbolNode`, `Symmetric`, `SystemError`, `TCPSocket`, `Task`, `Text`, `TextDisplay`, `Timer`, `TopNode`, `Tridiagonal`, `Tuple`, `Type`, `TypeConstructor`, `TypeError`, `TypeName`, `TypeVar`, `UDPSocket`, `UInt`, `UInt128`, `UInt16`, `UInt32`, `UInt64`, `UInt8`, `UTF16String`, `UTF32String`, `UTF8String`, `UndefRefError`, `UndefVarError`, `UnicodeError`, `UniformScaling`, `Union`, `UnitRange`, `Unsigned`, `UpperTriangular`, `Val`, `Vararg`, `VecOrMat`, `Vector`, `VersionNumber`, `Void`, `WString`, `WeakKeyDict`, `WeakRef`, `WorkerConfig`, `Zip`), KeywordType, nil},
-			{Words(``, `\b`, `ARGS`, `CPU_CORES`, `C_NULL`, `DevNull`, `ENDIAN_BOM`, `ENV`, `I`, `Inf`, `Inf16`, `Inf32`, `Inf64`, `InsertionSort`, `JULIA_HOME`, `LOAD_PATH`, `MergeSort`, `NaN`, `NaN16`, `NaN32`, `NaN64`, `OS_NAME`, `QuickSort`, `RoundDown`, `RoundFromZero`, `RoundNearest`, `RoundNearestTiesAway`, `RoundNearestTiesUp`, `RoundToZero`, `RoundUp`, `STDERR`, `STDIN`, `STDOUT`, `VERSION`, `WORD_SIZE`, `catalan`, `e`, `eu`, `eulergamma`, `golden`, `im`, `nothing`, `pi`, `γ`, `π`, `φ`), NameBuiltin, nil},
-			{Words(``, ``, `=`, `:=`, `+=`, `-=`, `*=`, `/=`, `//=`, `.//=`, `.*=`, `./=`, `\=`, `.\=`, `^=`, `.^=`, `÷=`, `.÷=`, `%=`, `.%=`, `|=`, `&=`, `$=`, `=>`, `<<=`, `>>=`, `>>>=`, `~`, `.+=`, `.-=`, `?`, `--`, `-->`, `||`, `&&`, `>`, `<`, `>=`, `≥`, `<=`, `≤`, `==`, `===`, `≡`, `!=`, `≠`, `!==`, `≢`, `.>`, `.<`, `.>=`, `.≥`, `.<=`, `.≤`, `.==`, `.!=`, `.≠`, `.=`, `.!`, `<:`, `>:`, `∈`, `∉`, `∋`, `∌`, `⊆`, `⊈`, `⊂`, `⊄`, `⊊`, `|>`, `<|`, `:`, `+`, `-`, `.+`, `.-`, `|`, `∪`, `$`, `<<`, `>>`, `>>>`, `.<<`, `.>>`, `.>>>`, `*`, `/`, `./`, `÷`, `.÷`, `%`, `⋅`, `.%`, `.*`, `\`, `.\`, `&`, `∩`, `//`, `.//`, `^`, `.^`, `::`, `.`, `+`, `-`, `!`, `√`, `∛`, `∜`), Operator, nil},
+			{`[\[\](),;]`, Punctuation, nil},
+			{`((?:[a-zA-Z_¡-􏿿][a-zA-Z_0-9!¡-􏿿]*))(\s*)(:)((?:[a-zA-Z_¡-􏿿][a-zA-Z_0-9!¡-􏿿]*))`, ByGroups(Name, Text, Operator, Name), nil},
+			{`(?<![\]):<>\d.])(:(?:[a-zA-Z_¡-􏿿][a-zA-Z_0-9!¡-􏿿]*))`, LiteralStringSymbol, nil},
+			{`(?<=::)(\s*)((?:[a-zA-Z_¡-􏿿][a-zA-Z_0-9!¡-􏿿]*))\b(?![(\[])`, ByGroups(Text, KeywordType), nil},
+			{`((?:[a-zA-Z_¡-􏿿][a-zA-Z_0-9!¡-􏿿]*))(\s*)([<>]:)(\s*)((?:[a-zA-Z_¡-􏿿][a-zA-Z_0-9!¡-􏿿]*))\b(?![(\[])`, ByGroups(KeywordType, Text, Operator, Text, KeywordType), nil},
+			{`([<>]:)(\s*)((?:[a-zA-Z_¡-􏿿][a-zA-Z_0-9!¡-􏿿]*))\b(?![(\[])`, ByGroups(Operator, Text, KeywordType), nil},
+			{`\b((?:[a-zA-Z_¡-􏿿][a-zA-Z_0-9!¡-􏿿]*))(\s*)([<>]:)`, ByGroups(KeywordType, Text, Operator), nil},
+			{Words(``, `[²³¹ʰʲʳʷʸˡˢˣᴬᴮᴰᴱᴳᴴᴵᴶᴷᴸᴹᴺᴼᴾᴿᵀᵁᵂᵃᵇᵈᵉᵍᵏᵐᵒᵖᵗᵘᵛᵝᵞᵟᵠᵡᵢᵣᵤᵥᵦᵧᵨᵩᵪᶜᶠᶥᶦᶫᶰᶸᶻᶿ′″‴‵‶‷⁗⁰ⁱ⁴⁵⁶⁷⁸⁹⁺⁻⁼⁽⁾ⁿ₀₁₂₃₄₅₆₇₈₉₊₋₌₍₎ₐₑₒₓₕₖₗₘₙₚₛₜⱼⱽ]*`, `->`, `:=`, `$=`, `?`, `||`, `&&`, `:`, `$`, `::`, `=`, `+=`, `-=`, `*=`, `/=`, `//=`, `\=`, `^=`, `÷=`, `%=`, `<<=`, `>>=`, `>>>=`, `|=`, `&=`, `⊻=`, `≔`, `⩴`, `≕'`, `~`, `=>`, `→`, `↔`, `↚`, `↛`, `↞`, `↠`, `↢`, `↣`, `↦`, `↤`, `↮`, `⇎`, `⇍`, `⇏`, `⇐`, `⇒`, `⇔`, `⇴`, `⇶`, `⇷`, `⇸`, `⇹`, `⇺`, `⇻`, `⇼`, `⇽`, `⇾`, `⇿`, `⟵`, `⟶`, `⟷`, `⟹`, `⟺`, `⟻`, `⟼`, `⟽`, `⟾`, `⟿`, `⤀`, `⤁`, `⤂`, `⤃`, `⤄`, `⤅`, `⤆`, `⤇`, `⤌`, `⤍`, `⤎`, `⤏`, `⤐`, `⤑`, `⤔`, `⤕`, `⤖`, `⤗`, `⤘`, `⤝`, `⤞`, `⤟`, `⤠`, `⥄`, `⥅`, `⥆`, `⥇`, `⥈`, `⥊`, `⥋`, `⥎`, `⥐`, `⥒`, `⥓`, `⥖`, `⥗`, `⥚`, `⥛`, `⥞`, `⥟`, `⥢`, `⥤`, `⥦`, `⥧`, `⥨`, `⥩`, `⥪`, `⥫`, `⥬`, `⥭`, `⥰`, `⧴`, `⬱`, `⬰`, `⬲`, `⬳`, `⬴`, `⬵`, `⬶`, `⬷`, `⬸`, `⬹`, `⬺`, `⬻`, `⬼`, `⬽`, `⬾`, `⬿`, `⭀`, `⭁`, `⭂`, `⭃`, `⭄`, `⭇`, `⭈`, `⭉`, `⭊`, `⭋`, `⭌`, `￩`, `￫`, `⇜`, `⇝`, `↜`, `↝`, `↩`, `↪`, `↫`, `↬`, `↼`, `↽`, `⇀`, `⇁`, `⇄`, `⇆`, `⇇`, `⇉`, `⇋`, `⇌`, `⇚`, `⇛`, `⇠`, `⇢`, `↷`, `↶`, `↺`, `↻`, `-->`, `<--`, `<-->`, `>`, `<`, `>=`, `≥`, `<=`, `≤`, `==`, `===`, `≡`, `!=`, `≠`, `!==`, `≢`, `∈`, `∉`, `∋`, `∌`, `⊆`, `⊈`, `⊂`, `⊄`, `⊊`, `∝`, `∊`, `∍`, `∥`, `∦`, `∷`, `∺`, `∻`, `∽`, `∾`, `≁`, `≃`, `≂`, `≄`, `≅`, `≆`, `≇`, `≈`, `≉`, `≊`, `≋`, `≌`, `≍`, `≎`, `≐`, `≑`, `≒`, `≓`, `≖`, `≗`, `≘`, `≙`, `≚`, `≛`, `≜`, `≝`, `≞`, `≟`, `≣`, `≦`, `≧`, `≨`, `≩`, `≪`, `≫`, `≬`, `≭`, `≮`, `≯`, `≰`, `≱`, `≲`, `≳`, `≴`, `≵`, `≶`, `≷`, `≸`, `≹`, `≺`, `≻`, `≼`, `≽`, `≾`, `≿`, `⊀`, `⊁`, `⊃`, `⊅`, `⊇`, `⊉`, `⊋`, `⊏`, `⊐`, `⊑`, `⊒`, `⊜`, `⊩`, `⊬`, `⊮`, `⊰`, `⊱`, `⊲`, `⊳`, `⊴`, `⊵`, `⊶`, `⊷`, `⋍`, `⋐`, `⋑`, `⋕`, `⋖`, `⋗`, `⋘`, `⋙`, `⋚`, `⋛`, `⋜`, `⋝`, `⋞`, `⋟`, `⋠`, `⋡`, `⋢`, `⋣`, `⋤`, `⋥`, `⋦`, `⋧`, `⋨`, `⋩`, `⋪`, `⋫`, `⋬`, `⋭`, `⋲`, `⋳`, `⋴`, `⋵`, `⋶`, `⋷`, `⋸`, `⋹`, `⋺`, `⋻`, `⋼`, `⋽`, `⋾`, `⋿`, `⟈`, `⟉`, `⟒`, `⦷`, `⧀`, `⧁`, `⧡`, `⧣`, `⧤`, `⧥`, `⩦`, `⩧`, `⩪`, `⩫`, `⩬`, `⩭`, `⩮`, `⩯`, `⩰`, `⩱`, `⩲`, `⩳`, `⩵`, `⩶`, `⩷`, `⩸`, `⩹`, `⩺`, `⩻`, `⩼`, `⩽`, `⩾`, `⩿`, `⪀`, `⪁`, `⪂`, `⪃`, `⪄`, `⪅`, `⪆`, `⪇`, `⪈`, `⪉`, `⪊`, `⪋`, `⪌`, `⪍`, `⪎`, `⪏`, `⪐`, `⪑`, `⪒`, `⪓`, `⪔`, `⪕`, `⪖`, `⪗`, `⪘`, `⪙`, `⪚`, `⪛`, `⪜`, `⪝`, `⪞`, `⪟`, `⪠`, `⪡`, `⪢`, `⪣`, `⪤`, `⪥`, `⪦`, `⪧`, `⪨`, `⪩`, `⪪`, `⪫`, `⪬`, `⪭`, `⪮`, `⪯`, `⪰`, `⪱`, `⪲`, `⪳`, `⪴`, `⪵`, `⪶`, `⪷`, `⪸`, `⪹`, `⪺`, `⪻`, `⪼`, `⪽`, `⪾`, `⪿`, `⫀`, `⫁`, `⫂`, `⫃`, `⫄`, `⫅`, `⫆`, `⫇`, `⫈`, `⫉`, `⫊`, `⫋`, `⫌`, `⫍`, `⫎`, `⫏`, `⫐`, `⫑`, `⫒`, `⫓`, `⫔`, `⫕`, `⫖`, `⫗`, `⫘`, `⫙`, `⫷`, `⫸`, `⫹`, `⫺`, `⊢`, `⊣`, `⟂`, `<:`, `>:`, `<|`, `|>`, `…`, `⁝`, `⋮`, `⋱`, `⋰`, `⋯`, `+`, `-`, `¦`, `|`, `⊕`, `⊖`, `⊞`, `⊟`, `++`, `∪`, `∨`, `⊔`, `±`, `∓`, `∔`, `∸`, `≏`, `⊎`, `⊻`, `⊽`, `⋎`, `⋓`, `⧺`, `⧻`, `⨈`, `⨢`, `⨣`, `⨤`, `⨥`, `⨦`, `⨧`, `⨨`, `⨩`, `⨪`, `⨫`, `⨬`, `⨭`, `⨮`, `⨹`, `⨺`, `⩁`, `⩂`, `⩅`, `⩊`, `⩌`, `⩏`, `⩐`, `⩒`, `⩔`, `⩖`, `⩗`, `⩛`, `⩝`, `⩡`, `⩢`, `⩣`, `*`, `/`, `⌿`, `÷`, `%`, `&`, `⋅`, `∘`, `×`, `\`, `∩`, `∧`, `⊗`, `⊘`, `⊙`, `⊚`, `⊛`, `⊠`, `⊡`, `⊓`, `∗`, `∙`, `∤`, `⅋`, `≀`, `⊼`, `⋄`, `⋆`, `⋇`, `⋉`, `⋊`, `⋋`, `⋌`, `⋏`, `⋒`, `⟑`, `⦸`, `⦼`, `⦾`, `⦿`, `⧶`, `⧷`, `⨇`, `⨰`, `⨱`, `⨲`, `⨳`, `⨴`, `⨵`, `⨶`, `⨷`, `⨸`, `⨻`, `⨼`, `⨽`, `⩀`, `⩃`, `⩄`, `⩋`, `⩍`, `⩎`, `⩑`, `⩓`, `⩕`, `⩘`, `⩚`, `⩜`, `⩞`, `⩟`, `⩠`, `⫛`, `⊍`, `▷`, `⨝`, `⟕`, `⟖`, `⟗`, `⨟`, `//`, `>>`, `<<`, `>>>`, `^`, `↑`, `↓`, `⇵`, `⟰`, `⟱`, `⤈`, `⤉`, `⤊`, `⤋`, `⤒`, `⤓`, `⥉`, `⥌`, `⥍`, `⥏`, `⥑`, `⥔`, `⥕`, `⥘`, `⥙`, `⥜`, `⥝`, `⥠`, `⥡`, `⥣`, `⥥`, `⥮`, `⥯`, `￪`, `￬`, `!`, `¬`, `√`, `∛`, `∜`), Operator, nil},
+			{Words(``, `[²³¹ʰʲʳʷʸˡˢˣᴬᴮᴰᴱᴳᴴᴵᴶᴷᴸᴹᴺᴼᴾᴿᵀᵁᵂᵃᵇᵈᵉᵍᵏᵐᵒᵖᵗᵘᵛᵝᵞᵟᵠᵡᵢᵣᵤᵥᵦᵧᵨᵩᵪᶜᶠᶥᶦᶫᶰᶸᶻᶿ′″‴‵‶‷⁗⁰ⁱ⁴⁵⁶⁷⁸⁹⁺⁻⁼⁽⁾ⁿ₀₁₂₃₄₅₆₇₈₉₊₋₌₍₎ₐₑₒₓₕₖₗₘₙₚₛₜⱼⱽ]*`, `.=`, `.+=`, `.-=`, `.*=`, `./=`, `.//=`, `.\=`, `.^=`, `.÷=`, `.%=`, `.<<=`, `.>>=`, `.>>>=`, `.|=`, `.&=`, `.⊻=`, `.≔`, `.⩴`, `.≕'`, `.~`, `.=>`, `.→`, `.↔`, `.↚`, `.↛`, `.↞`, `.↠`, `.↢`, `.↣`, `.↦`, `.↤`, `.↮`, `.⇎`, `.⇍`, `.⇏`, `.⇐`, `.⇒`, `.⇔`, `.⇴`, `.⇶`, `.⇷`, `.⇸`, `.⇹`, `.⇺`, `.⇻`, `.⇼`, `.⇽`, `.⇾`, `.⇿`, `.⟵`, `.⟶`, `.⟷`, `.⟹`, `.⟺`, `.⟻`, `.⟼`, `.⟽`, `.⟾`, `.⟿`, `.⤀`, `.⤁`, `.⤂`, `.⤃`, `.⤄`, `.⤅`, `.⤆`, `.⤇`, `.⤌`, `.⤍`, `.⤎`, `.⤏`, `.⤐`, `.⤑`, `.⤔`, `.⤕`, `.⤖`, `.⤗`, `.⤘`, `.⤝`, `.⤞`, `.⤟`, `.⤠`, `.⥄`, `.⥅`, `.⥆`, `.⥇`, `.⥈`, `.⥊`, `.⥋`, `.⥎`, `.⥐`, `.⥒`, `.⥓`, `.⥖`, `.⥗`, `.⥚`, `.⥛`, `.⥞`, `.⥟`, `.⥢`, `.⥤`, `.⥦`, `.⥧`, `.⥨`, `.⥩`, `.⥪`, `.⥫`, `.⥬`, `.⥭`, `.⥰`, `.⧴`, `.⬱`, `.⬰`, `.⬲`, `.⬳`, `.⬴`, `.⬵`, `.⬶`, `.⬷`, `.⬸`, `.⬹`, `.⬺`, `.⬻`, `.⬼`, `.⬽`, `.⬾`, `.⬿`, `.⭀`, `.⭁`, `.⭂`, `.⭃`, `.⭄`, `.⭇`, `.⭈`, `.⭉`, `.⭊`, `.⭋`, `.⭌`, `.￩`, `.￫`, `.⇜`, `.⇝`, `.↜`, `.↝`, `.↩`, `.↪`, `.↫`, `.↬`, `.↼`, `.↽`, `.⇀`, `.⇁`, `.⇄`, `.⇆`, `.⇇`, `.⇉`, `.⇋`, `.⇌`, `.⇚`, `.⇛`, `.⇠`, `.⇢`, `.↷`, `.↶`, `.↺`, `.↻`, `.-->`, `.<--`, `.<-->`, `.>`, `.<`, `.>=`, `.≥`, `.<=`, `.≤`, `.==`, `.===`, `.≡`, `.!=`, `.≠`, `.!==`, `.≢`, `.∈`, `.∉`, `.∋`, `.∌`, `.⊆`, `.⊈`, `.⊂`, `.⊄`, `.⊊`, `.∝`, `.∊`, `.∍`, `.∥`, `.∦`, `.∷`, `.∺`, `.∻`, `.∽`, `.∾`, `.≁`, `.≃`, `.≂`, `.≄`, `.≅`, `.≆`, `.≇`, `.≈`, `.≉`, `.≊`, `.≋`, `.≌`, `.≍`, `.≎`, `.≐`, `.≑`, `.≒`, `.≓`, `.≖`, `.≗`, `.≘`, `.≙`, `.≚`, `.≛`, `.≜`, `.≝`, `.≞`, `.≟`, `.≣`, `.≦`, `.≧`, `.≨`, `.≩`, `.≪`, `.≫`, `.≬`, `.≭`, `.≮`, `.≯`, `.≰`, `.≱`, `.≲`, `.≳`, `.≴`, `.≵`, `.≶`, `.≷`, `.≸`, `.≹`, `.≺`, `.≻`, `.≼`, `.≽`, `.≾`, `.≿`, `.⊀`, `.⊁`, `.⊃`, `.⊅`, `.⊇`, `.⊉`, `.⊋`, `.⊏`, `.⊐`, `.⊑`, `.⊒`, `.⊜`, `.⊩`, `.⊬`, `.⊮`, `.⊰`, `.⊱`, `.⊲`, `.⊳`, `.⊴`, `.⊵`, `.⊶`, `.⊷`, `.⋍`, `.⋐`, `.⋑`, `.⋕`, `.⋖`, `.⋗`, `.⋘`, `.⋙`, `.⋚`, `.⋛`, `.⋜`, `.⋝`, `.⋞`, `.⋟`, `.⋠`, `.⋡`, `.⋢`, `.⋣`, `.⋤`, `.⋥`, `.⋦`, `.⋧`, `.⋨`, `.⋩`, `.⋪`, `.⋫`, `.⋬`, `.⋭`, `.⋲`, `.⋳`, `.⋴`, `.⋵`, `.⋶`, `.⋷`, `.⋸`, `.⋹`, `.⋺`, `.⋻`, `.⋼`, `.⋽`, `.⋾`, `.⋿`, `.⟈`, `.⟉`, `.⟒`, `.⦷`, `.⧀`, `.⧁`, `.⧡`, `.⧣`, `.⧤`, `.⧥`, `.⩦`, `.⩧`, `.⩪`, `.⩫`, `.⩬`, `.⩭`, `.⩮`, `.⩯`, `.⩰`, `.⩱`, `.⩲`, `.⩳`, `.⩵`, `.⩶`, `.⩷`, `.⩸`, `.⩹`, `.⩺`, `.⩻`, `.⩼`, `.⩽`, `.⩾`, `.⩿`, `.⪀`, `.⪁`, `.⪂`, `.⪃`, `.⪄`, `.⪅`, `.⪆`, `.⪇`, `.⪈`, `.⪉`, `.⪊`, `.⪋`, `.⪌`, `.⪍`, `.⪎`, `.⪏`, `.⪐`, `.⪑`, `.⪒`, `.⪓`, `.⪔`, `.⪕`, `.⪖`, `.⪗`, `.⪘`, `.⪙`, `.⪚`, `.⪛`, `.⪜`, `.⪝`, `.⪞`, `.⪟`, `.⪠`, `.⪡`, `.⪢`, `.⪣`, `.⪤`, `.⪥`, `.⪦`, `.⪧`, `.⪨`, `.⪩`, `.⪪`, `.⪫`, `.⪬`, `.⪭`, `.⪮`, `.⪯`, `.⪰`, `.⪱`, `.⪲`, `.⪳`, `.⪴`, `.⪵`, `.⪶`, `.⪷`, `.⪸`, `.⪹`, `.⪺`, `.⪻`, `.⪼`, `.⪽`, `.⪾`, `.⪿`, `.⫀`, `.⫁`, `.⫂`, `.⫃`, `.⫄`, `.⫅`, `.⫆`, `.⫇`, `.⫈`, `.⫉`, `.⫊`, `.⫋`, `.⫌`, `.⫍`, `.⫎`, `.⫏`, `.⫐`, `.⫑`, `.⫒`, `.⫓`, `.⫔`, `.⫕`, `.⫖`, `.⫗`, `.⫘`, `.⫙`, `.⫷`, `.⫸`, `.⫹`, `.⫺`, `.⊢`, `.⊣`, `.⟂`, `.<:`, `.>:`, `.<|`, `.|>`, `.…`, `.⁝`, `.⋮`, `.⋱`, `.⋰`, `.⋯`, `.+`, `.-`, `.¦`, `.|`, `.⊕`, `.⊖`, `.⊞`, `.⊟`, `.++`, `.∪`, `.∨`, `.⊔`, `.±`, `.∓`, `.∔`, `.∸`, `.≏`, `.⊎`, `.⊻`, `.⊽`, `.⋎`, `.⋓`, `.⧺`, `.⧻`, `.⨈`, `.⨢`, `.⨣`, `.⨤`, `.⨥`, `.⨦`, `.⨧`, `.⨨`, `.⨩`, `.⨪`, `.⨫`, `.⨬`, `.⨭`, `.⨮`, `.⨹`, `.⨺`, `.⩁`, `.⩂`, `.⩅`, `.⩊`, `.⩌`, `.⩏`, `.⩐`, `.⩒`, `.⩔`, `.⩖`, `.⩗`, `.⩛`, `.⩝`, `.⩡`, `.⩢`, `.⩣`, `.*`, `./`, `.⌿`, `.÷`, `.%`, `.&`, `.⋅`, `.∘`, `.×`, `.\`, `.∩`, `.∧`, `.⊗`, `.⊘`, `.⊙`, `.⊚`, `.⊛`, `.⊠`, `.⊡`, `.⊓`, `.∗`, `.∙`, `.∤`, `.⅋`, `.≀`, `.⊼`, `.⋄`, `.⋆`, `.⋇`, `.⋉`, `.⋊`, `.⋋`, `.⋌`, `.⋏`, `.⋒`, `.⟑`, `.⦸`, `.⦼`, `.⦾`, `.⦿`, `.⧶`, `.⧷`, `.⨇`, `.⨰`, `.⨱`, `.⨲`, `.⨳`, `.⨴`, `.⨵`, `.⨶`, `.⨷`, `.⨸`, `.⨻`, `.⨼`, `.⨽`, `.⩀`, `.⩃`, `.⩄`, `.⩋`, `.⩍`, `.⩎`, `.⩑`, `.⩓`, `.⩕`, `.⩘`, `.⩚`, `.⩜`, `.⩞`, `.⩟`, `.⩠`, `.⫛`, `.⊍`, `.▷`, `.⨝`, `.⟕`, `.⟖`, `.⟗`, `.⨟`, `.//`, `.>>`, `.<<`, `.>>>`, `.^`, `.↑`, `.↓`, `.⇵`, `.⟰`, `.⟱`, `.⤈`, `.⤉`, `.⤊`, `.⤋`, `.⤒`, `.⤓`, `.⥉`, `.⥌`, `.⥍`, `.⥏`, `.⥑`, `.⥔`, `.⥕`, `.⥘`, `.⥙`, `.⥜`, `.⥝`, `.⥠`, `.⥡`, `.⥣`, `.⥥`, `.⥮`, `.⥯`, `.￪`, `.￬`, `.!`, `.¬`, `.√`, `.∛`, `.∜`), Operator, nil},
+			{Words(``, ``, `...`, `..`), Operator, nil},
 			{`'(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,3}|\\u[a-fA-F0-9]{1,4}|\\U[a-fA-F0-9]{1,6}|[^\\\'\n])'`, LiteralStringChar, nil},
-			{`(?<=[.\w)\]])\'+`, Operator, nil},
-			{`"""`, LiteralString, Push("tqstring")},
-			{`"`, LiteralString, Push("string")},
-			{`r"""`, LiteralStringRegex, Push("tqregex")},
-			{`r"`, LiteralStringRegex, Push("regex")},
-			{"`", LiteralStringBacktick, Push("command")},
-			{`((?:[a-zA-Z_¡-￿]|[𐀀-􏿿])(?:[a-zA-Z_0-9¡-￿]|[𐀀-􏿿])*!*)(')?`, ByGroups(Name, Operator), nil},
-			{`(@(?:[a-zA-Z_¡-￿]|[𐀀-􏿿])(?:[a-zA-Z_0-9¡-￿]|[𐀀-􏿿])*!*)(')?`, ByGroups(NameDecorator, Operator), nil},
-			{`(\d+(_\d+)+\.\d*|\d*\.\d+(_\d+)+)([eEf][+-]?[0-9]+)?`, LiteralNumberFloat, nil},
-			{`(\d+\.\d*|\d*\.\d+)([eEf][+-]?[0-9]+)?`, LiteralNumberFloat, nil},
-			{`\d+(_\d+)+[eEf][+-]?[0-9]+`, LiteralNumberFloat, nil},
-			{`\d+[eEf][+-]?[0-9]+`, LiteralNumberFloat, nil},
-			{`0b[01]+(_[01]+)+`, LiteralNumberBin, nil},
-			{`0b[01]+`, LiteralNumberBin, nil},
-			{`0o[0-7]+(_[0-7]+)+`, LiteralNumberOct, nil},
-			{`0o[0-7]+`, LiteralNumberOct, nil},
-			{`0x[a-fA-F0-9]+(_[a-fA-F0-9]+)+`, LiteralNumberHex, nil},
-			{`0x[a-fA-F0-9]+`, LiteralNumberHex, nil},
-			{`\d+(_\d+)+`, LiteralNumberInteger, nil},
-			{`\d+`, LiteralNumberInteger, nil},
+			{`(?<=[.\w)\]])(\'[²³¹ʰʲʳʷʸˡˢˣᴬᴮᴰᴱᴳᴴᴵᴶᴷᴸᴹᴺᴼᴾᴿᵀᵁᵂᵃᵇᵈᵉᵍᵏᵐᵒᵖᵗᵘᵛᵝᵞᵟᵠᵡᵢᵣᵤᵥᵦᵧᵨᵩᵪᶜᶠᶥᶦᶫᶰᶸᶻᶿ′″‴‵‶‷⁗⁰ⁱ⁴⁵⁶⁷⁸⁹⁺⁻⁼⁽⁾ⁿ₀₁₂₃₄₅₆₇₈₉₊₋₌₍₎ₐₑₒₓₕₖₗₘₙₚₛₜⱼⱽ]*)+`, Operator, nil},
+			{`(raw)(""")`, ByGroups(LiteralStringAffix, LiteralString), Push("tqrawstring")},
+			{`(raw)(")`, ByGroups(LiteralStringAffix, LiteralString), Push("rawstring")},
+			{`(r)(""")`, ByGroups(LiteralStringAffix, LiteralStringRegex), Push("tqregex")},
+			{`(r)(")`, ByGroups(LiteralStringAffix, LiteralStringRegex), Push("regex")},
+			{`((?:[a-zA-Z_¡-􏿿][a-zA-Z_0-9!¡-􏿿]*))?(""")`, ByGroups(LiteralStringAffix, LiteralString), Push("tqstring")},
+			{`((?:[a-zA-Z_¡-􏿿][a-zA-Z_0-9!¡-􏿿]*))?(")`, ByGroups(LiteralStringAffix, LiteralString), Push("string")},
+			{"((?:[a-zA-Z_\u00a1-\U0010ffff][a-zA-Z_0-9!\u00a1-\U0010ffff]*))?(```)", ByGroups(LiteralStringAffix, LiteralStringBacktick), Push("tqcommand")},
+			{"((?:[a-zA-Z_\u00a1-\U0010ffff][a-zA-Z_0-9!\u00a1-\U0010ffff]*))?(`)", ByGroups(LiteralStringAffix, LiteralStringBacktick), Push("command")},
+			{`((?:[a-zA-Z_¡-􏿿][a-zA-Z_0-9!¡-􏿿]*))(\{)`, ByGroups(KeywordType, Punctuation), Push("curly")},
+			{`(where)(\s+)((?:[a-zA-Z_¡-􏿿][a-zA-Z_0-9!¡-􏿿]*))`, ByGroups(Keyword, Text, KeywordType), nil},
+			{`(\{)`, Punctuation, Push("curly")},
+			{`(abstract[ \t]+type|primitive[ \t]+type|mutable[ \t]+struct|struct)([\s()]+)((?:[a-zA-Z_¡-􏿿][a-zA-Z_0-9!¡-􏿿]*))`, ByGroups(Keyword, Text, KeywordType), nil},
+			{`@(?:[a-zA-Z_¡-􏿿][a-zA-Z_0-9!¡-􏿿]*)`, NameDecorator, nil},
+			{Words(`@`, `[²³¹ʰʲʳʷʸˡˢˣᴬᴮᴰᴱᴳᴴᴵᴶᴷᴸᴹᴺᴼᴾᴿᵀᵁᵂᵃᵇᵈᵉᵍᵏᵐᵒᵖᵗᵘᵛᵝᵞᵟᵠᵡᵢᵣᵤᵥᵦᵧᵨᵩᵪᶜᶠᶥᶦᶫᶰᶸᶻᶿ′″‴‵‶‷⁗⁰ⁱ⁴⁵⁶⁷⁸⁹⁺⁻⁼⁽⁾ⁿ₀₁₂₃₄₅₆₇₈₉₊₋₌₍₎ₐₑₒₓₕₖₗₘₙₚₛₜⱼⱽ]*`, `->`, `:=`, `$=`, `?`, `||`, `&&`, `:`, `$`, `::`, `..`, `.`, `=`, `+=`, `-=`, `*=`, `/=`, `//=`, `\=`, `^=`, `÷=`, `%=`, `<<=`, `>>=`, `>>>=`, `|=`, `&=`, `⊻=`, `≔`, `⩴`, `≕'`, `~`, `=>`, `→`, `↔`, `↚`, `↛`, `↞`, `↠`, `↢`, `↣`, `↦`, `↤`, `↮`, `⇎`, `⇍`, `⇏`, `⇐`, `⇒`, `⇔`, `⇴`, `⇶`, `⇷`, `⇸`, `⇹`, `⇺`, `⇻`, `⇼`, `⇽`, `⇾`, `⇿`, `⟵`, `⟶`, `⟷`, `⟹`, `⟺`, `⟻`, `⟼`, `⟽`, `⟾`, `⟿`, `⤀`, `⤁`, `⤂`, `⤃`, `⤄`, `⤅`, `⤆`, `⤇`, `⤌`, `⤍`, `⤎`, `⤏`, `⤐`, `⤑`, `⤔`, `⤕`, `⤖`, `⤗`, `⤘`, `⤝`, `⤞`, `⤟`, `⤠`, `⥄`, `⥅`, `⥆`, `⥇`, `⥈`, `⥊`, `⥋`, `⥎`, `⥐`, `⥒`, `⥓`, `⥖`, `⥗`, `⥚`, `⥛`, `⥞`, `⥟`, `⥢`, `⥤`, `⥦`, `⥧`, `⥨`, `⥩`, `⥪`, `⥫`, `⥬`, `⥭`, `⥰`, `⧴`, `⬱`, `⬰`, `⬲`, `⬳`, `⬴`, `⬵`, `⬶`, `⬷`, `⬸`, `⬹`, `⬺`, `⬻`, `⬼`, `⬽`, `⬾`, `⬿`, `⭀`, `⭁`, `⭂`, `⭃`, `⭄`, `⭇`, `⭈`, `⭉`, `⭊`, `⭋`, `⭌`, `￩`, `￫`, `⇜`, `⇝`, `↜`, `↝`, `↩`, `↪`, `↫`, `↬`, `↼`, `↽`, `⇀`, `⇁`, `⇄`, `⇆`, `⇇`, `⇉`, `⇋`, `⇌`, `⇚`, `⇛`, `⇠`, `⇢`, `↷`, `↶`, `↺`, `↻`, `-->`, `<--`, `<-->`, `>`, `<`, `>=`, `≥`, `<=`, `≤`, `==`, `===`, `≡`, `!=`, `≠`, `!==`, `≢`, `∈`, `∉`, `∋`, `∌`, `⊆`, `⊈`, `⊂`, `⊄`, `⊊`, `∝`, `∊`, `∍`, `∥`, `∦`, `∷`, `∺`, `∻`, `∽`, `∾`, `≁`, `≃`, `≂`, `≄`, `≅`, `≆`, `≇`, `≈`, `≉`, `≊`, `≋`, `≌`, `≍`, `≎`, `≐`, `≑`, `≒`, `≓`, `≖`, `≗`, `≘`, `≙`, `≚`, `≛`, `≜`, `≝`, `≞`, `≟`, `≣`, `≦`, `≧`, `≨`, `≩`, `≪`, `≫`, `≬`, `≭`, `≮`, `≯`, `≰`, `≱`, `≲`, `≳`, `≴`, `≵`, `≶`, `≷`, `≸`, `≹`, `≺`, `≻`, `≼`, `≽`, `≾`, `≿`, `⊀`, `⊁`, `⊃`, `⊅`, `⊇`, `⊉`, `⊋`, `⊏`, `⊐`, `⊑`, `⊒`, `⊜`, `⊩`, `⊬`, `⊮`, `⊰`, `⊱`, `⊲`, `⊳`, `⊴`, `⊵`, `⊶`, `⊷`, `⋍`, `⋐`, `⋑`, `⋕`, `⋖`, `⋗`, `⋘`, `⋙`, `⋚`, `⋛`, `⋜`, `⋝`, `⋞`, `⋟`, `⋠`, `⋡`, `⋢`, `⋣`, `⋤`, `⋥`, `⋦`, `⋧`, `⋨`, `⋩`, `⋪`, `⋫`, `⋬`, `⋭`, `⋲`, `⋳`, `⋴`, `⋵`, `⋶`, `⋷`, `⋸`, `⋹`, `⋺`, `⋻`, `⋼`, `⋽`, `⋾`, `⋿`, `⟈`, `⟉`, `⟒`, `⦷`, `⧀`, `⧁`, `⧡`, `⧣`, `⧤`, `⧥`, `⩦`, `⩧`, `⩪`, `⩫`, `⩬`, `⩭`, `⩮`, `⩯`, `⩰`, `⩱`, `⩲`, `⩳`, `⩵`, `⩶`, `⩷`, `⩸`, `⩹`, `⩺`, `⩻`, `⩼`, `⩽`, `⩾`, `⩿`, `⪀`, `⪁`, `⪂`, `⪃`, `⪄`, `⪅`, `⪆`, `⪇`, `⪈`, `⪉`, `⪊`, `⪋`, `⪌`, `⪍`, `⪎`, `⪏`, `⪐`, `⪑`, `⪒`, `⪓`, `⪔`, `⪕`, `⪖`, `⪗`, `⪘`, `⪙`, `⪚`, `⪛`, `⪜`, `⪝`, `⪞`, `⪟`, `⪠`, `⪡`, `⪢`, `⪣`, `⪤`, `⪥`, `⪦`, `⪧`, `⪨`, `⪩`, `⪪`, `⪫`, `⪬`, `⪭`, `⪮`, `⪯`, `⪰`, `⪱`, `⪲`, `⪳`, `⪴`, `⪵`, `⪶`, `⪷`, `⪸`, `⪹`, `⪺`, `⪻`, `⪼`, `⪽`, `⪾`, `⪿`, `⫀`, `⫁`, `⫂`, `⫃`, `⫄`, `⫅`, `⫆`, `⫇`, `⫈`, `⫉`, `⫊`, `⫋`, `⫌`, `⫍`, `⫎`, `⫏`, `⫐`, `⫑`, `⫒`, `⫓`, `⫔`, `⫕`, `⫖`, `⫗`, `⫘`, `⫙`, `⫷`, `⫸`, `⫹`, `⫺`, `⊢`, `⊣`, `⟂`, `<:`, `>:`, `<|`, `|>`, `…`, `⁝`, `⋮`, `⋱`, `⋰`, `⋯`, `+`, `-`, `¦`, `|`, `⊕`, `⊖`, `⊞`, `⊟`, `++`, `∪`, `∨`, `⊔`, `±`, `∓`, `∔`, `∸`, `≏`, `⊎`, `⊻`, `⊽`, `⋎`, `⋓`, `⧺`, `⧻`, `⨈`, `⨢`, `⨣`, `⨤`, `⨥`, `⨦`, `⨧`, `⨨`, `⨩`, `⨪`, `⨫`, `⨬`, `⨭`, `⨮`, `⨹`, `⨺`, `⩁`, `⩂`, `⩅`, `⩊`, `⩌`, `⩏`, `⩐`, `⩒`, `⩔`, `⩖`, `⩗`, `⩛`, `⩝`, `⩡`, `⩢`, `⩣`, `*`, `/`, `⌿`, `÷`, `%`, `&`, `⋅`, `∘`, `×`, `\`, `∩`, `∧`, `⊗`, `⊘`, `⊙`, `⊚`, `⊛`, `⊠`, `⊡`, `⊓`, `∗`, `∙`, `∤`, `⅋`, `≀`, `⊼`, `⋄`, `⋆`, `⋇`, `⋉`, `⋊`, `⋋`, `⋌`, `⋏`, `⋒`, `⟑`, `⦸`, `⦼`, `⦾`, `⦿`, `⧶`, `⧷`, `⨇`, `⨰`, `⨱`, `⨲`, `⨳`, `⨴`, `⨵`, `⨶`, `⨷`, `⨸`, `⨻`, `⨼`, `⨽`, `⩀`, `⩃`, `⩄`, `⩋`, `⩍`, `⩎`, `⩑`, `⩓`, `⩕`, `⩘`, `⩚`, `⩜`, `⩞`, `⩟`, `⩠`, `⫛`, `⊍`, `▷`, `⨝`, `⟕`, `⟖`, `⟗`, `⨟`, `//`, `>>`, `<<`, `>>>`, `^`, `↑`, `↓`, `⇵`, `⟰`, `⟱`, `⤈`, `⤉`, `⤊`, `⤋`, `⤒`, `⤓`, `⥉`, `⥌`, `⥍`, `⥏`, `⥑`, `⥔`, `⥕`, `⥘`, `⥙`, `⥜`, `⥝`, `⥠`, `⥡`, `⥣`, `⥥`, `⥮`, `⥯`, `￪`, `￬`, `!`, `¬`, `√`, `∛`, `∜`), NameDecorator, nil},
+			{Words(``, `\b`, `baremodule`, `begin`, `break`, `catch`, `ccall`, `const`, `continue`, `do`, `else`, `elseif`, `end`, `export`, `finally`, `for`, `function`, `global`, `if`, `import`, `in`, `isa`, `let`, `local`, `macro`, `module`, `quote`, `return`, `try`, `using`, `where`, `while`), Keyword, nil},
+			{Words(``, `\b`, `AbstractArray`, `AbstractChannel`, `AbstractChar`, `AbstractDict`, `AbstractDisplay`, `AbstractFloat`, `AbstractIrrational`, `AbstractMatch`, `AbstractMatrix`, `AbstractPattern`, `AbstractRange`, `AbstractSet`, `AbstractString`, `AbstractUnitRange`, `AbstractVecOrMat`, `AbstractVector`, `Any`, `ArgumentError`, `Array`, `AssertionError`, `BigFloat`, `BigInt`, `BitArray`, `BitMatrix`, `BitSet`, `BitVector`, `Bool`, `BoundsError`, `CapturedException`, `CartesianIndex`, `CartesianIndices`, `Cchar`, `Cdouble`, `Cfloat`, `Channel`, `Char`, `Cint`, `Cintmax_t`, `Clong`, `Clonglong`, `Cmd`, `Colon`, `Complex`, `ComplexF16`, `ComplexF32`, `ComplexF64`, `ComposedFunction`, `CompositeException`, `Condition`, `Cptrdiff_t`, `Cshort`, `Csize_t`, `Cssize_t`, `Cstring`, `Cuchar`, `Cuint`, `Cuintmax_t`, `Culong`, `Culonglong`, `Cushort`, `Cvoid`, `Cwchar_t`, `Cwstring`, `DataType`, `DenseArray`, `DenseMatrix`, `DenseVecOrMat`, `DenseVector`, `Dict`, `DimensionMismatch`, `Dims`, `DivideError`, `DomainError`, `EOFError`, `Enum`, `ErrorException`, `Exception`, `ExponentialBackOff`, `Expr`, `Float16`, `Float32`, `Float64`, `Function`, `GlobalRef`, `HTML`, `IO`, `IOBuffer`, `IOContext`, `IOStream`, `IdDict`, `IndexCartesian`, `IndexLinear`, `IndexStyle`, `InexactError`, `InitError`, `Int`, `Int128`, `Int16`, `Int32`, `Int64`, `Int8`, `Integer`, `InterruptException`, `InvalidStateException`, `Irrational`, `KeyError`, `LinRange`, `LineNumberNode`, `LinearIndices`, `LoadError`, `MIME`, `Matrix`, `Method`, `MethodError`, `Missing`, `MissingException`, `Module`, `NTuple`, `NamedTuple`, `Nothing`, `Number`, `OrdinalRange`, `OutOfMemoryError`, `OverflowError`, `Pair`, `PartialQuickSort`, `PermutedDimsArray`, `Pipe`, `ProcessFailedException`, `Ptr`, `QuoteNode`, `Rational`, `RawFD`, `ReadOnlyMemoryError`, `Real`, `ReentrantLock`, `Ref`, `Regex`, `RegexMatch`, `RoundingMode`, `SegmentationFault`, `Set`, `Signed`, `Some`, `StackOverflowError`, `StepRange`, `StepRangeLen`, `StridedArray`, `StridedMatrix`, `StridedVecOrMat`, `StridedVector`, `String`, `StringIndexError`, `SubArray`, `SubString`, `SubstitutionString`, `Symbol`, `SystemError`, `Task`, `TaskFailedException`, `Text`, `TextDisplay`, `Timer`, `Tuple`, `Type`, `TypeError`, `TypeVar`, `UInt`, `UInt128`, `UInt16`, `UInt32`, `UInt64`, `UInt8`, `UndefInitializer`, `UndefKeywordError`, `UndefRefError`, `UndefVarError`, `Union`, `UnionAll`, `UnitRange`, `Unsigned`, `Val`, `Vararg`, `VecElement`, `VecOrMat`, `Vector`, `VersionNumber`, `WeakKeyDict`, `WeakRef`), KeywordType, nil},
+			{Words(``, `\b`, `ARGS`, `C_NULL`, `DEPOT_PATH`, `ENDIAN_BOM`, `ENV`, `Inf`, `Inf16`, `Inf32`, `Inf64`, `InsertionSort`, `LOAD_PATH`, `MergeSort`, `NaN`, `NaN16`, `NaN32`, `NaN64`, `PROGRAM_FILE`, `QuickSort`, `RoundDown`, `RoundFromZero`, `RoundNearest`, `RoundNearestTiesAway`, `RoundNearestTiesUp`, `RoundToZero`, `RoundUp`, `VERSION`, `devnull`, `false`, `im`, `missing`, `nothing`, `pi`, `stderr`, `stdin`, `stdout`, `true`, `undef`, `π`, `ℯ`), NameBuiltin, nil},
+			{`(?:[a-zA-Z_¡-􏿿][a-zA-Z_0-9!¡-􏿿]*)`, Name, nil},
+			{`(\d+((_\d+)+)?\.(?!\.)(\d+((_\d+)+)?)?|\.\d+((_\d+)+)?)([eEf][+-]?[0-9]+)?`, LiteralNumberFloat, nil},
+			{`\d+((_\d+)+)?[eEf][+-]?[0-9]+`, LiteralNumberFloat, nil},
+			{`0x[a-fA-F0-9]+((_[a-fA-F0-9]+)+)?(\.([a-fA-F0-9]+((_[a-fA-F0-9]+)+)?)?)?p[+-]?\d+`, LiteralNumberFloat, nil},
+			{`0b[01]+((_[01]+)+)?`, LiteralNumberBin, nil},
+			{`0o[0-7]+((_[0-7]+)+)?`, LiteralNumberOct, nil},
+			{`0x[a-fA-F0-9]+((_[a-fA-F0-9]+)+)?`, LiteralNumberHex, nil},
+			{`\d+((_\d+)+)?`, LiteralNumberInteger, nil},
+			{Words(``, ``, `.`), Operator, nil},
 		},
 		"blockcomment": {
 			{`[^=#]`, CommentMultiline, nil},
@@ -60,40 +68,67 @@ func juliaRules() Rules {
 			{`=#`, CommentMultiline, Pop(1)},
 			{`[=#]`, CommentMultiline, nil},
 		},
-		"string": {
+		"curly": {
+			{`\{`, Punctuation, Push()},
+			{`\}`, Punctuation, Pop(1)},
+			{`(?:[a-zA-Z_¡-􏿿][a-zA-Z_0-9!¡-􏿿]*)`, KeywordType, nil},
+			Include("root"),
+		},
+		"tqrawstring": {
+			{`"""`, LiteralString, Pop(1)},
+			{`([^"]|"[^"][^"])+`, LiteralString, nil},
+		},
+		"rawstring": {
 			{`"`, LiteralString, Pop(1)},
-			{`\\([\\"\'$nrbtfav]|(x|u|U)[a-fA-F0-9]+|\d+)`, LiteralStringEscape, nil},
-			{`\$(?:[a-zA-Z_¡-￿]|[𐀀-􏿿])(?:[a-zA-Z_0-9¡-￿]|[𐀀-􏿿])*!*`, LiteralStringInterpol, nil},
+			{`\\"`, LiteralStringEscape, nil},
+			{`([^"\\]|\\[^"])+`, LiteralString, nil},
+		},
+		"interp": {
+			{`\$(?:[a-zA-Z_¡-􏿿][a-zA-Z_0-9!¡-􏿿]*)`, LiteralStringInterpol, nil},
 			{`(\$)(\()`, ByGroups(LiteralStringInterpol, Punctuation), Push("in-intp")},
+		},
+		"in-intp": {
+			{`\(`, Punctuation, Push()},
+			{`\)`, Punctuation, Pop(1)},
+			Include("root"),
+		},
+		"string": {
+			{`(")((?:[a-zA-Z_¡-􏿿][a-zA-Z_0-9!¡-􏿿]*)|\d+)?`, ByGroups(LiteralString, LiteralStringAffix), Pop(1)},
+			{`\\([\\"\'$nrbtfav]|(x|u|U)[a-fA-F0-9]+|\d+)`, LiteralStringEscape, nil},
+			Include("interp"),
 			{`%[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?[hlL]?[E-GXc-giorsux%]`, LiteralStringInterpol, nil},
-			{`.|\s`, LiteralString, nil},
+			{`[^"$%\\]+`, LiteralString, nil},
+			{`.`, LiteralString, nil},
 		},
 		"tqstring": {
-			{`"""`, LiteralString, Pop(1)},
+			{`(""")((?:[a-zA-Z_¡-􏿿][a-zA-Z_0-9!¡-􏿿]*)|\d+)?`, ByGroups(LiteralString, LiteralStringAffix), Pop(1)},
 			{`\\([\\"\'$nrbtfav]|(x|u|U)[a-fA-F0-9]+|\d+)`, LiteralStringEscape, nil},
-			{`\$(?:[a-zA-Z_¡-￿]|[𐀀-􏿿])(?:[a-zA-Z_0-9¡-￿]|[𐀀-􏿿])*!*`, LiteralStringInterpol, nil},
-			{`(\$)(\()`, ByGroups(LiteralStringInterpol, Punctuation), Push("in-intp")},
-			{`.|\s`, LiteralString, nil},
+			Include("interp"),
+			{`[^"$%\\]+`, LiteralString, nil},
+			{`.`, LiteralString, nil},
 		},
 		"regex": {
-			{`"`, LiteralStringRegex, Pop(1)},
+			{`(")([imsxa]*)?`, ByGroups(LiteralStringRegex, LiteralStringAffix), Pop(1)},
 			{`\\"`, LiteralStringRegex, nil},
-			{`.|\s`, LiteralStringRegex, nil},
+			{`[^\\"]+`, LiteralStringRegex, nil},
 		},
 		"tqregex": {
-			{`"""`, LiteralStringRegex, Pop(1)},
-			{`.|\s`, LiteralStringRegex, nil},
+			{`(""")([imsxa]*)?`, ByGroups(LiteralStringRegex, LiteralStringAffix), Pop(1)},
+			{`[^"]+`, LiteralStringRegex, nil},
 		},
 		"command": {
-			{"`", LiteralStringBacktick, Pop(1)},
-			{`\$(?:[a-zA-Z_¡-￿]|[𐀀-􏿿])(?:[a-zA-Z_0-9¡-￿]|[𐀀-􏿿])*!*`, LiteralStringInterpol, nil},
-			{`(\$)(\()`, ByGroups(LiteralStringInterpol, Punctuation), Push("in-intp")},
-			{`.|\s`, LiteralStringBacktick, nil},
+			{"(`)((?:[a-zA-Z_\u00a1-\U0010ffff][a-zA-Z_0-9!\u00a1-\U0010ffff]*)|\\d+)?", ByGroups(LiteralStringBacktick, LiteralStringAffix), Pop(1)},
+			{"\\\\[`$]", LiteralStringEscape, nil},
+			Include("interp"),
+			{"[^\\\\`$]+", LiteralStringBacktick, nil},
+			{`.`, LiteralStringBacktick, nil},
 		},
-		"in-intp": {
-			{`\(`, Punctuation, Push()},
-			{`\)`, Punctuation, Pop(1)},
-			Include("root"),
+		"tqcommand": {
+			{"(```)((?:[a-zA-Z_\u00a1-\U0010ffff][a-zA-Z_0-9!\u00a1-\U0010ffff]*)|\\d+)?", ByGroups(LiteralStringBacktick, LiteralStringAffix), Pop(1)},
+			{`\\\$`, LiteralStringEscape, nil},
+			Include("interp"),
+			{"[^\\\\`$]+", LiteralStringBacktick, nil},
+			{`.`, LiteralStringBacktick, nil},
 		},
 	}
 }


Test patch:
diff --git a/lexers/testdata/julia.actual b/lexers/testdata/julia.actual
index 1af5f30..079000f 100644
--- a/lexers/testdata/julia.actual
+++ b/lexers/testdata/julia.actual
@@ -1,18 +1,179 @@
-% Defining basic types
+## Test keywords are identified
 
-struct Value
-    v::Int
-end
-const r = 33
+mutable struct MutableType end
+struct ImmutableType end
+abstract type AbstractMyType end
+primitive type MyPrimitive 32 end
+(abstract, mutable, type) = true, π, missing
 
-A = zeros(3,3)
-B = rand(4,3)
+abstract    type AbstractMyType end
+primitive   type MyPrimitive 32 end
+mutable     struct MutableType end
 
-type = typeof(B)
-C = A * B'
-res = C' .+ r
+## Test that macros are parsed, including ones which are defined as symbols
 
-const abstract = 33
-abstract type K end
+@generated function
+@. a + b
+@~ a + b
+@± a + b
+@mymacro(a, b)
+@+¹ᵀ a
 
-primitive type MyFloat32 32 end
+## Test that the range of Julia variable names are correctly identified
+
+a # single character variable
+a_simple_name
+_leading_underscore
+5implicit_mul
+6_more_mul
+nums1
+nums_2
+nameswith!
+multiple!!
+embedded!_inthemiddle
+embed!1
+prime_suffix′
+for_each # starts with keyword substring
+
+# variables with characters > \u00A1
+ð # category Ll
+Aʺ # category Lm -- \U02BA (MODIFIER LETTER DOUBLE PRIME), not \U2033 (DOUBLE PRIME)
+א # category Lo
+Ð # category Lu
+A̅ # category Mn -- \U0305 (COMBINING OVERLINE)
+ⅿ # category Nl -- \U217F (SMALL ROMAN NUMERAL ONE THOUSAND)
+A₁ # category No
+A² # category No
+€ # category Sc
+© # category So
+
+# number-like names
+𝟙 # category Nd
+𝟏 # category Nd
+
+## Tests identification of number forms
+
+# floats
+  1e1   1e+1   1e-1
+1.1e1 1.1e+1 1.1e-1 .1e1 .1_1e1 1_1.1e1 1.1_1e1 1.1_11e1
+1.1E1 1.1E+1 1.1E-1 .1E1 .1_1E1 1_1.1E1 1.1_1E1 1.1_11E1
+1.1f1 1.1f+1 1.1f-1 .1f1 .1_1f1 1_1.1f1 1.1_1f1 1.1_11f1
+1E1   1E+1   1E-1
+1f1   1f+1   1f-1
+.1  1.  1.1  1.1_1  1.1_11  .1_1  .1_11 1_1.1_1
+# hex floats
+0x1p1 0xa_bp10 0x01_ap11 0x01_abp1
+0x1.1p1 0xA.Bp10 0x0.1_Ap9 0x0_1.Ap1 0x0_1.A_Bp9
+
+# integers
+1 01 10_1 10_11
+
+# non-decimal
+0xf 0xf_0 0xfff_000
+0o7 0o7_0 0o777_000
+0b1 0b1_0 0b111_000
+
+# invalid in Julia - out of range values
+0xg 0o8 0b2 0x1pA
+# invalid in Julia - no trailing underscores
+1_ 1.1_ 0xf_ 0o7_ 0b1_ 0xF_p1
+# parsed as juxtaposed numeral + variable in Julia (no underscores in exponents)
+1e1_1 1E1_1 1f1_1 0xfp1_1
+
+# not floats -- range-like expression parts
+1..1  ..1  1..
+
+## Test that operators --- dotted and unicode --- are identified correctly.
+
+a += b.c
+a .÷= .~b.c
+a = !b ⋆ c!
+a = b ? c : d ⊕ e
+a = √(5)
+a -> (a...) .+ 1
+a \ b
+1..2
+a = a === b
+a <: T
+a >: T
+a::T
+[adjoint]'
+(identity)''
+adjoint'''
+transpose'ᵀ
+suffixed +¹ operator
+suffixed +¹²³ operator
+
+%% Test string forms
+
+"global function"
+"An $interpolated variable"
+"An $(a + 1) expression"
+"""a"""
+"""
+global function
+de e f
+"inner string"
+"""
+raw"\\ a \" $interp $(1 + 1) \""
+raw"""
+"inner string"
+$interp
+$(1 + 1)
+"""
+# commented "string"
+
+@sprintf "%0.2f" var
+v"1.0"
+var"#nonstandard#"
+
+r"^[abs]+$"m
+arbi"trary"suff
+arbi"trary"1234
+
+`global function`
+`abc \` \$ $interpolated`
+`abc $(a + 1)`
+```a```
+```
+global function
+"thing" ` \$
+`now` $(now())
+```
+# commented `command`
+
+arbi`trary`suff
+arbi`trary`1234
+
+## Tests that symbols are parsed as special literals
+
+:abc_123
+:abc_def
+:α
+Val{:mysymbol}
+
+# non-symbols
+a:b
+1:b
+1.:b
+a::T
+a<:T
+a>:T
+UInt(1):UInt(2)
+
+## Tests identifying names which must be types from context
+
+Union{}
+MyType{Nothing, Any}
+f(::Union{T,S}) where S where T = 1
+f(::T) where {T} = 1
+f(::Type{<:T}) = 1
+f(::AT) where AT <: AbstractArray{MyType,1} = 1
+f(::Val{:named}) = 1
+f(::typeof(sin)) = 1
+MyInt <: Integer
+Number >: MyInt
+AT{T,1} <: B
+B>:AT{T,1}
+A <: f(B)
+g(C) <: T
diff --git a/lexers/testdata/julia.expected b/lexers/testdata/julia.expected
index 227b000..0f03ba0 100644
--- a/lexers/testdata/julia.expected
+++ b/lexers/testdata/julia.expected
@@ -1,103 +1,847 @@
 [
-  {"type":"Operator","value":"%"},
-  {"type":"Text","value":" "},
-  {"type":"Name","value":"Defining"},
+  {"type":"Comment","value":"## Test keywords are identified"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"Keyword","value":"mutable struct"},
   {"type":"Text","value":" "},
-  {"type":"Name","value":"basic"},
+  {"type":"KeywordType","value":"MutableType"},
   {"type":"Text","value":" "},
-  {"type":"Name","value":"types"},
-  {"type":"Text","value":"\n\n"},
+  {"type":"Keyword","value":"end"},
+  {"type":"Text","value":"\n"},
   {"type":"Keyword","value":"struct"},
   {"type":"Text","value":" "},
-  {"type":"Name","value":"Value"},
-  {"type":"Text","value":"\n    "},
-  {"type":"Name","value":"v"},
-  {"type":"Operator","value":"::"},
-  {"type":"KeywordType","value":"Int"},
+  {"type":"KeywordType","value":"ImmutableType"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"end"},
   {"type":"Text","value":"\n"},
+  {"type":"Keyword","value":"abstract type"},
+  {"type":"Text","value":" "},
+  {"type":"KeywordType","value":"AbstractMyType"},
+  {"type":"Text","value":" "},
   {"type":"Keyword","value":"end"},
   {"type":"Text","value":"\n"},
-  {"type":"KeywordDeclaration","value":"const"},
+  {"type":"Keyword","value":"primitive type"},
+  {"type":"Text","value":" "},
+  {"type":"KeywordType","value":"MyPrimitive"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"32"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"end"},
+  {"type":"Text","value":"\n"},
+  {"type":"Punctuation","value":"("},
+  {"type":"Name","value":"abstract"},
+  {"type":"Punctuation","value":","},
+  {"type":"Text","value":" "},
+  {"type":"Name","value":"mutable"},
+  {"type":"Punctuation","value":","},
   {"type":"Text","value":" "},
-  {"type":"Name","value":"r"},
+  {"type":"Name","value":"type"},
+  {"type":"Punctuation","value":")"},
   {"type":"Text","value":" "},
   {"type":"Operator","value":"="},
   {"type":"Text","value":" "},
-  {"type":"LiteralNumberInteger","value":"33"},
+  {"type":"NameBuiltin","value":"true"},
+  {"type":"Punctuation","value":","},
+  {"type":"Text","value":" "},
+  {"type":"NameBuiltin","value":"π"},
+  {"type":"Punctuation","value":","},
+  {"type":"Text","value":" "},
+  {"type":"NameBuiltin","value":"missing"},
   {"type":"Text","value":"\n\n"},
-  {"type":"Name","value":"A"},
+  {"type":"Keyword","value":"abstract    type"},
   {"type":"Text","value":" "},
-  {"type":"Operator","value":"="},
+  {"type":"KeywordType","value":"AbstractMyType"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"end"},
+  {"type":"Text","value":"\n"},
+  {"type":"Keyword","value":"primitive   type"},
+  {"type":"Text","value":" "},
+  {"type":"KeywordType","value":"MyPrimitive"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"32"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"end"},
+  {"type":"Text","value":"\n"},
+  {"type":"Keyword","value":"mutable     struct"},
+  {"type":"Text","value":" "},
+  {"type":"KeywordType","value":"MutableType"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"end"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"Comment","value":"## Test that macros are parsed, including ones which are defined as symbols"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"NameDecorator","value":"@generated"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"function"},
+  {"type":"Text","value":"\n"},
+  {"type":"NameDecorator","value":"@."},
   {"type":"Text","value":" "},
-  {"type":"Name","value":"zeros"},
+  {"type":"Name","value":"a"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"+"},
+  {"type":"Text","value":" "},
+  {"type":"Name","value":"b"},
+  {"type":"Text","value":"\n"},
+  {"type":"NameDecorator","value":"@~"},
+  {"type":"Text","value":" "},
+  {"type":"Name","value":"a"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"+"},
+  {"type":"Text","value":" "},
+  {"type":"Name","value":"b"},
+  {"type":"Text","value":"\n"},
+  {"type":"NameDecorator","value":"@±"},
+  {"type":"Text","value":" "},
+  {"type":"Name","value":"a"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"+"},
+  {"type":"Text","value":" "},
+  {"type":"Name","value":"b"},
+  {"type":"Text","value":"\n"},
+  {"type":"NameDecorator","value":"@mymacro"},
   {"type":"Punctuation","value":"("},
-  {"type":"LiteralNumberInteger","value":"3"},
+  {"type":"Name","value":"a"},
   {"type":"Punctuation","value":","},
-  {"type":"LiteralNumberInteger","value":"3"},
+  {"type":"Text","value":" "},
+  {"type":"Name","value":"b"},
   {"type":"Punctuation","value":")"},
   {"type":"Text","value":"\n"},
-  {"type":"Name","value":"B"},
+  {"type":"NameDecorator","value":"@+¹ᵀ"},
+  {"type":"Text","value":" "},
+  {"type":"Name","value":"a"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"Comment","value":"## Test that the range of Julia variable names are correctly identified"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"Name","value":"a"},
+  {"type":"Text","value":" "},
+  {"type":"Comment","value":"# single character variable"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"a_simple_name"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"_leading_underscore"},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralNumberInteger","value":"5"},
+  {"type":"Name","value":"implicit_mul"},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralNumberInteger","value":"6"},
+  {"type":"Name","value":"_more_mul"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"nums1"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"nums_2"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"nameswith!"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"multiple!!"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"embedded!_inthemiddle"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"embed!1"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"prime_suffix′"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"for_each"},
+  {"type":"Text","value":" "},
+  {"type":"Comment","value":"# starts with keyword substring"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"Comment","value":"# variables with characters \u003e \\u00A1"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"ð"},
+  {"type":"Text","value":" "},
+  {"type":"Comment","value":"# category Ll"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"Aʺ"},
+  {"type":"Text","value":" "},
+  {"type":"Comment","value":"# category Lm -- \\U02BA (MODIFIER LETTER DOUBLE PRIME), not \\U2033 (DOUBLE PRIME)"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"א"},
+  {"type":"Text","value":" "},
+  {"type":"Comment","value":"# category Lo"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"Ð"},
+  {"type":"Text","value":" "},
+  {"type":"Comment","value":"# category Lu"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"A̅"},
+  {"type":"Text","value":" "},
+  {"type":"Comment","value":"# category Mn -- \\U0305 (COMBINING OVERLINE)"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"ⅿ"},
+  {"type":"Text","value":" "},
+  {"type":"Comment","value":"# category Nl -- \\U217F (SMALL ROMAN NUMERAL ONE THOUSAND)"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"A₁"},
+  {"type":"Text","value":" "},
+  {"type":"Comment","value":"# category No"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"A²"},
+  {"type":"Text","value":" "},
+  {"type":"Comment","value":"# category No"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"€"},
+  {"type":"Text","value":" "},
+  {"type":"Comment","value":"# category Sc"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"©"},
+  {"type":"Text","value":" "},
+  {"type":"Comment","value":"# category So"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"Comment","value":"# number-like names"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"𝟙"},
+  {"type":"Text","value":" "},
+  {"type":"Comment","value":"# category Nd"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"𝟏"},
+  {"type":"Text","value":" "},
+  {"type":"Comment","value":"# category Nd"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"Comment","value":"## Tests identification of number forms"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"Comment","value":"# floats"},
+  {"type":"Text","value":"\n  "},
+  {"type":"LiteralNumberFloat","value":"1e1"},
+  {"type":"Text","value":"   "},
+  {"type":"LiteralNumberFloat","value":"1e+1"},
+  {"type":"Text","value":"   "},
+  {"type":"LiteralNumberFloat","value":"1e-1"},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralNumberFloat","value":"1.1e1"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberFloat","value":"1.1e+1"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberFloat","value":"1.1e-1"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberFloat","value":".1e1"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberFloat","value":".1_1e1"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberFloat","value":"1_1.1e1"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberFloat","value":"1.1_1e1"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberFloat","value":"1.1_11e1"},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralNumberFloat","value":"1.1E1"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberFloat","value":"1.1E+1"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberFloat","value":"1.1E-1"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberFloat","value":".1E1"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberFloat","value":".1_1E1"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberFloat","value":"1_1.1E1"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberFloat","value":"1.1_1E1"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberFloat","value":"1.1_11E1"},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralNumberFloat","value":"1.1f1"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberFloat","value":"1.1f+1"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberFloat","value":"1.1f-1"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberFloat","value":".1f1"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberFloat","value":".1_1f1"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberFloat","value":"1_1.1f1"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberFloat","value":"1.1_1f1"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberFloat","value":"1.1_11f1"},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralNumberFloat","value":"1E1"},
+  {"type":"Text","value":"   "},
+  {"type":"LiteralNumberFloat","value":"1E+1"},
+  {"type":"Text","value":"   "},
+  {"type":"LiteralNumberFloat","value":"1E-1"},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralNumberFloat","value":"1f1"},
+  {"type":"Text","value":"   "},
+  {"type":"LiteralNumberFloat","value":"1f+1"},
+  {"type":"Text","value":"   "},
+  {"type":"LiteralNumberFloat","value":"1f-1"},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralNumberFloat","value":".1"},
+  {"type":"Text","value":"  "},
+  {"type":"LiteralNumberFloat","value":"1."},
+  {"type":"Text","value":"  "},
+  {"type":"LiteralNumberFloat","value":"1.1"},
+  {"type":"Text","value":"  "},
+  {"type":"LiteralNumberFloat","value":"1.1_1"},
+  {"type":"Text","value":"  "},
+  {"type":"LiteralNumberFloat","value":"1.1_11"},
+  {"type":"Text","value":"  "},
+  {"type":"LiteralNumberFloat","value":".1_1"},
+  {"type":"Text","value":"  "},
+  {"type":"LiteralNumberFloat","value":".1_11"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberFloat","value":"1_1.1_1"},
+  {"type":"Text","value":"\n"},
+  {"type":"Comment","value":"# hex floats"},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralNumberFloat","value":"0x1p1"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberFloat","value":"0xa_bp10"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberFloat","value":"0x01_ap11"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberFloat","value":"0x01_abp1"},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralNumberFloat","value":"0x1.1p1"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberFloat","value":"0xA.Bp10"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberFloat","value":"0x0.1_Ap9"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberFloat","value":"0x0_1.Ap1"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberFloat","value":"0x0_1.A_Bp9"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"Comment","value":"# integers"},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"01"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"10_1"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"10_11"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"Comment","value":"# non-decimal"},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralNumberHex","value":"0xf"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberHex","value":"0xf_0"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberHex","value":"0xfff_000"},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralNumberOct","value":"0o7"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberOct","value":"0o7_0"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberOct","value":"0o777_000"},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralNumberBin","value":"0b1"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberBin","value":"0b1_0"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberBin","value":"0b111_000"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"Comment","value":"# invalid in Julia - out of range values"},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralNumberInteger","value":"0"},
+  {"type":"Name","value":"xg"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"0"},
+  {"type":"Name","value":"o8"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"0"},
+  {"type":"Name","value":"b2"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberHex","value":"0x1"},
+  {"type":"Name","value":"pA"},
+  {"type":"Text","value":"\n"},
+  {"type":"Comment","value":"# invalid in Julia - no trailing underscores"},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Name","value":"_"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberFloat","value":"1.1"},
+  {"type":"Name","value":"_"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberHex","value":"0xf"},
+  {"type":"Name","value":"_"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberOct","value":"0o7"},
+  {"type":"Name","value":"_"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberBin","value":"0b1"},
+  {"type":"Name","value":"_"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberHex","value":"0xF"},
+  {"type":"Name","value":"_p1"},
+  {"type":"Text","value":"\n"},
+  {"type":"Comment","value":"# parsed as juxtaposed numeral + variable in Julia (no underscores in exponents)"},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralNumberFloat","value":"1e1"},
+  {"type":"Name","value":"_1"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberFloat","value":"1E1"},
+  {"type":"Name","value":"_1"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberFloat","value":"1f1"},
+  {"type":"Name","value":"_1"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberFloat","value":"0xfp1"},
+  {"type":"Name","value":"_1"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"Comment","value":"# not floats -- range-like expression parts"},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Operator","value":".."},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Text","value":"  "},
+  {"type":"Operator","value":".."},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Text","value":"  "},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Operator","value":".."},
+  {"type":"Text","value":"\n\n"},
+  {"type":"Comment","value":"## Test that operators --- dotted and unicode --- are identified correctly."},
+  {"type":"Text","value":"\n\n"},
+  {"type":"Name","value":"a"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"+="},
+  {"type":"Text","value":" "},
+  {"type":"Name","value":"b"},
+  {"type":"Operator","value":"."},
+  {"type":"Name","value":"c"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"a"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":".÷="},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":".~"},
+  {"type":"Name","value":"b"},
+  {"type":"Operator","value":"."},
+  {"type":"Name","value":"c"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"a"},
   {"type":"Text","value":" "},
   {"type":"Operator","value":"="},
   {"type":"Text","value":" "},
-  {"type":"Name","value":"rand"},
+  {"type":"Operator","value":"!"},
+  {"type":"Name","value":"b"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"⋆"},
+  {"type":"Text","value":" "},
+  {"type":"Name","value":"c!"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"a"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"="},
+  {"type":"Text","value":" "},
+  {"type":"Name","value":"b"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"?"},
+  {"type":"Text","value":" "},
+  {"type":"Name","value":"c"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":":"},
+  {"type":"Text","value":" "},
+  {"type":"Name","value":"d"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"⊕"},
+  {"type":"Text","value":" "},
+  {"type":"Name","value":"e"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"a"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"="},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"√"},
   {"type":"Punctuation","value":"("},
-  {"type":"LiteralNumberInteger","value":"4"},
-  {"type":"Punctuation","value":","},
-  {"type":"LiteralNumberInteger","value":"3"},
+  {"type":"LiteralNumberInteger","value":"5"},
   {"type":"Punctuation","value":")"},
-  {"type":"Text","value":"\n\n"},
-  {"type":"Name","value":"type"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"a"},
   {"type":"Text","value":" "},
-  {"type":"Operator","value":"="},
+  {"type":"Operator","value":"-\u003e"},
   {"type":"Text","value":" "},
-  {"type":"Name","value":"typeof"},
   {"type":"Punctuation","value":"("},
-  {"type":"Name","value":"B"},
+  {"type":"Name","value":"a"},
+  {"type":"Operator","value":"..."},
   {"type":"Punctuation","value":")"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":".+"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"1"},
   {"type":"Text","value":"\n"},
-  {"type":"Name","value":"C"},
+  {"type":"Name","value":"a"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"\\"},
+  {"type":"Text","value":" "},
+  {"type":"Name","value":"b"},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Operator","value":".."},
+  {"type":"LiteralNumberInteger","value":"2"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"a"},
   {"type":"Text","value":" "},
   {"type":"Operator","value":"="},
   {"type":"Text","value":" "},
-  {"type":"Name","value":"A"},
+  {"type":"Name","value":"a"},
   {"type":"Text","value":" "},
-  {"type":"Operator","value":"*"},
+  {"type":"Operator","value":"==="},
   {"type":"Text","value":" "},
-  {"type":"Name","value":"B"},
-  {"type":"Operator","value":"'"},
+  {"type":"Name","value":"b"},
   {"type":"Text","value":"\n"},
-  {"type":"Name","value":"res"},
+  {"type":"KeywordType","value":"a"},
   {"type":"Text","value":" "},
-  {"type":"Operator","value":"="},
+  {"type":"Operator","value":"\u003c:"},
   {"type":"Text","value":" "},
-  {"type":"Name","value":"C"},
+  {"type":"KeywordType","value":"T"},
+  {"type":"Text","value":"\n"},
+  {"type":"KeywordType","value":"a"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"\u003e:"},
+  {"type":"Text","value":" "},
+  {"type":"KeywordType","value":"T"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"a"},
+  {"type":"Operator","value":"::"},
+  {"type":"KeywordType","value":"T"},
+  {"type":"Text","value":"\n"},
+  {"type":"Punctuation","value":"["},
+  {"type":"Name","value":"adjoint"},
+  {"type":"Punctuation","value":"]"},
   {"type":"Operator","value":"'"},
+  {"type":"Text","value":"\n"},
+  {"type":"Punctuation","value":"("},
+  {"type":"Name","value":"identity"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Operator","value":"''"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"adjoint"},
+  {"type":"Operator","value":"'''"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"transpose"},
+  {"type":"Operator","value":"'ᵀ"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"suffixed"},
   {"type":"Text","value":" "},
-  {"type":"Operator","value":".+"},
+  {"type":"Operator","value":"+¹"},
+  {"type":"Text","value":" "},
+  {"type":"Name","value":"operator"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"suffixed"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"+¹²³"},
   {"type":"Text","value":" "},
-  {"type":"Name","value":"r"},
+  {"type":"Name","value":"operator"},
   {"type":"Text","value":"\n\n"},
-  {"type":"KeywordDeclaration","value":"const"},
+  {"type":"Operator","value":"%%"},
   {"type":"Text","value":" "},
-  {"type":"Name","value":"abstract"},
+  {"type":"Name","value":"Test"},
   {"type":"Text","value":" "},
-  {"type":"Operator","value":"="},
+  {"type":"Name","value":"string"},
   {"type":"Text","value":" "},
-  {"type":"LiteralNumberInteger","value":"33"},
+  {"type":"Name","value":"forms"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"LiteralString","value":"\"global function\""},
   {"type":"Text","value":"\n"},
-  {"type":"Keyword","value":"abstract type"},
+  {"type":"LiteralString","value":"\"An "},
+  {"type":"LiteralStringInterpol","value":"$interpolated"},
+  {"type":"LiteralString","value":" variable\""},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralString","value":"\"An "},
+  {"type":"LiteralStringInterpol","value":"$"},
+  {"type":"Punctuation","value":"("},
+  {"type":"Name","value":"a"},
   {"type":"Text","value":" "},
-  {"type":"Name","value":"K"},
+  {"type":"Operator","value":"+"},
   {"type":"Text","value":" "},
-  {"type":"Keyword","value":"end"},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Punctuation","value":")"},
+  {"type":"LiteralString","value":" expression\""},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralString","value":"\"\"\"a\"\"\""},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralString","value":"\"\"\"\nglobal function\nde e f\n\"inner string\"\n\"\"\""},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralStringAffix","value":"raw"},
+  {"type":"LiteralString","value":"\"\\\\ a "},
+  {"type":"LiteralStringEscape","value":"\\\""},
+  {"type":"LiteralString","value":" $interp $(1 + 1) "},
+  {"type":"LiteralStringEscape","value":"\\\""},
+  {"type":"LiteralString","value":"\""},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralStringAffix","value":"raw"},
+  {"type":"LiteralString","value":"\"\"\"\n\"inner string\"\n$interp\n$(1 + 1)\n\"\"\""},
+  {"type":"Text","value":"\n"},
+  {"type":"Comment","value":"# commented \"string\""},
   {"type":"Text","value":"\n\n"},
-  {"type":"Keyword","value":"primitive type"},
+  {"type":"NameDecorator","value":"@sprintf"},
   {"type":"Text","value":" "},
-  {"type":"Name","value":"MyFloat32"},
+  {"type":"LiteralString","value":"\""},
+  {"type":"LiteralStringInterpol","value":"%0.2f"},
+  {"type":"LiteralString","value":"\""},
   {"type":"Text","value":" "},
-  {"type":"LiteralNumberInteger","value":"32"},
+  {"type":"Name","value":"var"},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralStringAffix","value":"v"},
+  {"type":"LiteralString","value":"\"1.0\""},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralStringAffix","value":"var"},
+  {"type":"LiteralString","value":"\"#nonstandard#\""},
+  {"type":"Text","value":"\n\n"},
+  {"type":"LiteralStringAffix","value":"r"},
+  {"type":"LiteralStringRegex","value":"\"^[abs]+$\""},
+  {"type":"LiteralStringAffix","value":"m"},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralStringAffix","value":"arbi"},
+  {"type":"LiteralString","value":"\"trary\""},
+  {"type":"LiteralStringAffix","value":"suff"},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralStringAffix","value":"arbi"},
+  {"type":"LiteralString","value":"\"trary\""},
+  {"type":"LiteralStringAffix","value":"1234"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"LiteralStringBacktick","value":"`global function`"},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralStringBacktick","value":"`abc "},
+  {"type":"LiteralStringEscape","value":"\\`"},
+  {"type":"LiteralStringBacktick","value":" "},
+  {"type":"LiteralStringEscape","value":"\\$"},
+  {"type":"LiteralStringBacktick","value":" "},
+  {"type":"LiteralStringInterpol","value":"$interpolated"},
+  {"type":"LiteralStringBacktick","value":"`"},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralStringBacktick","value":"`abc "},
+  {"type":"LiteralStringInterpol","value":"$"},
+  {"type":"Punctuation","value":"("},
+  {"type":"Name","value":"a"},
   {"type":"Text","value":" "},
-  {"type":"Keyword","value":"end"},
+  {"type":"Operator","value":"+"},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Punctuation","value":")"},
+  {"type":"LiteralStringBacktick","value":"`"},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralStringBacktick","value":"```a```"},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralStringBacktick","value":"```\nglobal function\n\"thing\" ` "},
+  {"type":"LiteralStringEscape","value":"\\$"},
+  {"type":"LiteralStringBacktick","value":"\n`now` "},
+  {"type":"LiteralStringInterpol","value":"$"},
+  {"type":"Punctuation","value":"("},
+  {"type":"Name","value":"now"},
+  {"type":"Punctuation","value":"())"},
+  {"type":"LiteralStringBacktick","value":"\n```"},
+  {"type":"Text","value":"\n"},
+  {"type":"Comment","value":"# commented `command`"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"LiteralStringAffix","value":"arbi"},
+  {"type":"LiteralStringBacktick","value":"`trary`"},
+  {"type":"LiteralStringAffix","value":"suff"},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralStringAffix","value":"arbi"},
+  {"type":"LiteralStringBacktick","value":"`trary`"},
+  {"type":"LiteralStringAffix","value":"1234"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"Comment","value":"## Tests that symbols are parsed as special literals"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"LiteralStringSymbol","value":":abc_123"},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralStringSymbol","value":":abc_def"},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralStringSymbol","value":":α"},
+  {"type":"Text","value":"\n"},
+  {"type":"KeywordType","value":"Val"},
+  {"type":"Punctuation","value":"{"},
+  {"type":"LiteralStringSymbol","value":":mysymbol"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"Comment","value":"# non-symbols"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"a"},
+  {"type":"Operator","value":":"},
+  {"type":"Name","value":"b"},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Operator","value":":"},
+  {"type":"Name","value":"b"},
+  {"type":"Text","value":"\n"},
+  {"type":"LiteralNumberFloat","value":"1."},
+  {"type":"Operator","value":":"},
+  {"type":"Name","value":"b"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"a"},
+  {"type":"Operator","value":"::"},
+  {"type":"KeywordType","value":"T"},
+  {"type":"Text","value":"\n"},
+  {"type":"KeywordType","value":"a"},
+  {"type":"Operator","value":"\u003c:"},
+  {"type":"KeywordType","value":"T"},
+  {"type":"Text","value":"\n"},
+  {"type":"KeywordType","value":"a"},
+  {"type":"Operator","value":"\u003e:"},
+  {"type":"KeywordType","value":"T"},
+  {"type":"Text","value":"\n"},
+  {"type":"KeywordType","value":"UInt"},
+  {"type":"Punctuation","value":"("},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Operator","value":":"},
+  {"type":"KeywordType","value":"UInt"},
+  {"type":"Punctuation","value":"("},
+  {"type":"LiteralNumberInteger","value":"2"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"Comment","value":"## Tests identifying names which must be types from context"},
+  {"type":"Text","value":"\n\n"},
+  {"type":"KeywordType","value":"Union"},
+  {"type":"Punctuation","value":"{}"},
+  {"type":"Text","value":"\n"},
+  {"type":"KeywordType","value":"MyType"},
+  {"type":"Punctuation","value":"{"},
+  {"type":"KeywordType","value":"Nothing"},
+  {"type":"Punctuation","value":","},
+  {"type":"Text","value":" "},
+  {"type":"KeywordType","value":"Any"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"f"},
+  {"type":"Punctuation","value":"("},
+  {"type":"Operator","value":"::"},
+  {"type":"KeywordType","value":"Union"},
+  {"type":"Punctuation","value":"{"},
+  {"type":"KeywordType","value":"T"},
+  {"type":"Punctuation","value":","},
+  {"type":"KeywordType","value":"S"},
+  {"type":"Punctuation","value":"})"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"where"},
+  {"type":"Text","value":" "},
+  {"type":"KeywordType","value":"S"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"where"},
+  {"type":"Text","value":" "},
+  {"type":"KeywordType","value":"T"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"="},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"f"},
+  {"type":"Punctuation","value":"("},
+  {"type":"Operator","value":"::"},
+  {"type":"KeywordType","value":"T"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"where"},
+  {"type":"Text","value":" "},
+  {"type":"Punctuation","value":"{"},
+  {"type":"KeywordType","value":"T"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"="},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"f"},
+  {"type":"Punctuation","value":"("},
+  {"type":"Operator","value":"::"},
+  {"type":"KeywordType","value":"Type"},
+  {"type":"Punctuation","value":"{"},
+  {"type":"Operator","value":"\u003c:"},
+  {"type":"KeywordType","value":"T"},
+  {"type":"Punctuation","value":"})"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"="},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"f"},
+  {"type":"Punctuation","value":"("},
+  {"type":"Operator","value":"::"},
+  {"type":"KeywordType","value":"AT"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Text","value":" "},
+  {"type":"Keyword","value":"where"},
+  {"type":"Text","value":" "},
+  {"type":"KeywordType","value":"AT"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"\u003c:"},
+  {"type":"Text","value":" "},
+  {"type":"KeywordType","value":"AbstractArray"},
+  {"type":"Punctuation","value":"{"},
+  {"type":"KeywordType","value":"MyType"},
+  {"type":"Punctuation","value":","},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"="},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"f"},
+  {"type":"Punctuation","value":"("},
+  {"type":"Operator","value":"::"},
+  {"type":"KeywordType","value":"Val"},
+  {"type":"Punctuation","value":"{"},
+  {"type":"LiteralStringSymbol","value":":named"},
+  {"type":"Punctuation","value":"})"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"="},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"f"},
+  {"type":"Punctuation","value":"("},
+  {"type":"Operator","value":"::"},
+  {"type":"Name","value":"typeof"},
+  {"type":"Punctuation","value":"("},
+  {"type":"Name","value":"sin"},
+  {"type":"Punctuation","value":"))"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"="},
+  {"type":"Text","value":" "},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Text","value":"\n"},
+  {"type":"KeywordType","value":"MyInt"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"\u003c:"},
+  {"type":"Text","value":" "},
+  {"type":"KeywordType","value":"Integer"},
+  {"type":"Text","value":"\n"},
+  {"type":"KeywordType","value":"Number"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"\u003e:"},
+  {"type":"Text","value":" "},
+  {"type":"KeywordType","value":"MyInt"},
+  {"type":"Text","value":"\n"},
+  {"type":"KeywordType","value":"AT"},
+  {"type":"Punctuation","value":"{"},
+  {"type":"KeywordType","value":"T"},
+  {"type":"Punctuation","value":","},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"\u003c:"},
+  {"type":"Text","value":" "},
+  {"type":"KeywordType","value":"B"},
+  {"type":"Text","value":"\n"},
+  {"type":"KeywordType","value":"B"},
+  {"type":"Operator","value":"\u003e:"},
+  {"type":"KeywordType","value":"AT"},
+  {"type":"Punctuation","value":"{"},
+  {"type":"KeywordType","value":"T"},
+  {"type":"Punctuation","value":","},
+  {"type":"LiteralNumberInteger","value":"1"},
+  {"type":"Punctuation","value":"}"},
+  {"type":"Text","value":"\n"},
+  {"type":"KeywordType","value":"A"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"\u003c:"},
+  {"type":"Text","value":" "},
+  {"type":"Name","value":"f"},
+  {"type":"Punctuation","value":"("},
+  {"type":"Name","value":"B"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Text","value":"\n"},
+  {"type":"Name","value":"g"},
+  {"type":"Punctuation","value":"("},
+  {"type":"Name","value":"C"},
+  {"type":"Punctuation","value":")"},
+  {"type":"Text","value":" "},
+  {"type":"Operator","value":"\u003c:"},
+  {"type":"Text","value":" "},
+  {"type":"KeywordType","value":"T"},
   {"type":"Text","value":"\n"}
 ]