annotate vendor/github.com/alecthomas/chroma/v2/lexers/raku.go @ 66:787b5ee0289d draft

Use vendored modules Signed-off-by: Izuru Yakumo <yakumo.izuru@chaotic.ninja>
author yakumo.izuru
date Sun, 23 Jul 2023 13:18:53 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
66
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1 package lexers
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
2
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
3 import (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
4 "regexp"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
5 "strings"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
6 "unicode/utf8"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
7
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
8 "github.com/dlclark/regexp2"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
9
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
10 . "github.com/alecthomas/chroma/v2" // nolint
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
11 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
12
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
13 // Raku lexer.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
14 var Raku Lexer = Register(MustNewLexer(
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
15 &Config{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
16 Name: "Raku",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
17 Aliases: []string{"perl6", "pl6", "raku"},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
18 Filenames: []string{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
19 "*.pl", "*.pm", "*.nqp", "*.p6", "*.6pl", "*.p6l", "*.pl6", "*.6pm",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
20 "*.p6m", "*.pm6", "*.t", "*.raku", "*.rakumod", "*.rakutest", "*.rakudoc",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
21 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
22 MimeTypes: []string{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
23 "text/x-perl6", "application/x-perl6",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
24 "text/x-raku", "application/x-raku",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
25 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
26 DotAll: true,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
27 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
28 rakuRules,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
29 ))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
30
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
31 func rakuRules() Rules {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
32 type RakuToken int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
33
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
34 const (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
35 rakuQuote RakuToken = iota
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
36 rakuNameAttribute
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
37 rakuPod
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
38 rakuPodFormatter
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
39 rakuPodDeclaration
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
40 rakuMultilineComment
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
41 rakuMatchRegex
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
42 rakuSubstitutionRegex
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
43 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
44
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
45 const (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
46 colonPairOpeningBrackets = `(?:<<|<|«|\(|\[|\{)`
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
47 colonPairClosingBrackets = `(?:>>|>|»|\)|\]|\})`
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
48 colonPairPattern = `(?<!:)(?<colon>:)(?<key>\w[\w'-]*)(?<opening_delimiters>` + colonPairOpeningBrackets + `)`
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
49 colonPairLookahead = `(?=(:['\w-]+` +
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
50 colonPairOpeningBrackets + `.+?` + colonPairClosingBrackets + `)?`
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
51 namePattern = `(?:(?!` + colonPairPattern + `)(?:::|[\w':-]))+`
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
52 variablePattern = `[$@%&]+[.^:?=!~]?` + namePattern
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
53 globalVariablePattern = `[$@%&]+\*` + namePattern
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
54 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
55
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
56 keywords := []string{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
57 `BEGIN`, `CATCH`, `CHECK`, `CLOSE`, `CONTROL`, `DOC`, `END`, `ENTER`, `FIRST`, `INIT`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
58 `KEEP`, `LAST`, `LEAVE`, `NEXT`, `POST`, `PRE`, `QUIT`, `UNDO`, `anon`, `augment`, `but`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
59 `class`, `constant`, `default`, `does`, `else`, `elsif`, `enum`, `for`, `gather`, `given`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
60 `grammar`, `has`, `if`, `import`, `is`, `of`, `let`, `loop`, `made`, `make`, `method`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
61 `module`, `multi`, `my`, `need`, `orwith`, `our`, `proceed`, `proto`, `repeat`, `require`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
62 `where`, `return`, `return-rw`, `returns`, `->`, `-->`, `role`, `state`, `sub`, `no`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
63 `submethod`, `subset`, `succeed`, `supersede`, `try`, `unit`, `unless`, `until`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
64 `use`, `when`, `while`, `with`, `without`, `export`, `native`, `repr`, `required`, `rw`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
65 `symbol`, `default`, `cached`, `DEPRECATED`, `dynamic`, `hidden-from-backtrace`, `nodal`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
66 `pure`, `raw`, `start`, `react`, `supply`, `whenever`, `also`, `rule`, `token`, `regex`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
67 `dynamic-scope`, `built`, `temp`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
68 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
69
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
70 keywordsPattern := Words(`(?<!['\w:-])`, `(?!['\w:-])`, keywords...)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
71
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
72 wordOperators := []string{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
73 `X`, `Z`, `R`, `after`, `and`, `andthen`, `before`, `cmp`, `div`, `eq`, `eqv`, `extra`, `ge`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
74 `gt`, `le`, `leg`, `lt`, `mod`, `ne`, `or`, `orelse`, `x`, `xor`, `xx`, `gcd`, `lcm`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
75 `but`, `min`, `max`, `^fff`, `fff^`, `fff`, `^ff`, `ff^`, `ff`, `so`, `not`, `unicmp`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
76 `TR`, `o`, `(&)`, `(.)`, `(|)`, `(+)`, `(-)`, `(^)`, `coll`, `(elem)`, `(==)`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
77 `(cont)`, `(<)`, `(<=)`, `(>)`, `(>=)`, `minmax`, `notandthen`, `S`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
78 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
79
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
80 wordOperatorsPattern := Words(`(?<=^|\b|\s)`, `(?=$|\b|\s)`, wordOperators...)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
81
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
82 operators := []string{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
83 `++`, `--`, `-`, `**`, `!`, `+`, `~`, `?`, `+^`, `~^`, `?^`, `^`, `*`, `/`, `%`, `%%`, `+&`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
84 `+<`, `+>`, `~&`, `~<`, `~>`, `?&`, `+|`, `+^`, `~|`, `~^`, `?`, `?|`, `?^`, `&`, `^`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
85 `<=>`, `^…^`, `^…`, `…^`, `…`, `...`, `...^`, `^...`, `^...^`, `..`, `..^`, `^..`, `^..^`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
86 `::=`, `:=`, `!=`, `==`, `<=`, `<`, `>=`, `>`, `~~`, `===`, `&&`, `||`, `|`, `^^`, `//`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
87 `??`, `!!`, `^fff^`, `^ff^`, `<==`, `==>`, `<<==`, `==>>`, `=>`, `=`, `<<`, `«`, `>>`, `»`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
88 `,`, `>>.`, `».`, `.&`, `.=`, `.^`, `.?`, `.+`, `.*`, `.`, `∘`, `∩`, `⊍`, `∪`, `⊎`, `∖`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
89 `⊖`, `≠`, `≤`, `≥`, `=:=`, `=~=`, `≅`, `∈`, `∉`, `≡`, `≢`, `∋`, `∌`, `⊂`, `⊄`, `⊆`, `⊈`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
90 `⊃`, `⊅`, `⊇`, `⊉`, `:`, `!!!`, `???`, `¯`, `×`, `÷`, `−`, `⁺`, `⁻`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
91 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
92
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
93 operatorsPattern := Words(``, ``, operators...)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
94
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
95 builtinTypes := []string{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
96 `False`, `True`, `Order`, `More`, `Less`, `Same`, `Any`, `Array`, `Associative`, `AST`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
97 `atomicint`, `Attribute`, `Backtrace`, `Backtrace::Frame`, `Bag`, `Baggy`, `BagHash`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
98 `Blob`, `Block`, `Bool`, `Buf`, `Callable`, `CallFrame`, `Cancellation`, `Capture`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
99 `CArray`, `Channel`, `Code`, `compiler`, `Complex`, `ComplexStr`, `CompUnit`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
100 `CompUnit::PrecompilationRepository`, `CompUnit::Repository`, `Empty`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
101 `CompUnit::Repository::FileSystem`, `CompUnit::Repository::Installation`, `Cool`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
102 `CurrentThreadScheduler`, `CX::Warn`, `CX::Take`, `CX::Succeed`, `CX::Return`, `CX::Redo`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
103 `CX::Proceed`, `CX::Next`, `CX::Last`, `CX::Emit`, `CX::Done`, `Cursor`, `Date`, `Dateish`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
104 `DateTime`, `Distribution`, `Distribution::Hash`, `Distribution::Locally`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
105 `Distribution::Path`, `Distribution::Resource`, `Distro`, `Duration`, `Encoding`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
106 `Encoding::GlobalLexerRegistry`, `Endian`, `Enumeration`, `Exception`, `Failure`, `FatRat`, `Grammar`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
107 `Hash`, `HyperWhatever`, `Instant`, `Int`, `int`, `int16`, `int32`, `int64`, `int8`, `str`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
108 `IntStr`, `IO`, `IO::ArgFiles`, `IO::CatHandle`, `IO::Handle`, `IO::Notification`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
109 `IO::Notification::Change`, `IO::Path`, `IO::Path::Cygwin`, `IO::Path::Parts`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
110 `IO::Path::QNX`, `IO::Path::Unix`, `IO::Path::Win32`, `IO::Pipe`, `IO::Socket`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
111 `IO::Socket::Async`, `IO::Socket::Async::ListenSocket`, `IO::Socket::INET`, `IO::Spec`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
112 `IO::Spec::Cygwin`, `IO::Spec::QNX`, `IO::Spec::Unix`, `IO::Spec::Win32`, `IO::Special`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
113 `Iterable`, `Iterator`, `Junction`, `Kernel`, `Label`, `List`, `Lock`, `Lock::Async`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
114 `Lock::ConditionVariable`, `long`, `longlong`, `Macro`, `Map`, `Match`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
115 `Metamodel::AttributeContainer`, `Metamodel::C3MRO`, `Metamodel::ClassHOW`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
116 `Metamodel::ConcreteRoleHOW`, `Metamodel::CurriedRoleHOW`, `Metamodel::DefiniteHOW`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
117 `Metamodel::Documenting`, `Metamodel::EnumHOW`, `Metamodel::Finalization`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
118 `Metamodel::MethodContainer`, `Metamodel::Mixins`, `Metamodel::MROBasedMethodDispatch`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
119 `Metamodel::MultipleInheritance`, `Metamodel::Naming`, `Metamodel::Primitives`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
120 `Metamodel::PrivateMethodContainer`, `Metamodel::RoleContainer`, `Metamodel::RolePunning`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
121 `Metamodel::Stashing`, `Metamodel::Trusting`, `Metamodel::Versioning`, `Method`, `Mix`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
122 `MixHash`, `Mixy`, `Mu`, `NFC`, `NFD`, `NFKC`, `NFKD`, `Nil`, `Num`, `num32`, `num64`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
123 `Numeric`, `NumStr`, `ObjAt`, `Order`, `Pair`, `Parameter`, `Perl`, `Pod::Block`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
124 `Pod::Block::Code`, `Pod::Block::Comment`, `Pod::Block::Declarator`, `Pod::Block::Named`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
125 `Pod::Block::Para`, `Pod::Block::Table`, `Pod::Heading`, `Pod::Item`, `Pointer`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
126 `Positional`, `PositionalBindFailover`, `Proc`, `Proc::Async`, `Promise`, `Proxy`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
127 `PseudoStash`, `QuantHash`, `RaceSeq`, `Raku`, `Range`, `Rat`, `Rational`, `RatStr`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
128 `Real`, `Regex`, `Routine`, `Routine::WrapHandle`, `Scalar`, `Scheduler`, `Semaphore`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
129 `Seq`, `Sequence`, `Set`, `SetHash`, `Setty`, `Signature`, `size_t`, `Slip`, `Stash`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
130 `Str`, `StrDistance`, `Stringy`, `Sub`, `Submethod`, `Supplier`, `Supplier::Preserving`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
131 `Supply`, `Systemic`, `Tap`, `Telemetry`, `Telemetry::Instrument::Thread`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
132 `Telemetry::Instrument::ThreadPool`, `Telemetry::Instrument::Usage`, `Telemetry::Period`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
133 `Telemetry::Sampler`, `Thread`, `Test`, `ThreadPoolScheduler`, `UInt`, `uint16`, `uint32`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
134 `uint64`, `uint8`, `Uni`, `utf8`, `ValueObjAt`, `Variable`, `Version`, `VM`, `Whatever`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
135 `WhateverCode`, `WrapHandle`, `NativeCall`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
136 // Pragmas
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
137 `precompilation`, `experimental`, `worries`, `MONKEY-TYPING`, `MONKEY-SEE-NO-EVAL`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
138 `MONKEY-GUTS`, `fatal`, `lib`, `isms`, `newline`, `nqp`, `soft`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
139 `strict`, `trace`, `variables`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
140 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
141
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
142 builtinTypesPattern := Words(`(?<!['\w:-])`, `(?::[_UD])?(?!['\w:-])`, builtinTypes...)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
143
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
144 builtinRoutines := []string{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
145 `ACCEPTS`, `abs`, `abs2rel`, `absolute`, `accept`, `accepts_type`, `accessed`, `acos`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
146 `acosec`, `acosech`, `acosh`, `acotan`, `acotanh`, `acquire`, `act`, `action`, `actions`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
147 `add`, `add_attribute`, `add_enum_value`, `add_fallback`, `add_method`, `add_parent`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
148 `add_private_method`, `add_role`, `add_stash`, `add_trustee`, `addendum`, `adverb`, `after`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
149 `all`, `allocate`, `allof`, `allowed`, `alternative-names`, `annotations`, `antipair`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
150 `antipairs`, `any`, `anyof`, `api`, `app_lifetime`, `append`, `arch`, `archetypes`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
151 `archname`, `args`, `ARGS-TO-CAPTURE`, `arity`, `Array`, `asec`, `asech`, `asin`, `asinh`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
152 `ASSIGN-KEY`, `ASSIGN-POS`, `assuming`, `ast`, `at`, `atan`, `atan2`, `atanh`, `AT-KEY`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
153 `atomic-assign`, `atomic-dec-fetch`, `atomic-fetch`, `atomic-fetch-add`, `atomic-fetch-dec`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
154 `atomic-fetch-inc`, `atomic-fetch-sub`, `atomic-inc-fetch`, `AT-POS`, `attributes`, `auth`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
155 `await`, `backend`, `backtrace`, `Bag`, `bag`, `Baggy`, `BagHash`, `bail-out`, `base`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
156 `basename`, `base-repeating`, `base_type`, `batch`, `BIND-KEY`, `BIND-POS`, `bind-stderr`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
157 `bind-stdin`, `bind-stdout`, `bind-udp`, `bits`, `bless`, `block`, `Bool`, `bool-only`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
158 `bounds`, `break`, `Bridge`, `broken`, `BUILD`, `TWEAK`, `build-date`, `bytes`, `cache`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
159 `callframe`, `calling-package`, `CALL-ME`, `callsame`, `callwith`, `can`, `cancel`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
160 `candidates`, `cando`, `can-ok`, `canonpath`, `caps`, `caption`, `Capture`, `capture`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
161 `cas`, `catdir`, `categorize`, `categorize-list`, `catfile`, `catpath`, `cause`, `ceiling`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
162 `cglobal`, `changed`, `Channel`, `channel`, `chars`, `chdir`, `child`, `child-name`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
163 `child-typename`, `chmod`, `chomp`, `chop`, `chr`, `chrs`, `chunks`, `cis`, `classify`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
164 `classify-list`, `cleanup`, `clone`, `close`, `closed`, `close-stdin`, `cmp-ok`, `code`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
165 `codename`, `codes`, `coerce_type`, `coll`, `collate`, `column`, `comb`, `combinations`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
166 `command`, `comment`, `compiler`, `Complex`, `compose`, `composalizer`, `compose_type`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
167 `compose_values`, `composer`, `compute_mro`, `condition`, `config`, `configure_destroy`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
168 `configure_type_checking`, `conj`, `connect`, `constraints`, `construct`, `contains`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
169 `content`, `contents`, `copy`, `cos`, `cosec`, `cosech`, `cosh`, `cotan`, `cotanh`, `count`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
170 `count-only`, `cpu-cores`, `cpu-usage`, `CREATE`, `create_type`, `cross`, `cue`, `curdir`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
171 `curupdir`, `d`, `Date`, `DateTime`, `day`, `daycount`, `day-of-month`, `day-of-week`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
172 `day-of-year`, `days-in-month`, `dd-mm-yyyy`, `declaration`, `decode`, `decoder`, `deepmap`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
173 `default`, `defined`, `DEFINITE`, `definite`, `delayed`, `delete`, `delete-by-compiler`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
174 `DELETE-KEY`, `DELETE-POS`, `denominator`, `desc`, `DESTROY`, `destroyers`, `devnull`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
175 `diag`, `did-you-mean`, `die`, `dies-ok`, `dir`, `dirname`, `distribution`, `dir-sep`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
176 `DISTROnames`, `do`, `does`, `does-ok`, `done`, `done-testing`, `duckmap`, `dynamic`, `e`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
177 `eager`, `earlier`, `elems`, `emit`, `enclosing`, `encode`, `encoder`, `encoding`, `end`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
178 `endian`, `ends-with`, `enum_from_value`, `enum_value_list`, `enum_values`, `enums`, `EOF`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
179 `eof`, `EVAL`, `eval-dies-ok`, `EVALFILE`, `eval-lives-ok`, `event`, `exception`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
180 `excludes-max`, `excludes-min`, `EXISTS-KEY`, `EXISTS-POS`, `exit`, `exitcode`, `exp`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
181 `expected`, `explicitly-manage`, `expmod`, `export_callback`, `extension`, `f`, `fail`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
182 `FALLBACK`, `fails-like`, `fc`, `feature`, `file`, `filename`, `files`, `find`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
183 `find_method`, `find_method_qualified`, `finish`, `first`, `flat`, `first-date-in-month`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
184 `flatmap`, `flip`, `floor`, `flunk`, `flush`, `flush_cache`, `fmt`, `format`, `formatter`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
185 `free-memory`, `freeze`, `from`, `from-list`, `from-loop`, `from-posix`, `from-slurpy`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
186 `full`, `full-barrier`, `GENERATE-USAGE`, `generate_mixin`, `get`, `get_value`, `getc`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
187 `gist`, `got`, `grab`, `grabpairs`, `grep`, `handle`, `handled`, `handles`, `hardware`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
188 `has_accessor`, `Hash`, `hash`, `head`, `headers`, `hh-mm-ss`, `hidden`, `hides`, `hostname`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
189 `hour`, `how`, `hyper`, `id`, `illegal`, `im`, `in`, `in-timezone`, `indent`, `index`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
190 `indices`, `indir`, `infinite`, `infix`, `postcirumfix`, `cicumfix`, `install`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
191 `install_method_cache`, `Instant`, `instead`, `Int`, `int-bounds`, `interval`, `in-timezone`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
192 `invalid-str`, `invert`, `invocant`, `IO`, `IO::Notification.watch-path`, `is_trusted`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
193 `is_type`, `isa`, `is-absolute`, `isa-ok`, `is-approx`, `is-deeply`, `is-hidden`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
194 `is-initial-thread`, `is-int`, `is-lazy`, `is-leap-year`, `isNaN`, `isnt`, `is-prime`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
195 `is-relative`, `is-routine`, `is-setting`, `is-win`, `item`, `iterator`, `join`, `keep`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
196 `kept`, `KERNELnames`, `key`, `keyof`, `keys`, `kill`, `kv`, `kxxv`, `l`, `lang`, `last`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
197 `lastcall`, `later`, `lazy`, `lc`, `leading`, `level`, `like`, `line`, `lines`, `link`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
198 `List`, `list`, `listen`, `live`, `lives-ok`, `load`, `load-repo-id`, `load-unit`, `loaded`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
199 `loads`, `local`, `lock`, `log`, `log10`, `lookup`, `lsb`, `made`, `MAIN`, `make`, `Map`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
200 `map`, `match`, `max`, `maxpairs`, `merge`, `message`, `method`, `meta`, `method_table`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
201 `methods`, `migrate`, `min`, `minmax`, `minpairs`, `minute`, `misplaced`, `Mix`, `mix`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
202 `MixHash`, `mixin`, `mixin_attribute`, `Mixy`, `mkdir`, `mode`, `modified`, `month`, `move`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
203 `mro`, `msb`, `multi`, `multiness`, `name`, `named`, `named_names`, `narrow`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
204 `nativecast`, `native-descriptor`, `nativesizeof`, `need`, `new`, `new_type`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
205 `new-from-daycount`, `new-from-pairs`, `next`, `nextcallee`, `next-handle`, `nextsame`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
206 `nextwith`, `next-interesting-index`, `NFC`, `NFD`, `NFKC`, `NFKD`, `nice`, `nl-in`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
207 `nl-out`, `nodemap`, `nok`, `normalize`, `none`, `norm`, `not`, `note`, `now`, `nude`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
208 `Num`, `numerator`, `Numeric`, `of`, `offset`, `offset-in-hours`, `offset-in-minutes`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
209 `ok`, `old`, `on-close`, `one`, `on-switch`, `open`, `opened`, `operation`, `optional`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
210 `ord`, `ords`, `orig`, `os-error`, `osname`, `out-buffer`, `pack`, `package`, `package-kind`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
211 `package-name`, `packages`, `Pair`, `pair`, `pairs`, `pairup`, `parameter`, `params`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
212 `parent`, `parent-name`, `parents`, `parse`, `parse-base`, `parsefile`, `parse-names`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
213 `parts`, `pass`, `path`, `path-sep`, `payload`, `peer-host`, `peer-port`, `periods`, `perl`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
214 `permutations`, `phaser`, `pick`, `pickpairs`, `pid`, `placeholder`, `plan`, `plus`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
215 `polar`, `poll`, `polymod`, `pop`, `pos`, `positional`, `posix`, `postfix`, `postmatch`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
216 `precomp-ext`, `precomp-target`, `precompiled`, `pred`, `prefix`, `prematch`, `prepend`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
217 `primary`, `print`, `printf`, `print-nl`, `print-to`, `private`, `private_method_names`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
218 `private_method_table`, `proc`, `produce`, `Promise`, `promise`, `prompt`, `protect`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
219 `protect-or-queue-on-recursion`, `publish_method_cache`, `pull-one`, `push`, `push-all`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
220 `push-at-least`, `push-exactly`, `push-until-lazy`, `put`, `qualifier-type`, `quaternary`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
221 `quit`, `r`, `race`, `radix`, `raku`, `rand`, `Range`, `range`, `Rat`, `raw`, `re`, `read`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
222 `read-bits`, `read-int128`, `read-int16`, `read-int32`, `read-int64`, `read-int8`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
223 `read-num32`, `read-num64`, `read-ubits`, `read-uint128`, `read-uint16`, `read-uint32`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
224 `read-uint64`, `read-uint8`, `readchars`, `readonly`, `ready`, `Real`, `reallocate`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
225 `reals`, `reason`, `rebless`, `receive`, `recv`, `redispatcher`, `redo`, `reduce`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
226 `rel2abs`, `relative`, `release`, `remove`, `rename`, `repeated`, `replacement`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
227 `replace-with`, `repo`, `repo-id`, `report`, `required`, `reserved`, `resolve`, `restore`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
228 `result`, `resume`, `rethrow`, `return`, `return-rw`, `returns`, `reverse`, `right`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
229 `rindex`, `rmdir`, `role`, `roles_to_compose`, `rolish`, `roll`, `rootdir`, `roots`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
230 `rotate`, `rotor`, `round`, `roundrobin`, `routine-type`, `run`, `RUN-MAIN`, `rw`, `rwx`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
231 `samecase`, `samemark`, `samewith`, `say`, `schedule-on`, `scheduler`, `scope`, `sec`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
232 `sech`, `second`, `secondary`, `seek`, `self`, `send`, `Seq`, `Set`, `set`, `serial`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
233 `set_hidden`, `set_name`, `set_package`, `set_rw`, `set_value`, `set_api`, `set_auth`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
234 `set_composalizer`, `set_export_callback`, `set_is_mixin`, `set_mixin_attribute`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
235 `set_package`, `set_ver`, `set_why`, `SetHash`, `Setty`, `set-instruments`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
236 `setup_finalization`, `setup_mixin_cache`, `shape`, `share`, `shell`, `short-id`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
237 `short-name`, `shortname`, `shift`, `sibling`, `sigil`, `sign`, `signal`, `signals`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
238 `signature`, `sin`, `sinh`, `sink`, `sink-all`, `skip`, `skip-at-least`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
239 `skip-at-least-pull-one`, `skip-one`, `skip-rest`, `sleep`, `sleep-timer`, `sleep-until`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
240 `Slip`, `slip`, `slurp`, `slurp-rest`, `slurpy`, `snap`, `snapper`, `so`, `socket-host`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
241 `socket-port`, `sort`, `source`, `source-package`, `spawn`, `SPEC`, `splice`, `split`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
242 `splitdir`, `splitpath`, `sprintf`, `spurt`, `sqrt`, `squish`, `srand`, `stable`, `start`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
243 `started`, `starts-with`, `status`, `stderr`, `stdout`, `STORE`, `store-file`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
244 `store-repo-id`, `store-unit`, `Str`, `Stringy`, `sub_signature`, `subbuf`, `subbuf-rw`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
245 `subname`, `subparse`, `subst`, `subst-mutate`, `substr`, `substr-eq`, `substr-rw`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
246 `subtest`, `succ`, `sum`, `suffix`, `summary`, `Supply`, `symlink`, `T`, `t`, `tail`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
247 `take`, `take-rw`, `tan`, `tanh`, `tap`, `target`, `target-name`, `tc`, `tclc`, `tell`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
248 `term`, `tertiary`, `then`, `throttle`, `throw`, `throws-like`, `time`, `timezone`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
249 `tmpdir`, `to`, `today`, `todo`, `toggle`, `to-posix`, `total`, `total-memory`, `trailing`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
250 `trans`, `tree`, `trim`, `trim-leading`, `trim-trailing`, `truncate`, `truncated-to`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
251 `trusts`, `try_acquire`, `trying`, `twigil`, `type`, `type_captures`, `type_check`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
252 `typename`, `uc`, `udp`, `uncaught_handler`, `undefine`, `unimatch`, `unicmp`, `uniname`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
253 `uninames`, `uninstall`, `uniparse`, `uniprop`, `uniprops`, `unique`, `unival`, `univals`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
254 `unlike`, `unlink`, `unlock`, `unpack`, `unpolar`, `unset`, `unshift`, `unwrap`, `updir`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
255 `USAGE`, `usage-name`, `use-ok`, `utc`, `val`, `value`, `values`, `VAR`, `variable`, `ver`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
256 `verbose-config`, `Version`, `version`, `VMnames`, `volume`, `vow`, `w`, `wait`, `warn`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
257 `watch`, `watch-path`, `week`, `weekday-of-month`, `week-number`, `week-year`, `WHAT`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
258 `what`, `when`, `WHERE`, `WHEREFORE`, `WHICH`, `WHO`, `whole-second`, `WHY`, `why`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
259 `with-lock-hidden-from-recursion-check`, `wordcase`, `words`, `workaround`, `wrap`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
260 `write`, `write-bits`, `write-int128`, `write-int16`, `write-int32`, `write-int64`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
261 `write-int8`, `write-num32`, `write-num64`, `write-ubits`, `write-uint128`, `write-uint16`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
262 `write-uint32`, `write-uint64`, `write-uint8`, `write-to`, `x`, `yada`, `year`, `yield`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
263 `yyyy-mm-dd`, `z`, `zip`, `zip-latest`, `HOW`, `s`, `DEPRECATED`, `trait_mod`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
264 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
265
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
266 builtinRoutinesPattern := Words(`(?<!['\w:-])`, `(?!['\w-])`, builtinRoutines...)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
267
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
268 // A map of opening and closing brackets
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
269 brackets := map[rune]rune{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
270 '\u0028': '\u0029', '\u003c': '\u003e', '\u005b': '\u005d',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
271 '\u007b': '\u007d', '\u00ab': '\u00bb', '\u0f3a': '\u0f3b',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
272 '\u0f3c': '\u0f3d', '\u169b': '\u169c', '\u2018': '\u2019',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
273 '\u201a': '\u2019', '\u201b': '\u2019', '\u201c': '\u201d',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
274 '\u201e': '\u201d', '\u201f': '\u201d', '\u2039': '\u203a',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
275 '\u2045': '\u2046', '\u207d': '\u207e', '\u208d': '\u208e',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
276 '\u2208': '\u220b', '\u2209': '\u220c', '\u220a': '\u220d',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
277 '\u2215': '\u29f5', '\u223c': '\u223d', '\u2243': '\u22cd',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
278 '\u2252': '\u2253', '\u2254': '\u2255', '\u2264': '\u2265',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
279 '\u2266': '\u2267', '\u2268': '\u2269', '\u226a': '\u226b',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
280 '\u226e': '\u226f', '\u2270': '\u2271', '\u2272': '\u2273',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
281 '\u2274': '\u2275', '\u2276': '\u2277', '\u2278': '\u2279',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
282 '\u227a': '\u227b', '\u227c': '\u227d', '\u227e': '\u227f',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
283 '\u2280': '\u2281', '\u2282': '\u2283', '\u2284': '\u2285',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
284 '\u2286': '\u2287', '\u2288': '\u2289', '\u228a': '\u228b',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
285 '\u228f': '\u2290', '\u2291': '\u2292', '\u2298': '\u29b8',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
286 '\u22a2': '\u22a3', '\u22a6': '\u2ade', '\u22a8': '\u2ae4',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
287 '\u22a9': '\u2ae3', '\u22ab': '\u2ae5', '\u22b0': '\u22b1',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
288 '\u22b2': '\u22b3', '\u22b4': '\u22b5', '\u22b6': '\u22b7',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
289 '\u22c9': '\u22ca', '\u22cb': '\u22cc', '\u22d0': '\u22d1',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
290 '\u22d6': '\u22d7', '\u22d8': '\u22d9', '\u22da': '\u22db',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
291 '\u22dc': '\u22dd', '\u22de': '\u22df', '\u22e0': '\u22e1',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
292 '\u22e2': '\u22e3', '\u22e4': '\u22e5', '\u22e6': '\u22e7',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
293 '\u22e8': '\u22e9', '\u22ea': '\u22eb', '\u22ec': '\u22ed',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
294 '\u22f0': '\u22f1', '\u22f2': '\u22fa', '\u22f3': '\u22fb',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
295 '\u22f4': '\u22fc', '\u22f6': '\u22fd', '\u22f7': '\u22fe',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
296 '\u2308': '\u2309', '\u230a': '\u230b', '\u2329': '\u232a',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
297 '\u23b4': '\u23b5', '\u2768': '\u2769', '\u276a': '\u276b',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
298 '\u276c': '\u276d', '\u276e': '\u276f', '\u2770': '\u2771',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
299 '\u2772': '\u2773', '\u2774': '\u2775', '\u27c3': '\u27c4',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
300 '\u27c5': '\u27c6', '\u27d5': '\u27d6', '\u27dd': '\u27de',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
301 '\u27e2': '\u27e3', '\u27e4': '\u27e5', '\u27e6': '\u27e7',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
302 '\u27e8': '\u27e9', '\u27ea': '\u27eb', '\u2983': '\u2984',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
303 '\u2985': '\u2986', '\u2987': '\u2988', '\u2989': '\u298a',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
304 '\u298b': '\u298c', '\u298d': '\u298e', '\u298f': '\u2990',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
305 '\u2991': '\u2992', '\u2993': '\u2994', '\u2995': '\u2996',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
306 '\u2997': '\u2998', '\u29c0': '\u29c1', '\u29c4': '\u29c5',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
307 '\u29cf': '\u29d0', '\u29d1': '\u29d2', '\u29d4': '\u29d5',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
308 '\u29d8': '\u29d9', '\u29da': '\u29db', '\u29f8': '\u29f9',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
309 '\u29fc': '\u29fd', '\u2a2b': '\u2a2c', '\u2a2d': '\u2a2e',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
310 '\u2a34': '\u2a35', '\u2a3c': '\u2a3d', '\u2a64': '\u2a65',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
311 '\u2a79': '\u2a7a', '\u2a7d': '\u2a7e', '\u2a7f': '\u2a80',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
312 '\u2a81': '\u2a82', '\u2a83': '\u2a84', '\u2a8b': '\u2a8c',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
313 '\u2a91': '\u2a92', '\u2a93': '\u2a94', '\u2a95': '\u2a96',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
314 '\u2a97': '\u2a98', '\u2a99': '\u2a9a', '\u2a9b': '\u2a9c',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
315 '\u2aa1': '\u2aa2', '\u2aa6': '\u2aa7', '\u2aa8': '\u2aa9',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
316 '\u2aaa': '\u2aab', '\u2aac': '\u2aad', '\u2aaf': '\u2ab0',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
317 '\u2ab3': '\u2ab4', '\u2abb': '\u2abc', '\u2abd': '\u2abe',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
318 '\u2abf': '\u2ac0', '\u2ac1': '\u2ac2', '\u2ac3': '\u2ac4',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
319 '\u2ac5': '\u2ac6', '\u2acd': '\u2ace', '\u2acf': '\u2ad0',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
320 '\u2ad1': '\u2ad2', '\u2ad3': '\u2ad4', '\u2ad5': '\u2ad6',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
321 '\u2aec': '\u2aed', '\u2af7': '\u2af8', '\u2af9': '\u2afa',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
322 '\u2e02': '\u2e03', '\u2e04': '\u2e05', '\u2e09': '\u2e0a',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
323 '\u2e0c': '\u2e0d', '\u2e1c': '\u2e1d', '\u2e20': '\u2e21',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
324 '\u3008': '\u3009', '\u300a': '\u300b', '\u300c': '\u300d',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
325 '\u300e': '\u300f', '\u3010': '\u3011', '\u3014': '\u3015',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
326 '\u3016': '\u3017', '\u3018': '\u3019', '\u301a': '\u301b',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
327 '\u301d': '\u301e', '\ufd3e': '\ufd3f', '\ufe17': '\ufe18',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
328 '\ufe35': '\ufe36', '\ufe37': '\ufe38', '\ufe39': '\ufe3a',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
329 '\ufe3b': '\ufe3c', '\ufe3d': '\ufe3e', '\ufe3f': '\ufe40',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
330 '\ufe41': '\ufe42', '\ufe43': '\ufe44', '\ufe47': '\ufe48',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
331 '\ufe59': '\ufe5a', '\ufe5b': '\ufe5c', '\ufe5d': '\ufe5e',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
332 '\uff08': '\uff09', '\uff1c': '\uff1e', '\uff3b': '\uff3d',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
333 '\uff5b': '\uff5d', '\uff5f': '\uff60', '\uff62': '\uff63',
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
334 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
335
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
336 bracketsPattern := `[` + regexp.QuoteMeta(joinRuneMap(brackets)) + `]`
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
337
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
338 // Finds opening brackets and their closing counterparts (including pod and heredoc)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
339 // and modifies state groups and position accordingly
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
340 findBrackets := func(tokenClass RakuToken) MutatorFunc {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
341 return func(state *LexerState) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
342 var openingChars []rune
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
343 var adverbs []rune
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
344 switch tokenClass {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
345 case rakuPod:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
346 openingChars = []rune(strings.Join(state.Groups[1:5], ``))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
347 default:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
348 adverbs = []rune(state.NamedGroups[`adverbs`])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
349 openingChars = []rune(state.NamedGroups[`opening_delimiters`])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
350 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
351
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
352 openingChar := openingChars[0]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
353
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
354 nChars := len(openingChars)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
355
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
356 var closingChar rune
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
357 var closingCharExists bool
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
358 var closingChars []rune
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
359
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
360 switch tokenClass {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
361 case rakuPod:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
362 closingCharExists = true
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
363 default:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
364 closingChar, closingCharExists = brackets[openingChar]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
365 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
366
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
367 switch tokenClass {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
368 case rakuPodFormatter:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
369 formatter := StringOther
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
370
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
371 switch state.NamedGroups[`keyword`] {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
372 case "B":
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
373 formatter = GenericStrong
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
374 case "I":
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
375 formatter = GenericEmph
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
376 case "U":
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
377 formatter = GenericUnderline
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
378 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
379
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
380 formatterRule := ruleReplacingConfig{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
381 pattern: `.+?`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
382 tokenType: formatter,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
383 mutator: nil,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
384 stateName: `pod-formatter`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
385 rulePosition: bottomRule,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
386 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
387
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
388 err := replaceRule(formatterRule)(state)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
389 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
390 panic(err)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
391 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
392
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
393 err = replaceRule(ruleReplacingConfig{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
394 delimiter: []rune{closingChar},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
395 tokenType: Punctuation,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
396 stateName: `pod-formatter`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
397 pushState: true,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
398 numberOfDelimiterChars: nChars,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
399 appendMutator: popRule(formatterRule),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
400 })(state)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
401 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
402 panic(err)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
403 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
404
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
405 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
406 case rakuMatchRegex:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
407 var delimiter []rune
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
408 if closingCharExists {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
409 delimiter = []rune{closingChar}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
410 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
411 delimiter = openingChars
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
412 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
413
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
414 err := replaceRule(ruleReplacingConfig{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
415 delimiter: delimiter,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
416 tokenType: Punctuation,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
417 stateName: `regex`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
418 popState: true,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
419 pushState: true,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
420 })(state)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
421 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
422 panic(err)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
423 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
424
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
425 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
426 case rakuSubstitutionRegex:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
427 delimiter := regexp2.Escape(string(openingChars))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
428
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
429 err := replaceRule(ruleReplacingConfig{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
430 pattern: `(` + delimiter + `)` + `((?:\\\\|\\/|.)*?)` + `(` + delimiter + `)`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
431 tokenType: ByGroups(Punctuation, UsingSelf(`qq`), Punctuation),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
432 rulePosition: topRule,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
433 stateName: `regex`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
434 popState: true,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
435 pushState: true,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
436 })(state)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
437 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
438 panic(err)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
439 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
440
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
441 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
442 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
443
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
444 text := state.Text
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
445
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
446 var endPos int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
447
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
448 var nonMirroredOpeningCharPosition int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
449
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
450 if !closingCharExists {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
451 // it's not a mirrored character, which means we
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
452 // just need to look for the next occurrence
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
453 closingChars = openingChars
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
454 nonMirroredOpeningCharPosition = indexAt(text, closingChars, state.Pos)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
455 endPos = nonMirroredOpeningCharPosition
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
456 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
457 var podRegex *regexp2.Regexp
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
458 if tokenClass == rakuPod {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
459 podRegex = regexp2.MustCompile(
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
460 state.NamedGroups[`ws`]+`=end`+`\s+`+regexp2.Escape(state.NamedGroups[`name`]),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
461 0,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
462 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
463 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
464 closingChars = []rune(strings.Repeat(string(closingChar), nChars))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
465 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
466
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
467 // we need to look for the corresponding closing character,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
468 // keep nesting in mind
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
469 nestingLevel := 1
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
470
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
471 searchPos := state.Pos - nChars
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
472
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
473 var nextClosePos int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
474
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
475 for nestingLevel > 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
476 if tokenClass == rakuPod {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
477 match, err := podRegex.FindRunesMatchStartingAt(text, searchPos+nChars)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
478 if err == nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
479 closingChars = match.Runes()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
480 nextClosePos = match.Index
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
481 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
482 nextClosePos = -1
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
483 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
484 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
485 nextClosePos = indexAt(text, closingChars, searchPos+nChars)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
486 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
487
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
488 nextOpenPos := indexAt(text, openingChars, searchPos+nChars)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
489
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
490 switch {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
491 case nextClosePos == -1:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
492 nextClosePos = len(text)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
493 nestingLevel = 0
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
494 case nextOpenPos != -1 && nextOpenPos < nextClosePos:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
495 nestingLevel++
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
496 nChars = len(openingChars)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
497 searchPos = nextOpenPos
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
498 default: // next_close_pos < next_open_pos
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
499 nestingLevel--
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
500 nChars = len(closingChars)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
501 searchPos = nextClosePos
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
502 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
503 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
504
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
505 endPos = nextClosePos
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
506 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
507
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
508 if endPos < 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
509 // if we didn't find a closer, just highlight the
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
510 // rest of the text in this class
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
511 endPos = len(text)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
512 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
513
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
514 adverbre := regexp.MustCompile(`:to\b|:heredoc\b`)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
515 var heredocTerminator []rune
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
516 var endHeredocPos int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
517 if adverbre.MatchString(string(adverbs)) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
518 if endPos != len(text) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
519 heredocTerminator = text[state.Pos:endPos]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
520 nChars = len(heredocTerminator)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
521 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
522 endPos = state.Pos + 1
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
523 heredocTerminator = []rune{}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
524 nChars = 0
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
525 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
526
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
527 if nChars > 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
528 endHeredocPos = indexAt(text[endPos:], heredocTerminator, 0)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
529 if endHeredocPos > -1 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
530 endPos += endHeredocPos
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
531 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
532 endPos = len(text)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
533 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
534 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
535 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
536
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
537 textBetweenBrackets := string(text[state.Pos:endPos])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
538 switch tokenClass {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
539 case rakuPod, rakuPodDeclaration, rakuNameAttribute:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
540 state.NamedGroups[`value`] = textBetweenBrackets
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
541 state.NamedGroups[`closing_delimiters`] = string(closingChars)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
542 case rakuQuote:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
543 if len(heredocTerminator) > 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
544 // Length of heredoc terminator + closing chars + `;`
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
545 heredocFristPunctuationLen := nChars + len(openingChars) + 1
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
546
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
547 state.NamedGroups[`opening_delimiters`] = string(openingChars) +
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
548 string(text[state.Pos:state.Pos+heredocFristPunctuationLen])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
549
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
550 state.NamedGroups[`value`] =
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
551 string(text[state.Pos+heredocFristPunctuationLen : endPos])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
552
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
553 if endHeredocPos > -1 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
554 state.NamedGroups[`closing_delimiters`] = string(heredocTerminator)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
555 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
556 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
557 state.NamedGroups[`value`] = textBetweenBrackets
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
558 if nChars > 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
559 state.NamedGroups[`closing_delimiters`] = string(closingChars)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
560 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
561 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
562 default:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
563 state.Groups = []string{state.Groups[0] + string(text[state.Pos:endPos+nChars])}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
564 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
565
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
566 state.Pos = endPos + nChars
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
567
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
568 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
569 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
570 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
571
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
572 // Raku rules
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
573 // Empty capture groups are placeholders and will be replaced by mutators
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
574 // DO NOT REMOVE THEM!
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
575 return Rules{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
576 "root": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
577 // Placeholder, will be overwritten by mutators, DO NOT REMOVE!
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
578 {`\A\z`, nil, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
579 Include("common"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
580 {`{`, Punctuation, Push(`root`)},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
581 {`\(`, Punctuation, Push(`root`)},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
582 {`[)}]`, Punctuation, Pop(1)},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
583 {`;`, Punctuation, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
584 {`\[|\]`, Operator, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
585 {`.+?`, Text, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
586 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
587 "common": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
588 {`^#![^\n]*$`, CommentHashbang, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
589 Include("pod"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
590 // Multi-line, Embedded comment
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
591 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
592 "#`(?<opening_delimiters>(?<delimiter>" + bracketsPattern + `)\k<delimiter>*)`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
593 CommentMultiline,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
594 findBrackets(rakuMultilineComment),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
595 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
596 {`#[^\n]*$`, CommentSingle, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
597 // /regex/
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
598 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
599 `(?<=(?:^|\(|=|:|~~|\[|{|,|=>)\s*)(/)(?!\]|\))((?:\\\\|\\/|.)*?)((?<!(?<!\\)\\)/(?!'|"))`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
600 ByGroups(Punctuation, UsingSelf("regex"), Punctuation),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
601 nil,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
602 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
603 Include("variable"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
604 // ::?VARIABLE
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
605 {`::\?\w+(?::[_UD])?`, NameVariableGlobal, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
606 // Version
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
607 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
608 `\b(v)(\d+)((?:\.(?:\*|[\d\w]+))*)(\+)?`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
609 ByGroups(Keyword, NumberInteger, NameEntity, Operator),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
610 nil,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
611 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
612 Include("number"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
613 // Hyperoperator | »*«
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
614 {`(>>)(\S+?)(<<)`, ByGroups(Operator, UsingSelf("root"), Operator), nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
615 {`(»)(\S+?)(«)`, ByGroups(Operator, UsingSelf("root"), Operator), nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
616 // Hyperoperator | «*«
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
617 {`(<<)(\S+?)(<<)`, ByGroups(Operator, UsingSelf("root"), Operator), nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
618 {`(«)(\S+?)(«)`, ByGroups(Operator, UsingSelf("root"), Operator), nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
619 // Hyperoperator | »*»
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
620 {`(>>)(\S+?)(>>)`, ByGroups(Operator, UsingSelf("root"), Operator), nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
621 {`(»)(\S+?)(»)`, ByGroups(Operator, UsingSelf("root"), Operator), nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
622 // <<quoted words>>
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
623 {`(?<!(?:\d+|\.(?:Int|Numeric)|[$@%]\*?[\w':-]+\s+|[\])}]\s+)\s*)(<<)(?!(?:(?!>>)[^\n])+?[},;] *\n)(?!(?:(?!>>).)+?>>\S+?>>)`, Punctuation, Push("<<")},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
624 // «quoted words»
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
625 {`(?<!(?:\d+|\.(?:Int|Numeric)|[$@%]\*?[\w':-]+\s+|[\])}]\s+)\s*)(«)(?![^»]+?[},;] *\n)(?![^»]+?»\S+?»)`, Punctuation, Push("«")},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
626 // [<]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
627 {`(?<=\[\\?)<(?=\])`, Operator, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
628 // < and > operators | something < onething > something
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
629 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
630 `(?<=[$@%&]?\w[\w':-]* +)(<=?)( *[^ ]+? *)(>=?)(?= *[$@%&]?\w[\w':-]*)`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
631 ByGroups(Operator, UsingSelf("root"), Operator),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
632 nil,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
633 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
634 // <quoted words>
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
635 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
636 `(?<!(?:\d+|\.(?:Int|Numeric)|[$@%]\*?[\w':-]+\s+|[\])}]\s+)\s*)(<)((?:(?![,;)}] *(?:#[^\n]+)?\n)[^<>])+?)(>)(?!\s*(?:\d+|\.(?:Int|Numeric)|[$@%]\*?\w[\w':-]*[^(]|\s+\[))`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
637 ByGroups(Punctuation, String, Punctuation),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
638 nil,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
639 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
640 {`C?X::['\w:-]+`, NameException, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
641 Include("metaoperator"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
642 // Pair | key => value
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
643 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
644 `(\w[\w'-]*)(\s*)(=>)`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
645 ByGroups(String, Text, Operator),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
646 nil,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
647 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
648 Include("colon-pair"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
649 // Token
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
650 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
651 `(?<=(?:^|\s)(?:regex|token|rule)(\s+))` + namePattern + colonPairLookahead + `\s*[({])`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
652 NameFunction,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
653 Push("token", "name-adverb"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
654 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
655 // Substitution
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
656 {`(?<=^|\b|\s)(?<!\.)(ss|S|s|TR|tr)\b(\s*)`, ByGroups(Keyword, Text), Push("substitution")},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
657 {keywordsPattern, Keyword, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
658 {builtinTypesPattern, NameBuiltin, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
659 {builtinRoutinesPattern, NameBuiltin, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
660 // Class name
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
661 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
662 `(?<=(?:^|\s)(?:class|grammar|role|does|but|is|subset|of)\s+)` + namePattern,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
663 NameClass,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
664 Push("name-adverb"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
665 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
666 // Routine
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
667 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
668 `(?<=(?:^|\s)(?:sub|method|multi sub|multi)\s+)!?` + namePattern + colonPairLookahead + `\s*[({])`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
669 NameFunction,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
670 Push("name-adverb"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
671 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
672 // Constant
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
673 {`(?<=\bconstant\s+)` + namePattern, NameConstant, Push("name-adverb")},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
674 // Namespace
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
675 {`(?<=\b(?:use|module|package)\s+)` + namePattern, NameNamespace, Push("name-adverb")},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
676 Include("operator"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
677 Include("single-quote"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
678 {`(?<!(?<!\\)\\)"`, Punctuation, Push("double-quotes")},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
679 // m,rx regex
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
680 {`(?<=^|\b|\s)(ms|m|rx)\b(\s*)`, ByGroups(Keyword, Text), Push("rx")},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
681 // Quote constructs
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
682 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
683 `(?<=^|\b|\s)(?<keyword>(?:qq|q|Q))(?<adverbs>(?::?(?:heredoc|to|qq|ww|q|w|s|a|h|f|c|b|to|v|x))*)(?<ws>\s*)(?<opening_delimiters>(?<delimiter>[^0-9a-zA-Z:\s])\k<delimiter>*)`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
684 EmitterFunc(quote),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
685 findBrackets(rakuQuote),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
686 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
687 // Function
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
688 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
689 `\b` + namePattern + colonPairLookahead + `\()`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
690 NameFunction,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
691 Push("name-adverb"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
692 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
693 // Method
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
694 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
695 `(?<!\.\.[?^*+]?)(?<=(?:\.[?^*+&]?)|self!)` + namePattern + colonPairLookahead + `\b)`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
696 NameFunction,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
697 Push("name-adverb"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
698 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
699 // Indirect invocant
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
700 {namePattern + `(?=\s+\W?['\w:-]+:\W)`, NameFunction, Push("name-adverb")},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
701 {`(?<=\W)(?:∅|i|e|𝑒|tau|τ|pi|π|Inf|∞)(?=\W)`, NameConstant, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
702 {`(「)([^」]*)(」)`, ByGroups(Punctuation, String, Punctuation), nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
703 {`(?<=^ *)\b` + namePattern + `(?=:\s*(?:for|while|loop))`, NameLabel, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
704 // Sigilless variable
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
705 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
706 `(?<=\b(?:my|our|constant|let|temp)\s+)\\` + namePattern,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
707 NameVariable,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
708 Push("name-adverb"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
709 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
710 {namePattern, Name, Push("name-adverb")},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
711 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
712 "rx": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
713 Include("colon-pair-attribute"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
714 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
715 `(?<opening_delimiters>(?<delimiter>[^\w:\s])\k<delimiter>*)`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
716 ByGroupNames(
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
717 map[string]Emitter{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
718 `opening_delimiters`: Punctuation,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
719 `delimiter`: nil,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
720 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
721 ),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
722 findBrackets(rakuMatchRegex),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
723 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
724 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
725 "substitution": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
726 Include("colon-pair-attribute"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
727 // Substitution | s{regex} = value
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
728 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
729 `(?<opening_delimiters>(?<delimiter>` + bracketsPattern + `)\k<delimiter>*)`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
730 ByGroupNames(map[string]Emitter{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
731 `opening_delimiters`: Punctuation,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
732 `delimiter`: nil,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
733 }),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
734 findBrackets(rakuMatchRegex),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
735 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
736 // Substitution | s/regex/string/
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
737 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
738 `(?<opening_delimiters>[^\w:\s])`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
739 Punctuation,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
740 findBrackets(rakuSubstitutionRegex),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
741 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
742 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
743 "number": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
744 {`0_?[0-7]+(_[0-7]+)*`, LiteralNumberOct, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
745 {`0x[0-9A-Fa-f]+(_[0-9A-Fa-f]+)*`, LiteralNumberHex, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
746 {`0b[01]+(_[01]+)*`, LiteralNumberBin, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
747 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
748 `(?i)(\d*(_\d*)*\.\d+(_\d*)*|\d+(_\d*)*\.\d+(_\d*)*)(e[+-]?\d+)?`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
749 LiteralNumberFloat,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
750 nil,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
751 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
752 {`(?i)\d+(_\d*)*e[+-]?\d+(_\d*)*`, LiteralNumberFloat, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
753 {`(?<=\d+)i`, NameConstant, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
754 {`\d+(_\d+)*`, LiteralNumberInteger, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
755 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
756 "name-adverb": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
757 Include("colon-pair-attribute-keyvalue"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
758 Default(Pop(1)),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
759 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
760 "colon-pair": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
761 // :key(value)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
762 {colonPairPattern, colonPair(String), findBrackets(rakuNameAttribute)},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
763 // :123abc
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
764 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
765 `(:)(\d+)(\w[\w'-]*)`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
766 ByGroups(Punctuation, UsingSelf("number"), String),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
767 nil,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
768 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
769 // :key
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
770 {`(:)(!?)(\w[\w'-]*)`, ByGroups(Punctuation, Operator, String), nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
771 {`\s+`, Text, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
772 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
773 "colon-pair-attribute": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
774 // :key(value)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
775 {colonPairPattern, colonPair(NameAttribute), findBrackets(rakuNameAttribute)},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
776 // :123abc
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
777 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
778 `(:)(\d+)(\w[\w'-]*)`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
779 ByGroups(Punctuation, UsingSelf("number"), NameAttribute),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
780 nil,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
781 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
782 // :key
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
783 {`(:)(!?)(\w[\w'-]*)`, ByGroups(Punctuation, Operator, NameAttribute), nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
784 {`\s+`, Text, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
785 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
786 "colon-pair-attribute-keyvalue": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
787 // :key(value)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
788 {colonPairPattern, colonPair(NameAttribute), findBrackets(rakuNameAttribute)},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
789 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
790 "escape-qq": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
791 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
792 `(?<!(?<!\\)\\)(\\qq)(\[)(.+?)(\])`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
793 ByGroups(StringEscape, Punctuation, UsingSelf("qq"), Punctuation),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
794 nil,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
795 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
796 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
797 `escape-char`: {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
798 {`(?<!(?<!\\)\\)(\\[abfrnrt])`, StringEscape, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
799 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
800 `escape-single-quote`: {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
801 {`(?<!(?<!\\)\\)(\\)(['\\])`, ByGroups(StringEscape, StringSingle), nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
802 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
803 "escape-c-name": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
804 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
805 `(?<!(?<!\\)\\)(\\[c|C])(\[)(.+?)(\])`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
806 ByGroups(StringEscape, Punctuation, String, Punctuation),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
807 nil,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
808 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
809 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
810 "escape-hexadecimal": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
811 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
812 `(?<!(?<!\\)\\)(\\[x|X])(\[)([0-9a-fA-F]+)(\])`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
813 ByGroups(StringEscape, Punctuation, NumberHex, Punctuation),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
814 nil,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
815 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
816 {`(\\[x|X])([0-9a-fA-F]+)`, ByGroups(StringEscape, NumberHex), nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
817 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
818 "regex": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
819 // Placeholder, will be overwritten by mutators, DO NOT REMOVE!
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
820 {`\A\z`, nil, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
821 Include("regex-escape-class"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
822 Include(`regex-character-escape`),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
823 // $(code)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
824 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
825 `([$@])((?<!(?<!\\)\\)\()`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
826 ByGroups(Keyword, Punctuation),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
827 replaceRule(ruleReplacingConfig{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
828 delimiter: []rune(`)`),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
829 tokenType: Punctuation,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
830 stateName: `root`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
831 pushState: true,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
832 }),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
833 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
834 // Exclude $/ from variables, because we can't get out of the end of the slash regex: $/;
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
835 {`\$(?=/)`, NameEntity, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
836 // Exclude $ from variables
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
837 {`\$(?=\z|\s|[^<(\w*!.])`, NameEntity, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
838 Include("variable"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
839 Include("escape-c-name"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
840 Include("escape-hexadecimal"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
841 Include("number"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
842 Include("single-quote"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
843 // :my variable code ...
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
844 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
845 `(?<!(?<!\\)\\)(:)(my|our|state|constant|temp|let)`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
846 ByGroups(Operator, KeywordDeclaration),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
847 replaceRule(ruleReplacingConfig{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
848 delimiter: []rune(`;`),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
849 tokenType: Punctuation,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
850 stateName: `root`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
851 pushState: true,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
852 }),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
853 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
854 // <{code}>
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
855 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
856 `(?<!(?<!\\)\\)(<)([?!.]*)((?<!(?<!\\)\\){)`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
857 ByGroups(Punctuation, Operator, Punctuation),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
858 replaceRule(ruleReplacingConfig{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
859 delimiter: []rune(`}>`),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
860 tokenType: Punctuation,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
861 stateName: `root`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
862 pushState: true,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
863 }),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
864 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
865 // {code}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
866 Include(`closure`),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
867 // Properties
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
868 {`(:)(\w+)`, ByGroups(Punctuation, NameAttribute), nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
869 // Operator
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
870 {`\|\||\||&&|&|\.\.|\*\*|%%|%|:|!|<<|«|>>|»|\+|\*\*|\*|\?|=|~|<~~>`, Operator, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
871 // Anchors
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
872 {`\^\^|\^|\$\$|\$`, NameEntity, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
873 {`\.`, NameEntity, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
874 {`#[^\n]*\n`, CommentSingle, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
875 // Lookaround
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
876 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
877 `(?<!(?<!\\)\\)(<)(\s*)([?!.]+)(\s*)(after|before)`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
878 ByGroups(Punctuation, Text, Operator, Text, OperatorWord),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
879 replaceRule(ruleReplacingConfig{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
880 delimiter: []rune(`>`),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
881 tokenType: Punctuation,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
882 stateName: `regex`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
883 pushState: true,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
884 }),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
885 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
886 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
887 `(?<!(?<!\\)\\)(<)([|!?.]*)(wb|ww|ws|w)(>)`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
888 ByGroups(Punctuation, Operator, OperatorWord, Punctuation),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
889 nil,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
890 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
891 // <$variable>
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
892 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
893 `(?<!(?<!\\)\\)(<)([?!.]*)([$@]\w[\w:-]*)(>)`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
894 ByGroups(Punctuation, Operator, NameVariable, Punctuation),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
895 nil,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
896 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
897 // Capture markers
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
898 {`(?<!(?<!\\)\\)<\(|\)>`, Operator, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
899 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
900 `(?<!(?<!\\)\\)(<)(\w[\w:-]*)(=\.?)`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
901 ByGroups(Punctuation, NameVariable, Operator),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
902 Push(`regex-variable`),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
903 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
904 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
905 `(?<!(?<!\\)\\)(<)([|!?.&]*)(\w(?:(?!:\s)[\w':-])*)`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
906 ByGroups(Punctuation, Operator, NameFunction),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
907 Push(`regex-function`),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
908 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
909 {`(?<!(?<!\\)\\)<`, Punctuation, Push("regex-property")},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
910 {`(?<!(?<!\\)\\)"`, Punctuation, Push("double-quotes")},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
911 {`(?<!(?<!\\)\\)(?:\]|\))`, Punctuation, Pop(1)},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
912 {`(?<!(?<!\\)\\)(?:\[|\()`, Punctuation, Push("regex")},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
913 {`.+?`, StringRegex, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
914 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
915 "regex-class-builtin": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
916 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
917 `\b(?:alnum|alpha|blank|cntrl|digit|graph|lower|print|punct|space|upper|xdigit|same|ident)\b`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
918 NameBuiltin,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
919 nil,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
920 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
921 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
922 "regex-function": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
923 // <function>
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
924 {`(?<!(?<!\\)\\)>`, Punctuation, Pop(1)},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
925 // <function(parameter)>
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
926 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
927 `\(`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
928 Punctuation,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
929 replaceRule(ruleReplacingConfig{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
930 delimiter: []rune(`)>`),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
931 tokenType: Punctuation,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
932 stateName: `root`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
933 popState: true,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
934 pushState: true,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
935 }),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
936 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
937 // <function value>
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
938 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
939 `\s+`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
940 StringRegex,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
941 replaceRule(ruleReplacingConfig{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
942 delimiter: []rune(`>`),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
943 tokenType: Punctuation,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
944 stateName: `regex`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
945 popState: true,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
946 pushState: true,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
947 }),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
948 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
949 // <function: value>
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
950 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
951 `:`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
952 Punctuation,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
953 replaceRule(ruleReplacingConfig{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
954 delimiter: []rune(`>`),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
955 tokenType: Punctuation,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
956 stateName: `root`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
957 popState: true,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
958 pushState: true,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
959 }),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
960 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
961 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
962 "regex-variable": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
963 Include(`regex-starting-operators`),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
964 // <var=function(
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
965 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
966 `(&)?(\w(?:(?!:\s)[\w':-])*)(?=\()`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
967 ByGroups(Operator, NameFunction),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
968 Mutators(Pop(1), Push(`regex-function`)),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
969 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
970 // <var=function>
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
971 {`(&)?(\w[\w':-]*)(>)`, ByGroups(Operator, NameFunction, Punctuation), Pop(1)},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
972 // <var=
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
973 Default(Pop(1), Push(`regex-property`)),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
974 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
975 "regex-property": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
976 {`(?<!(?<!\\)\\)>`, Punctuation, Pop(1)},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
977 Include("regex-class-builtin"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
978 Include("variable"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
979 Include(`regex-starting-operators`),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
980 Include("colon-pair-attribute"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
981 {`(?<!(?<!\\)\\)\[`, Punctuation, Push("regex-character-class")},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
982 {`\+|\-`, Operator, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
983 {`@[\w':-]+`, NameVariable, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
984 {`.+?`, StringRegex, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
985 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
986 `regex-starting-operators`: {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
987 {`(?<=<)[|!?.]+`, Operator, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
988 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
989 "regex-escape-class": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
990 {`(?i)\\n|\\t|\\h|\\v|\\s|\\d|\\w`, StringEscape, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
991 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
992 `regex-character-escape`: {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
993 {`(?<!(?<!\\)\\)(\\)(.)`, ByGroups(StringEscape, StringRegex), nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
994 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
995 "regex-character-class": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
996 {`(?<!(?<!\\)\\)\]`, Punctuation, Pop(1)},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
997 Include("regex-escape-class"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
998 Include("escape-c-name"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
999 Include("escape-hexadecimal"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1000 Include(`regex-character-escape`),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1001 Include("number"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1002 {`\.\.`, Operator, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1003 {`.+?`, StringRegex, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1004 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1005 "metaoperator": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1006 // Z[=>]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1007 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1008 `\b([RZX]+)\b(\[)([^\s\]]+?)(\])`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1009 ByGroups(OperatorWord, Punctuation, UsingSelf("root"), Punctuation),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1010 nil,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1011 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1012 // Z=>
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1013 {`\b([RZX]+)\b([^\s\]]+)`, ByGroups(OperatorWord, UsingSelf("operator")), nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1014 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1015 "operator": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1016 // Word Operator
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1017 {wordOperatorsPattern, OperatorWord, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1018 // Operator
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1019 {operatorsPattern, Operator, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1020 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1021 "pod": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1022 // Single-line pod declaration
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1023 {`(#[|=])\s`, Keyword, Push("pod-single")},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1024 // Multi-line pod declaration
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1025 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1026 "(?<keyword>#[|=])(?<opening_delimiters>(?<delimiter>" + bracketsPattern + `)\k<delimiter>*)(?<value>)(?<closing_delimiters>)`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1027 ByGroupNames(
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1028 map[string]Emitter{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1029 `keyword`: Keyword,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1030 `opening_delimiters`: Punctuation,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1031 `delimiter`: nil,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1032 `value`: UsingSelf("pod-declaration"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1033 `closing_delimiters`: Punctuation,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1034 }),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1035 findBrackets(rakuPodDeclaration),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1036 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1037 Include("pod-blocks"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1038 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1039 "pod-blocks": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1040 // =begin code
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1041 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1042 `(?<=^ *)(?<ws> *)(?<keyword>=begin)(?<ws2> +)(?<name>code)(?<config>[^\n]*)(?<value>.*?)(?<ws3>^\k<ws>)(?<end_keyword>=end)(?<ws4> +)\k<name>`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1043 EmitterFunc(podCode),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1044 nil,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1045 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1046 // =begin
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1047 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1048 `(?<=^ *)(?<ws> *)(?<keyword>=begin)(?<ws2> +)(?!code)(?<name>\w[\w'-]*)(?<config>[^\n]*)(?<value>)(?<closing_delimiters>)`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1049 ByGroupNames(
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1050 map[string]Emitter{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1051 `ws`: Comment,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1052 `keyword`: Keyword,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1053 `ws2`: StringDoc,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1054 `name`: Keyword,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1055 `config`: EmitterFunc(podConfig),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1056 `value`: UsingSelf("pod-begin"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1057 `closing_delimiters`: Keyword,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1058 }),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1059 findBrackets(rakuPod),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1060 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1061 // =for ...
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1062 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1063 `(?<=^ *)(?<ws> *)(?<keyword>=(?:for|defn))(?<ws2> +)(?<name>\w[\w'-]*)(?<config>[^\n]*\n)`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1064 ByGroups(Comment, Keyword, StringDoc, Keyword, EmitterFunc(podConfig)),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1065 Push("pod-paragraph"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1066 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1067 // =config
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1068 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1069 `(?<=^ *)(?<ws> *)(?<keyword>=config)(?<ws2> +)(?<name>\w[\w'-]*)(?<config>[^\n]*\n)`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1070 ByGroups(Comment, Keyword, StringDoc, Keyword, EmitterFunc(podConfig)),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1071 nil,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1072 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1073 // =alias
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1074 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1075 `(?<=^ *)(?<ws> *)(?<keyword>=alias)(?<ws2> +)(?<name>\w[\w'-]*)(?<value>[^\n]*\n)`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1076 ByGroups(Comment, Keyword, StringDoc, Keyword, StringDoc),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1077 nil,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1078 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1079 // =encoding
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1080 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1081 `(?<=^ *)(?<ws> *)(?<keyword>=encoding)(?<ws2> +)(?<name>[^\n]+)`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1082 ByGroups(Comment, Keyword, StringDoc, Name),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1083 nil,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1084 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1085 // =para ...
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1086 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1087 `(?<=^ *)(?<ws> *)(?<keyword>=(?:para|table|pod))(?<config>(?<!\n\s*)[^\n]*\n)`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1088 ByGroups(Comment, Keyword, EmitterFunc(podConfig)),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1089 Push("pod-paragraph"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1090 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1091 // =head1 ...
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1092 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1093 `(?<=^ *)(?<ws> *)(?<keyword>=head\d+)(?<ws2> *)(?<config>#?)`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1094 ByGroups(Comment, Keyword, GenericHeading, Keyword),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1095 Push("pod-heading"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1096 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1097 // =item ...
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1098 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1099 `(?<=^ *)(?<ws> *)(?<keyword>=(?:item\d*|comment|data|[A-Z]+))(?<ws2> *)(?<config>#?)`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1100 ByGroups(Comment, Keyword, StringDoc, Keyword),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1101 Push("pod-paragraph"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1102 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1103 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1104 `(?<=^ *)(?<ws> *)(?<keyword>=finish)(?<config>[^\n]*)`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1105 ByGroups(Comment, Keyword, EmitterFunc(podConfig)),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1106 Push("pod-finish"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1107 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1108 // ={custom} ...
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1109 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1110 `(?<=^ *)(?<ws> *)(?<name>=\w[\w'-]*)(?<ws2> *)(?<config>#?)`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1111 ByGroups(Comment, Name, StringDoc, Keyword),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1112 Push("pod-paragraph"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1113 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1114 // = podconfig
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1115 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1116 `(?<=^ *)(?<keyword> *=)(?<ws> *)(?<config>(?::\w[\w'-]*(?:` + colonPairOpeningBrackets + `.+?` +
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1117 colonPairClosingBrackets + `) *)*\n)`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1118 ByGroups(Keyword, StringDoc, EmitterFunc(podConfig)),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1119 nil,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1120 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1121 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1122 "pod-begin": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1123 Include("pod-blocks"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1124 Include("pre-pod-formatter"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1125 {`.+?`, StringDoc, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1126 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1127 "pod-declaration": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1128 Include("pre-pod-formatter"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1129 {`.+?`, StringDoc, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1130 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1131 "pod-paragraph": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1132 {`\n *\n|\n(?=^ *=)`, StringDoc, Pop(1)},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1133 Include("pre-pod-formatter"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1134 {`.+?`, StringDoc, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1135 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1136 "pod-single": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1137 {`\n`, StringDoc, Pop(1)},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1138 Include("pre-pod-formatter"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1139 {`.+?`, StringDoc, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1140 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1141 "pod-heading": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1142 {`\n *\n|\n(?=^ *=)`, GenericHeading, Pop(1)},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1143 Include("pre-pod-formatter"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1144 {`.+?`, GenericHeading, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1145 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1146 "pod-finish": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1147 {`\z`, nil, Pop(1)},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1148 Include("pre-pod-formatter"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1149 {`.+?`, StringDoc, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1150 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1151 "pre-pod-formatter": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1152 // C<code>, B<bold>, ...
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1153 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1154 `(?<keyword>[CBIUDTKRPAELZVMSXN])(?<opening_delimiters><+|«)`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1155 ByGroups(Keyword, Punctuation),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1156 findBrackets(rakuPodFormatter),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1157 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1158 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1159 "pod-formatter": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1160 // Placeholder rule, will be replaced by mutators. DO NOT REMOVE!
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1161 {`>`, Punctuation, Pop(1)},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1162 Include("pre-pod-formatter"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1163 // Placeholder rule, will be replaced by mutators. DO NOT REMOVE!
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1164 {`.+?`, StringOther, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1165 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1166 "variable": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1167 {variablePattern, NameVariable, Push("name-adverb")},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1168 {globalVariablePattern, NameVariableGlobal, Push("name-adverb")},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1169 {`[$@]<[^>]+>`, NameVariable, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1170 {`\$[/!¢]`, NameVariable, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1171 {`[$@%]`, NameVariable, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1172 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1173 "single-quote": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1174 {`(?<!(?<!\\)\\)'`, Punctuation, Push("single-quote-inner")},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1175 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1176 "single-quote-inner": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1177 {`(?<!(?<!(?<!\\)\\)\\)'`, Punctuation, Pop(1)},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1178 Include("escape-single-quote"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1179 Include("escape-qq"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1180 {`(?:\\\\|\\[^\\]|[^'\\])+?`, StringSingle, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1181 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1182 "double-quotes": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1183 {`(?<!(?<!\\)\\)"`, Punctuation, Pop(1)},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1184 Include("qq"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1185 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1186 "<<": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1187 {`>>(?!\s*(?:\d+|\.(?:Int|Numeric)|[$@%]\*?[\w':-]+|\s+\[))`, Punctuation, Pop(1)},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1188 Include("ww"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1189 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1190 "«": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1191 {`»(?!\s*(?:\d+|\.(?:Int|Numeric)|[$@%]\*?[\w':-]+|\s+\[))`, Punctuation, Pop(1)},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1192 Include("ww"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1193 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1194 "ww": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1195 Include("single-quote"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1196 Include("qq"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1197 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1198 "qq": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1199 Include("qq-variable"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1200 Include("closure"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1201 Include(`escape-char`),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1202 Include("escape-hexadecimal"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1203 Include("escape-c-name"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1204 Include("escape-qq"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1205 {`.+?`, StringDouble, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1206 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1207 "qq-variable": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1208 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1209 `(?<!(?<!\\)\\)(?:` + variablePattern + `|` + globalVariablePattern + `)` + colonPairLookahead + `)`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1210 NameVariable,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1211 Push("qq-variable-extras", "name-adverb"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1212 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1213 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1214 "qq-variable-extras": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1215 // Method
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1216 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1217 `(?<operator>\.)(?<method_name>` + namePattern + `)` + colonPairLookahead + `\()`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1218 ByGroupNames(map[string]Emitter{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1219 `operator`: Operator,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1220 `method_name`: NameFunction,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1221 }),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1222 Push(`name-adverb`),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1223 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1224 // Function/Signature
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1225 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1226 `\(`, Punctuation, replaceRule(
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1227 ruleReplacingConfig{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1228 delimiter: []rune(`)`),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1229 tokenType: Punctuation,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1230 stateName: `root`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1231 pushState: true,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1232 }),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1233 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1234 Default(Pop(1)),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1235 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1236 "Q": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1237 Include("escape-qq"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1238 {`.+?`, String, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1239 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1240 "Q-closure": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1241 Include("escape-qq"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1242 Include("closure"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1243 {`.+?`, String, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1244 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1245 "Q-variable": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1246 Include("escape-qq"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1247 Include("qq-variable"),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1248 {`.+?`, String, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1249 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1250 "closure": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1251 {`(?<!(?<!\\)\\){`, Punctuation, replaceRule(
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1252 ruleReplacingConfig{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1253 delimiter: []rune(`}`),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1254 tokenType: Punctuation,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1255 stateName: `root`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1256 pushState: true,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1257 }),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1258 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1259 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1260 "token": {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1261 // Token signature
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1262 {`\(`, Punctuation, replaceRule(
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1263 ruleReplacingConfig{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1264 delimiter: []rune(`)`),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1265 tokenType: Punctuation,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1266 stateName: `root`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1267 pushState: true,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1268 }),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1269 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1270 {`{`, Punctuation, replaceRule(
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1271 ruleReplacingConfig{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1272 delimiter: []rune(`}`),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1273 tokenType: Punctuation,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1274 stateName: `regex`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1275 popState: true,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1276 pushState: true,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1277 }),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1278 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1279 {`\s*`, Text, nil},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1280 Default(Pop(1)),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1281 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1282 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1283 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1284
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1285 // Joins keys of rune map
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1286 func joinRuneMap(m map[rune]rune) string {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1287 runes := make([]rune, 0, len(m))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1288 for k := range m {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1289 runes = append(runes, k)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1290 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1291
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1292 return string(runes)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1293 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1294
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1295 // Finds the index of substring in the string starting at position n
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1296 func indexAt(str []rune, substr []rune, pos int) int {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1297 strFromPos := str[pos:]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1298 text := string(strFromPos)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1299
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1300 idx := strings.Index(text, string(substr))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1301 if idx > -1 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1302 idx = utf8.RuneCountInString(text[:idx])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1303
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1304 // Search again if the substr is escaped with backslash
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1305 if (idx > 1 && strFromPos[idx-1] == '\\' && strFromPos[idx-2] != '\\') ||
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1306 (idx == 1 && strFromPos[idx-1] == '\\') {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1307 idx = indexAt(str[pos:], substr, idx+1)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1308
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1309 idx = utf8.RuneCountInString(text[:idx])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1310
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1311 if idx < 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1312 return idx
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1313 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1314 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1315 idx += pos
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1316 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1317
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1318 return idx
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1319 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1320
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1321 // Tells if an array of string contains a string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1322 func contains(s []string, e string) bool {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1323 for _, value := range s {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1324 if value == e {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1325 return true
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1326 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1327 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1328 return false
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1329 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1330
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1331 type rulePosition int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1332
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1333 const (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1334 topRule rulePosition = 0
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1335 bottomRule = -1
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1336 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1337
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1338 type ruleMakingConfig struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1339 delimiter []rune
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1340 pattern string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1341 tokenType Emitter
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1342 mutator Mutator
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1343 numberOfDelimiterChars int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1344 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1345
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1346 type ruleReplacingConfig struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1347 delimiter []rune
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1348 pattern string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1349 tokenType Emitter
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1350 numberOfDelimiterChars int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1351 mutator Mutator
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1352 appendMutator Mutator
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1353 rulePosition rulePosition
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1354 stateName string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1355 pop bool
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1356 popState bool
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1357 pushState bool
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1358 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1359
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1360 // Pops rule from state-stack and replaces the rule with the previous rule
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1361 func popRule(rule ruleReplacingConfig) MutatorFunc {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1362 return func(state *LexerState) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1363 stackName := genStackName(rule.stateName, rule.rulePosition)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1364
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1365 stack, ok := state.Get(stackName).([]ruleReplacingConfig)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1366
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1367 if ok && len(stack) > 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1368 // Pop from stack
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1369 stack = stack[:len(stack)-1]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1370 lastRule := stack[len(stack)-1]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1371 lastRule.pushState = false
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1372 lastRule.popState = false
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1373 lastRule.pop = true
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1374 state.Set(stackName, stack)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1375
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1376 // Call replaceRule to use the last rule
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1377 err := replaceRule(lastRule)(state)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1378 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1379 panic(err)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1380 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1381 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1382
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1383 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1384 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1385 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1386
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1387 // Replaces a state's rule based on the rule config and position
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1388 func replaceRule(rule ruleReplacingConfig) MutatorFunc {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1389 return func(state *LexerState) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1390 stateName := rule.stateName
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1391 stackName := genStackName(rule.stateName, rule.rulePosition)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1392
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1393 stack, ok := state.Get(stackName).([]ruleReplacingConfig)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1394 if !ok {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1395 stack = []ruleReplacingConfig{}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1396 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1397
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1398 // If state-stack is empty fill it with the placeholder rule
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1399 if len(stack) == 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1400 stack = []ruleReplacingConfig{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1401 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1402 // Placeholder, will be overwritten by mutators, DO NOT REMOVE!
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1403 pattern: `\A\z`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1404 tokenType: nil,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1405 mutator: nil,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1406 stateName: stateName,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1407 rulePosition: rule.rulePosition,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1408 },
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1409 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1410 state.Set(stackName, stack)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1411 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1412
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1413 var mutator Mutator
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1414 mutators := []Mutator{}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1415
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1416 switch {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1417 case rule.rulePosition == topRule && rule.mutator == nil:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1418 // Default mutator for top rule
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1419 mutators = []Mutator{Pop(1), popRule(rule)}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1420 case rule.rulePosition == topRule && rule.mutator != nil:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1421 // Default mutator for top rule, when rule.mutator is set
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1422 mutators = []Mutator{rule.mutator, popRule(rule)}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1423 case rule.mutator != nil:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1424 mutators = []Mutator{rule.mutator}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1425 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1426
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1427 if rule.appendMutator != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1428 mutators = append(mutators, rule.appendMutator)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1429 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1430
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1431 if len(mutators) > 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1432 mutator = Mutators(mutators...)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1433 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1434 mutator = nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1435 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1436
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1437 ruleConfig := ruleMakingConfig{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1438 pattern: rule.pattern,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1439 delimiter: rule.delimiter,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1440 numberOfDelimiterChars: rule.numberOfDelimiterChars,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1441 tokenType: rule.tokenType,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1442 mutator: mutator,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1443 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1444
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1445 cRule := makeRule(ruleConfig)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1446
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1447 switch rule.rulePosition {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1448 case topRule:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1449 state.Rules[stateName][0] = cRule
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1450 case bottomRule:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1451 state.Rules[stateName][len(state.Rules[stateName])-1] = cRule
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1452 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1453
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1454 // Pop state name from stack if asked. State should be popped first before Pushing
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1455 if rule.popState {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1456 err := Pop(1).Mutate(state)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1457 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1458 panic(err)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1459 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1460 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1461
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1462 // Push state name to stack if asked
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1463 if rule.pushState {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1464 err := Push(stateName).Mutate(state)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1465 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1466 panic(err)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1467 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1468 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1469
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1470 if !rule.pop {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1471 state.Set(stackName, append(stack, rule))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1472 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1473
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1474 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1475 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1476 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1477
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1478 // Generates rule replacing stack using state name and rule position
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1479 func genStackName(stateName string, rulePosition rulePosition) (stackName string) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1480 switch rulePosition {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1481 case topRule:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1482 stackName = stateName + `-top-stack`
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1483 case bottomRule:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1484 stackName = stateName + `-bottom-stack`
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1485 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1486 return
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1487 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1488
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1489 // Makes a compiled rule and returns it
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1490 func makeRule(config ruleMakingConfig) *CompiledRule {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1491 var rePattern string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1492
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1493 if len(config.delimiter) > 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1494 delimiter := string(config.delimiter)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1495
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1496 if config.numberOfDelimiterChars > 1 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1497 delimiter = strings.Repeat(delimiter, config.numberOfDelimiterChars)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1498 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1499
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1500 rePattern = `(?<!(?<!\\)\\)` + regexp2.Escape(delimiter)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1501 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1502 rePattern = config.pattern
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1503 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1504
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1505 regex := regexp2.MustCompile(rePattern, regexp2.None)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1506
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1507 cRule := &CompiledRule{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1508 Rule: Rule{rePattern, config.tokenType, config.mutator},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1509 Regexp: regex,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1510 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1511
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1512 return cRule
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1513 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1514
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1515 // Emitter for colon pairs, changes token state based on key and brackets
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1516 func colonPair(tokenClass TokenType) Emitter {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1517 return EmitterFunc(func(groups []string, state *LexerState) Iterator {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1518 iterators := []Iterator{}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1519 tokens := []Token{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1520 {Punctuation, state.NamedGroups[`colon`]},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1521 {Punctuation, state.NamedGroups[`opening_delimiters`]},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1522 {Punctuation, state.NamedGroups[`closing_delimiters`]},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1523 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1524
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1525 // Append colon
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1526 iterators = append(iterators, Literator(tokens[0]))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1527
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1528 if tokenClass == NameAttribute {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1529 iterators = append(iterators, Literator(Token{NameAttribute, state.NamedGroups[`key`]}))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1530 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1531 var keyTokenState string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1532 keyre := regexp.MustCompile(`^\d+$`)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1533 if keyre.MatchString(state.NamedGroups[`key`]) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1534 keyTokenState = "common"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1535 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1536 keyTokenState = "Q"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1537 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1538
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1539 // Use token state to Tokenise key
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1540 if keyTokenState != "" {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1541 iterator, err := state.Lexer.Tokenise(
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1542 &TokeniseOptions{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1543 State: keyTokenState,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1544 Nested: true,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1545 }, state.NamedGroups[`key`])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1546
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1547 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1548 panic(err)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1549 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1550 // Append key
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1551 iterators = append(iterators, iterator)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1552 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1553 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1554 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1555
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1556 // Append punctuation
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1557 iterators = append(iterators, Literator(tokens[1]))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1558
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1559 var valueTokenState string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1560
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1561 switch state.NamedGroups[`opening_delimiters`] {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1562 case "(", "{", "[":
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1563 valueTokenState = "root"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1564 case "<<", "«":
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1565 valueTokenState = "ww"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1566 case "<":
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1567 valueTokenState = "Q"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1568 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1569
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1570 // Use token state to Tokenise value
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1571 if valueTokenState != "" {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1572 iterator, err := state.Lexer.Tokenise(
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1573 &TokeniseOptions{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1574 State: valueTokenState,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1575 Nested: true,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1576 }, state.NamedGroups[`value`])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1577
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1578 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1579 panic(err)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1580 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1581 // Append value
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1582 iterators = append(iterators, iterator)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1583 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1584 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1585 // Append last punctuation
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1586 iterators = append(iterators, Literator(tokens[2]))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1587
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1588 return Concaterator(iterators...)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1589 })
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1590 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1591
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1592 // Emitter for quoting constructs, changes token state based on quote name and adverbs
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1593 func quote(groups []string, state *LexerState) Iterator {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1594 keyword := state.NamedGroups[`keyword`]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1595 adverbsStr := state.NamedGroups[`adverbs`]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1596 iterators := []Iterator{}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1597 tokens := []Token{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1598 {Keyword, keyword},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1599 {StringAffix, adverbsStr},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1600 {Text, state.NamedGroups[`ws`]},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1601 {Punctuation, state.NamedGroups[`opening_delimiters`]},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1602 {Punctuation, state.NamedGroups[`closing_delimiters`]},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1603 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1604
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1605 // Append all tokens before dealing with the main string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1606 iterators = append(iterators, Literator(tokens[:4]...))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1607
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1608 var tokenStates []string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1609
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1610 // Set tokenStates based on adverbs
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1611 adverbs := strings.Split(adverbsStr, ":")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1612 for _, adverb := range adverbs {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1613 switch adverb {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1614 case "c", "closure":
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1615 tokenStates = append(tokenStates, "Q-closure")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1616 case "qq":
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1617 tokenStates = append(tokenStates, "qq")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1618 case "ww":
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1619 tokenStates = append(tokenStates, "ww")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1620 case "s", "scalar", "a", "array", "h", "hash", "f", "function":
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1621 tokenStates = append(tokenStates, "Q-variable")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1622 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1623 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1624
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1625 var tokenState string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1626
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1627 switch {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1628 case keyword == "qq" || contains(tokenStates, "qq"):
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1629 tokenState = "qq"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1630 case adverbsStr == "ww" || contains(tokenStates, "ww"):
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1631 tokenState = "ww"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1632 case contains(tokenStates, "Q-closure") && contains(tokenStates, "Q-variable"):
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1633 tokenState = "qq"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1634 case contains(tokenStates, "Q-closure"):
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1635 tokenState = "Q-closure"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1636 case contains(tokenStates, "Q-variable"):
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1637 tokenState = "Q-variable"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1638 default:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1639 tokenState = "Q"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1640 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1641
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1642 iterator, err := state.Lexer.Tokenise(
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1643 &TokeniseOptions{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1644 State: tokenState,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1645 Nested: true,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1646 }, state.NamedGroups[`value`])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1647
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1648 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1649 panic(err)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1650 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1651 iterators = append(iterators, iterator)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1652 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1653
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1654 // Append the last punctuation
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1655 iterators = append(iterators, Literator(tokens[4]))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1656
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1657 return Concaterator(iterators...)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1658 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1659
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1660 // Emitter for pod config, tokenises the properties with "colon-pair-attribute" state
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1661 func podConfig(groups []string, state *LexerState) Iterator {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1662 // Tokenise pod config
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1663 iterator, err := state.Lexer.Tokenise(
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1664 &TokeniseOptions{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1665 State: "colon-pair-attribute",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1666 Nested: true,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1667 }, groups[0])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1668
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1669 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1670 panic(err)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1671 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1672 return iterator
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1673 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1674 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1675
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1676 // Emitter for pod code, tokenises the code based on the lang specified
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1677 func podCode(groups []string, state *LexerState) Iterator {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1678 iterators := []Iterator{}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1679 tokens := []Token{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1680 {Comment, state.NamedGroups[`ws`]},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1681 {Keyword, state.NamedGroups[`keyword`]},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1682 {Keyword, state.NamedGroups[`ws2`]},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1683 {Keyword, state.NamedGroups[`name`]},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1684 {StringDoc, state.NamedGroups[`value`]},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1685 {Comment, state.NamedGroups[`ws3`]},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1686 {Keyword, state.NamedGroups[`end_keyword`]},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1687 {Keyword, state.NamedGroups[`ws4`]},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1688 {Keyword, state.NamedGroups[`name`]},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1689 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1690
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1691 // Append all tokens before dealing with the pod config
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1692 iterators = append(iterators, Literator(tokens[:4]...))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1693
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1694 // Tokenise pod config
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1695 iterators = append(iterators, podConfig([]string{state.NamedGroups[`config`]}, state))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1696
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1697 langMatch := regexp.MustCompile(`:lang\W+(\w+)`).FindStringSubmatch(state.NamedGroups[`config`])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1698 var lang string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1699 if len(langMatch) > 1 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1700 lang = langMatch[1]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1701 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1702
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1703 // Tokenise code based on lang property
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1704 sublexer := Get(lang)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1705 if sublexer != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1706 iterator, err := sublexer.Tokenise(nil, state.NamedGroups[`value`])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1707
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1708 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1709 panic(err)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1710 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1711 iterators = append(iterators, iterator)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1712 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1713 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1714 iterators = append(iterators, Literator(tokens[4]))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1715 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1716
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1717 // Append the rest of the tokens
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1718 iterators = append(iterators, Literator(tokens[5:]...))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1719
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1720 return Concaterator(iterators...)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1721 }