codemirror-lang-raku 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/README.md +1 -1
- package/dist/index.cjs +84 -79
- package/dist/index.js +84 -79
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,23 @@
|
|
|
1
|
+
## 0.3.0 (2026-10-07)
|
|
2
|
+
|
|
3
|
+
### Breaking changes
|
|
4
|
+
|
|
5
|
+
- A pair of a quote's own delimiters inside it, as the `[b]` of
|
|
6
|
+
`qq[a [b] c]`, is a `NestedDelimiters` node in the `StringLiteral`.
|
|
7
|
+
It was text without a node.
|
|
8
|
+
|
|
9
|
+
### Bug fixes
|
|
10
|
+
|
|
11
|
+
- After an edit in a long quote that interpolates and has bracket
|
|
12
|
+
delimiters (`qq[…]`), the text after a nested `[` could be read as if
|
|
13
|
+
the quote had ended, and every further edit parsed the quote again
|
|
14
|
+
from its start.
|
|
15
|
+
- In such a quote, a `[…]` or `(…)` right after a nested pair of
|
|
16
|
+
delimiters is text, not a subscript or a call: `qq[a [b](c)]`.
|
|
17
|
+
- After an edit, the text of a heredoc could be read as code when a long
|
|
18
|
+
quote that interpolates and spans several lines followed the opener
|
|
19
|
+
of the heredoc on its line.
|
|
20
|
+
|
|
1
21
|
## 0.2.0 (2026-10-07)
|
|
2
22
|
|
|
3
23
|
### New features
|
package/README.md
CHANGED
|
@@ -91,7 +91,7 @@ on incomplete code.
|
|
|
91
91
|
| `EnumDeclaration`, `SubsetDeclaration`, `ConstantDeclaration` | The declarator and its `EnumName`, `SubsetName` or `ConstantName` |
|
|
92
92
|
| `Block`, `Parens`, `Brackets` | `{ }`, `( )`, `[ ]` |
|
|
93
93
|
| `VariableName`, `AttributeName`, `SpecialVariable` | `$x` / `$^a`, `$!x` / `$.x`, `$*x` / `$?x` |
|
|
94
|
-
| `StringLiteral` | A quote of any kind. One that interpolates has `Escape`, `Interpolation`, variable, `Brackets`, `Parens` and `MethodCall` children |
|
|
94
|
+
| `StringLiteral` | A quote of any kind. One that interpolates has `Escape`, `Interpolation`, variable, `Brackets`, `Parens` and `MethodCall` children, and a `NestedDelimiters` for each pair of its own delimiters in it (the `[b]` of `qq[a [b] c]`) |
|
|
95
95
|
| `Heredoc` | The text of a heredoc, from the line after its `q:to/END/` opener through its terminator. The opener is a `StringLiteral`. The text of a `qq:to` heredoc has the same children as a string that interpolates. The texts of the heredocs that one line opens are a single node |
|
|
96
96
|
| `Regex` | `/…/`, `rx//`, `m//`, `s///`, `tr///`, or the body of a regex declaration. Its children are `CharacterClass` (`<[a..z]>`), `Assertion` (`<name>`, `<?before …>`), `StringLiteral`, `Escape` (`\d`), `Operator` (quantifiers, `\|`, anchors), `VariableName` (`$x`, `$<name>`), `LineComment`, and a `Block` for each `{ }` of code |
|
|
97
97
|
| `LineComment`, `DocComment`, `BlockComment` | `#`, `#|` / `#=`, `` #`( ) `` |
|
package/dist/index.cjs
CHANGED
|
@@ -7,13 +7,13 @@ var highlight = require('@lezer/highlight');
|
|
|
7
7
|
var state = require('@codemirror/state');
|
|
8
8
|
|
|
9
9
|
// This file was generated by lezer-generator. You probably shouldn't edit it.
|
|
10
|
-
const smiley =
|
|
11
|
-
noSmiley =
|
|
10
|
+
const smiley = 201,
|
|
11
|
+
noSmiley = 202,
|
|
12
12
|
BlockComment = 1,
|
|
13
13
|
podStart = 2,
|
|
14
|
-
podEnd =
|
|
14
|
+
podEnd = 203,
|
|
15
15
|
podEndDirective = 3,
|
|
16
|
-
podText =
|
|
16
|
+
podText = 204,
|
|
17
17
|
PodDirective = 4,
|
|
18
18
|
PodHeading = 5,
|
|
19
19
|
PodStrong = 6,
|
|
@@ -23,17 +23,17 @@ const smiley = 199,
|
|
|
23
23
|
PodFormat = 10,
|
|
24
24
|
rawHeredoc = 11,
|
|
25
25
|
interpolatingHeredoc = 12,
|
|
26
|
-
heredocStart =
|
|
26
|
+
heredocStart = 205,
|
|
27
27
|
methodDot = 13,
|
|
28
28
|
MethodName = 14,
|
|
29
|
-
declaredName =
|
|
30
|
-
declaredMethodName =
|
|
29
|
+
declaredName = 206,
|
|
30
|
+
declaredMethodName = 207,
|
|
31
31
|
Version = 15,
|
|
32
|
-
regexStart =
|
|
33
|
-
regexBodyEnd =
|
|
34
|
-
regexLitOpen =
|
|
35
|
-
regexLitClose =
|
|
36
|
-
regexText =
|
|
32
|
+
regexStart = 208,
|
|
33
|
+
regexBodyEnd = 209,
|
|
34
|
+
regexLitOpen = 210,
|
|
35
|
+
regexLitClose = 211,
|
|
36
|
+
regexText = 212,
|
|
37
37
|
CharacterClass = 16,
|
|
38
38
|
Assertion = 17,
|
|
39
39
|
regexQuote = 18,
|
|
@@ -41,18 +41,18 @@ const smiley = 199,
|
|
|
41
41
|
regexComment = 20,
|
|
42
42
|
regexBlockComment = 21,
|
|
43
43
|
regexCapture = 22,
|
|
44
|
-
quoteContent =
|
|
45
|
-
quoteNestOpen =
|
|
46
|
-
quoteNestClose =
|
|
47
|
-
quoteEnd =
|
|
48
|
-
rawString =
|
|
49
|
-
quoteStart =
|
|
44
|
+
quoteContent = 213,
|
|
45
|
+
quoteNestOpen = 214,
|
|
46
|
+
quoteNestClose = 215,
|
|
47
|
+
quoteEnd = 216,
|
|
48
|
+
rawString = 217,
|
|
49
|
+
quoteStart = 218,
|
|
50
50
|
interpolatingWordList = 23,
|
|
51
51
|
regexLiteral = 24,
|
|
52
52
|
transliteration = 25,
|
|
53
|
-
plainName =
|
|
53
|
+
plainName = 219,
|
|
54
54
|
wordOperator = 26,
|
|
55
|
-
multiName =
|
|
55
|
+
multiName = 220,
|
|
56
56
|
operatorVariable = 27,
|
|
57
57
|
LineComment = 28,
|
|
58
58
|
DocComment = 29,
|
|
@@ -74,19 +74,20 @@ const smiley = 199,
|
|
|
74
74
|
TypeName = 80,
|
|
75
75
|
Number = 81,
|
|
76
76
|
quotedString = 82,
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
77
|
+
NestedDelimiters = 83,
|
|
78
|
+
Interpolation = 84,
|
|
79
|
+
PairKey = 85,
|
|
80
|
+
multi = 96,
|
|
81
|
+
proto = 97,
|
|
82
|
+
only = 98,
|
|
83
|
+
self = 165,
|
|
84
|
+
True = 166,
|
|
85
|
+
False = 167,
|
|
86
|
+
Nil = 168,
|
|
87
|
+
Operator = 187,
|
|
88
|
+
Regex = 191,
|
|
89
|
+
Heredoc = 192,
|
|
90
|
+
StringLiteral = 193;
|
|
90
91
|
|
|
91
92
|
// Opening bracket -> closing bracket, for the delimiters of quotes and
|
|
92
93
|
// embedded comments. Raku accepts any Unicode bracket pair; this lists
|
|
@@ -156,9 +157,7 @@ function word(input, from, to) {
|
|
|
156
157
|
}
|
|
157
158
|
// A quote that is being read piece by piece because it interpolates.
|
|
158
159
|
class Quote {
|
|
159
|
-
constructor(parent, open, close, count,
|
|
160
|
-
// How many nested opening delimiters are unclosed.
|
|
161
|
-
depth, interpolates,
|
|
160
|
+
constructor(parent, open, close, count, interpolates,
|
|
162
161
|
// Whether a backslash that does not start an escape still
|
|
163
162
|
// takes the delimiter after it out of play: q:c[a \] b]
|
|
164
163
|
escapes) {
|
|
@@ -166,22 +165,18 @@ class Quote {
|
|
|
166
165
|
this.open = open;
|
|
167
166
|
this.close = close;
|
|
168
167
|
this.count = count;
|
|
169
|
-
this.depth = depth;
|
|
170
168
|
this.interpolates = interpolates;
|
|
171
169
|
this.escapes = escapes;
|
|
172
170
|
let hash = parent ? parent.hash : 7;
|
|
173
|
-
for (let part of [open, count,
|
|
171
|
+
for (let part of [open, count, interpolates, escapes ? 1 : 0])
|
|
174
172
|
hash = (hash * 31 + part) | 0;
|
|
175
173
|
this.hash = hash;
|
|
176
174
|
}
|
|
177
|
-
withDepth(depth) {
|
|
178
|
-
return new Quote(this.parent, this.open, this.close, this.count, depth, this.interpolates, this.escapes);
|
|
179
|
-
}
|
|
180
175
|
}
|
|
181
176
|
const noHeredocs = [];
|
|
182
177
|
// The quote that the text of a heredoc is read as. It has no
|
|
183
178
|
// delimiters, and ends where the text does.
|
|
184
|
-
const heredocQuote = new Quote(null, -1, -1, 1,
|
|
179
|
+
const heredocQuote = new Quote(null, -1, -1, 1, 63 /* Interpolate.All */, true);
|
|
185
180
|
// The body of a regex declaration, or the inside of a regex literal,
|
|
186
181
|
// that is being read piece by piece.
|
|
187
182
|
class RegexBody {
|
|
@@ -278,7 +273,7 @@ for (let term of [Identifier, TypeName, smiley, noSmiley, declaredName, declared
|
|
|
278
273
|
methodRoutineName, multiName, multiRoutineName, RegexName, EnumName, SubsetName, ConstantName])
|
|
279
274
|
termModes.set(term, 2 /* Mode.AfterName */);
|
|
280
275
|
// The `}` of "{...}" in a string does not take a subscript.
|
|
281
|
-
for (let term of [quoteContent, Interpolation])
|
|
276
|
+
for (let term of [quoteContent, quoteNestOpen, quoteNestClose, NestedDelimiters, Interpolation])
|
|
282
277
|
termModes.set(term, 0 /* Mode.Term */);
|
|
283
278
|
for (let term of [multi, proto, only])
|
|
284
279
|
termModes.set(term, 4 /* Mode.AfterMulti */);
|
|
@@ -369,15 +364,16 @@ function hasNewline(input, from, to) {
|
|
|
369
364
|
}
|
|
370
365
|
// The heredocs that are open after a reused node, of which the input is
|
|
371
366
|
// at the start. As when tokens are shifted, a line break between tokens
|
|
372
|
-
// and the text of a heredoc close the ones before them.
|
|
373
|
-
|
|
367
|
+
// and the text of a heredoc close the ones before them. `inQuote` tells
|
|
368
|
+
// that the node is a run of pieces of a quote.
|
|
369
|
+
function heredocsAfter(node, input, before, inQuote) {
|
|
374
370
|
// Most reused nodes are single tokens.
|
|
375
371
|
if (!node.children.length && !stringTerms.has(node.type.id) && !heredocTerms.has(node.type.id))
|
|
376
372
|
return before;
|
|
377
373
|
let cursor = node.cursor(), found = [], closedAt = -1;
|
|
378
374
|
// Goes over the node at the cursor from its end, and tells whether
|
|
379
375
|
// the heredocs before some point in it are closed.
|
|
380
|
-
function scan() {
|
|
376
|
+
function scan(text = false) {
|
|
381
377
|
let type = cursor.type.id, { from, to } = cursor;
|
|
382
378
|
if (heredocTerms.has(type)) {
|
|
383
379
|
closedAt = to;
|
|
@@ -396,7 +392,7 @@ function heredocsAfter(node, input, before) {
|
|
|
396
392
|
if (!cursor.lastChild())
|
|
397
393
|
return false;
|
|
398
394
|
// Between the pieces of a string lies its text, not whitespace.
|
|
399
|
-
let gaps = !isString;
|
|
395
|
+
let gaps = !isString && !text && type != NestedDelimiters;
|
|
400
396
|
for (let gapEnd = to;;) {
|
|
401
397
|
if (gaps && hasNewline(input, cursor.to, gapEnd)) {
|
|
402
398
|
closedAt = gapEnd;
|
|
@@ -414,7 +410,8 @@ function heredocsAfter(node, input, before) {
|
|
|
414
410
|
cursor.parent();
|
|
415
411
|
return closedAt >= 0;
|
|
416
412
|
}
|
|
417
|
-
|
|
413
|
+
// A piece on its own, such as an Interpolation, is a named node.
|
|
414
|
+
scan(inQuote && node.type.isAnonymous);
|
|
418
415
|
if (!found.length && closedAt < 0)
|
|
419
416
|
return before;
|
|
420
417
|
let after = found.filter(opener => opener.pos >= closedAt).sort((a, b) => a.pos - b.pos).map(opener => opener.heredoc);
|
|
@@ -479,17 +476,9 @@ const trackContext = new lr.ContextTracker({
|
|
|
479
476
|
let opening = wordListOpening(input, 0) || readOpening(input);
|
|
480
477
|
if (!opening)
|
|
481
478
|
return context;
|
|
482
|
-
let quote = new Quote(context.quote, opening.open, opening.close, opening.count,
|
|
479
|
+
let quote = new Quote(context.quote, opening.open, opening.close, opening.count, opening.interpolates, opening.escapes);
|
|
483
480
|
return context.withQuote(0 /* Mode.Term */, quote, withHeredocAt(context.heredocs, input, 0));
|
|
484
481
|
}
|
|
485
|
-
case quoteNestOpen:
|
|
486
|
-
case quoteNestClose: {
|
|
487
|
-
let quote = context.quote;
|
|
488
|
-
if (!quote)
|
|
489
|
-
return context;
|
|
490
|
-
let depth = quote.depth + (term == quoteNestOpen ? 1 : -1);
|
|
491
|
-
return context.withQuote(0 /* Mode.Term */, quote.withDepth(depth));
|
|
492
|
-
}
|
|
493
482
|
case quoteEnd:
|
|
494
483
|
return context.withQuote(1 /* Mode.AfterTerm */, context.quote && context.quote.parent);
|
|
495
484
|
}
|
|
@@ -513,8 +502,13 @@ const trackContext = new lr.ContextTracker({
|
|
|
513
502
|
return term == Identifier || term == Interpolation ? context.withMode(modeAfter(term, input, 0, context.mode))
|
|
514
503
|
: context;
|
|
515
504
|
},
|
|
516
|
-
|
|
517
|
-
|
|
505
|
+
// A node that is reused leaves the quote and the regex of the context
|
|
506
|
+
// as they are: the grammar pairs the delimiters that nest in a quote
|
|
507
|
+
// (NestedDelimiters) and the braces of a block, so a node closes what
|
|
508
|
+
// it opens.
|
|
509
|
+
reuse(context, node, stack, input) {
|
|
510
|
+
let inQuote = context.quote != null && inQuoteText(stack);
|
|
511
|
+
context = context.withHeredocs(heredocsAfter(node, input, context.heredocs, inQuote));
|
|
518
512
|
// The node's positions count from its start, where the input is.
|
|
519
513
|
let last = lastToken$1(node.topNode);
|
|
520
514
|
// What comes before a trailing `++` in a reused node is a term.
|
|
@@ -1236,17 +1230,25 @@ function hasPostfix(input, end) {
|
|
|
1236
1230
|
let methodEnd = nameEnd(input, end + 1);
|
|
1237
1231
|
return methodEnd > 0 && input.peek(methodEnd) == 40 /* Ch.ParenOpen */;
|
|
1238
1232
|
}
|
|
1233
|
+
// Whether the parser is between the pieces of a quote, as opposed to
|
|
1234
|
+
// in the code of a block in it.
|
|
1235
|
+
function inQuoteText(stack) { return stack.canShift(quoteContent); }
|
|
1236
|
+
// Whether the parser is, in a quote, right after a variable or after a
|
|
1237
|
+
// subscript or a call on one: where the grammar takes a quotePostfix.
|
|
1238
|
+
// This is asked of the parser and not of the mode, which is not known
|
|
1239
|
+
// to this precision after a reused node that ends in text of the quote.
|
|
1240
|
+
function afterQuotedVariable(stack) { return stack.canShift(rawString); }
|
|
1239
1241
|
// The pieces of a quote that interpolates.
|
|
1240
1242
|
const quoteToken = new lr.ExternalTokenizer((input, stack) => {
|
|
1241
|
-
if (!stack
|
|
1243
|
+
if (!inQuoteText(stack))
|
|
1242
1244
|
return;
|
|
1243
|
-
let { quote
|
|
1245
|
+
let { quote } = context(stack);
|
|
1244
1246
|
if (!quote)
|
|
1245
1247
|
return;
|
|
1246
1248
|
let { open, close, count, interpolates } = quote, nests = open != close;
|
|
1247
1249
|
// After a variable, a subscript or a call continues the interpolation.
|
|
1248
1250
|
// `[` and `(` are left to the grammar's own tokens.
|
|
1249
|
-
if (
|
|
1251
|
+
if (afterQuotedVariable(stack)) {
|
|
1250
1252
|
if (input.next == 91 /* Ch.BracketOpen */ || input.next == 40 /* Ch.ParenOpen */)
|
|
1251
1253
|
return;
|
|
1252
1254
|
let end = subscriptEnd(input);
|
|
@@ -1266,7 +1268,8 @@ const quoteToken = new lr.ExternalTokenizer((input, stack) => {
|
|
|
1266
1268
|
if (input.pos > start)
|
|
1267
1269
|
break;
|
|
1268
1270
|
input.advance(count);
|
|
1269
|
-
|
|
1271
|
+
// Inside a nested pair, a closing delimiter closes that pair.
|
|
1272
|
+
return input.acceptToken(!atClose ? quoteNestOpen : stack.canShift(quoteNestClose) ? quoteNestClose : quoteEnd);
|
|
1270
1273
|
}
|
|
1271
1274
|
if (next == 92 /* Ch.Backslash */) {
|
|
1272
1275
|
if (interpolates & 32 /* Interpolate.Backslash */)
|
|
@@ -1555,9 +1558,8 @@ const methodDotToken = new lr.ExternalTokenizer((input, stack) => {
|
|
|
1555
1558
|
next = input.peek(++size);
|
|
1556
1559
|
if (!isIdentifierStart(next))
|
|
1557
1560
|
return;
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
(mode != 1 /* Mode.AfterTerm */ || input.peek(nameEnd(input, size)) != 40 /* Ch.ParenOpen */))
|
|
1561
|
+
if (context(stack).quote && inQuoteText(stack) &&
|
|
1562
|
+
(!afterQuotedVariable(stack) || input.peek(nameEnd(input, size)) != 40 /* Ch.ParenOpen */))
|
|
1561
1563
|
return;
|
|
1562
1564
|
input.acceptToken(methodDot, size);
|
|
1563
1565
|
});
|
|
@@ -1663,27 +1665,27 @@ const versionToken = new lr.ExternalTokenizer((input, stack) => {
|
|
|
1663
1665
|
});
|
|
1664
1666
|
|
|
1665
1667
|
// This file was generated by lezer-generator. You probably shouldn't edit it.
|
|
1666
|
-
const spec_identifier = {__proto__:null,class:80, role:82, grammar:84, module:86, package:88, sub:102, method:106, submethod:108, token:116, rule:118, regex:120, enum:140, subset:146, constant:152, my:
|
|
1667
|
-
const spec_capIdentifier = {__proto__:null,True:
|
|
1668
|
+
const spec_identifier = {__proto__:null,class:80, role:82, grammar:84, module:86, package:88, sub:102, method:106, submethod:108, token:116, rule:118, regex:120, enum:140, subset:146, constant:152, my:172, our:174, has:176, state:178, temp:180, let:182, anon:184, augment:186, supersede:188, unit:190, multi:192, proto:194, only:196, if:198, elsif:200, else:202, unless:204, with:206, orwith:208, without:210, for:212, while:214, until:216, loop:218, repeat:220, given:222, when:224, default:226, do:228, gather:230, take:232, try:234, return:236, next:238, last:240, redo:242, proceed:244, succeed:246, react:248, whenever:250, supply:252, emit:254, start:256, use:258, need:260, import:262, require:264, no:266, is:268, does:270, of:272, returns:274, handles:276, where:278, will:280, trusts:282, hides:284, and:286, or:288, not:290, xor:292, so:294, andthen:296, orelse:298, notandthen:300, div:302, mod:304, gcd:306, lcm:308, eq:310, ne:312, lt:314, gt:316, le:318, ge:320, cmp:322, leg:324, eqv:326, but:328, self:330};
|
|
1669
|
+
const spec_capIdentifier = {__proto__:null,True:332, False:334, Nil:336, BEGIN:338, CHECK:340, INIT:342, END:344, ENTER:346, LEAVE:348, KEEP:350, UNDO:352, FIRST:354, NEXT:356, LAST:358, PRE:360, POST:362, CATCH:364, CONTROL:366, QUIT:368, CLOSE:370, DOC:372};
|
|
1668
1670
|
const parser$1 = lr.LRParser.deserialize({
|
|
1669
1671
|
version: 14,
|
|
1670
|
-
states: "
|
|
1671
|
-
stateData: "
|
|
1672
|
-
goto: ",
|
|
1673
|
-
nodeNames: "⚠ BlockComment PodDirective PodDirective PodDirective PodHeading PodStrong PodEmphasis PodCode PodLink PodFormat Heredoc Heredoc . MethodName Version CharacterClass Assertion StringLiteral Operator LineComment BlockComment VariableName StringLiteral Regex Regex Operator VariableName LineComment DocComment Program Pod Number ) ( Parens ] [ Brackets PackageDeclaration class role grammar module package PackageName } { Block ; RoutineDeclaration sub RoutineName method submethod RoutineName RoutineName RegexDeclaration token rule regex RegexName Block Regex Escape VariableName AttributeName SpecialVariable Block EnumDeclaration enum EnumName SubsetDeclaration subset SubsetName ConstantDeclaration constant ConstantName MethodCall Identifier TypeName Number StringLiteral Interpolation PairKey my our has state temp let anon augment supersede unit multi proto only if elsif else unless with orwith without for while until loop repeat given when default do gather take try return next last redo proceed succeed react whenever supply emit start use need import require no is does of returns handles where will trusts hides and or not xor so andthen orelse notandthen div mod gcd lcm eq ne lt gt le ge cmp leg eqv but self True False Nil BEGIN CHECK INIT END ENTER LEAVE KEEP UNDO FIRST NEXT LAST PRE POST CATCH CONTROL QUIT CLOSE DOC Operator , : . Regex Heredoc StringLiteral",
|
|
1674
|
-
maxTerm:
|
|
1672
|
+
states: "/`QfQDdOOO*zO#tOOO+POWOOO+UO,UOOO+uOSO'#C{O,PQDdO'#DPO,WQDdO'#DSO,_QDdO'#D^OOQ.W'#Df'#DfO,fQDdO'#D`O5zQ8WO'#D|OOQ.W'#D}'#D}O6PQ7gO'#EOOOQ.W'#EQ'#EQO6sO!%SO'#EQOOQ.W'#HU'#HUOOQ.W'#HT'#HTOOQ.W'#Gf'#GfQfQDdOOO6zQEUO'#DTO7RQEUO'#D`O7YQEUO'#D`O@rQEUO'#DgO@|QEUO'#DsOJqQEUO'#DvO!&fQEUO'#DyOOQ.W'#H^'#H^O!0ZO!!^OOO!1XO!%SOOOOOS'#Gg'#GgO!1`OSO,59gOOQ.W,59g,59gOOQ.W,59k,59kO!1jQDdO,59kOOQ.W,59n,59nO!1qQDdO,59nOOQ.W,59x,59xO!1xQDdO,59xOOQ.W'#Gh'#GhO!;bQDdO'#HWOOQ.W'#HW'#HWOOQ.W,59z,59zOOQ.W,5:h,5:hOOQ.W,5:j,5:jO!;iO!%SO'#ERO!;pQDdO'#ESOOO&j'#HZ'#HZO!;wO!0jO'#HZOOO&j'#Gj'#GjO!<uO!%SO,5:lOOQ.W,5:l,5:lOOQ.W-E:d-E:dOOQ.W'#DZ'#DZOOQ.W,59o,59oO,fQDdO,59oOOQ.W'#Db'#DbO,fQDdO,59zOOQ.W'#De'#DeO!<|QDdO,5:ROOQ.W'#Dk'#DkO!=TQ:[O'#DlOOQ.W,5:R,5:RO!<|QDdO,5:ROOQ.W'#Du'#DuOOQ.W,5:_,5:_OOQ.W'#Dx'#DxOOQ.W,5:b,5:bOOQ.W'#D{'#D{OOQ.W,5:e,5:eO!=]QDdO'#DrOOO#t'#HX'#HXOOO#t'#Gi'#GiO!0ZO!!^OOQOOOOOO!1XO!%SOOOOOS-E:e-E:eOOQ.W1G/R1G/ROOQ.W1G/V1G/VOOQ.W1G/Y1G/YOOQ.W1G/d1G/dOOQ.W-E:f-E:fOOQ.W,5=r,5=rOOO&j,5:m,5:mO!=dO!%SO,5:mOOO&j,5:n,5:nO!=kQDdO,5:nOOO2Q'#H]'#H]OOO2Q'#Gk'#GkO!=rO!0jO,5=uOOO&j-E:h-E:hOOQ.W1G0W1G0WOOQ.W1G/Z1G/ZOOQ.W1G/f1G/fOOQ.W1G/m1G/mO!?kO!!^O'#DmOOQ.W,5:W,5:WO!?rQ7fO,5:WO!?wQDdO1G/mOOO#t,5:^,5:^O!@OQDdO,5:^OOO#t-E:g-E:gOOO&j1G0X1G0XOOO&j1G0Y1G0YOOO2Q-E:i-E:iO!@VO!!^O,5:XOOQY,5:X,5:XOOQ.W1G/r1G/rOOQ.W7+%X7+%XOOO#t1G/x1G/xOOQY1G/s1G/s",
|
|
1673
|
+
stateData: "!@j~O%vOSlOSmOSPOSZOS[OS~OQSO]YO__Og_Oh_Oi_Oj_Ok_Op_OrTOuUOxcOycOzcO{cO|cO!PVO!R`O!TdO!VeO!WeO![fO!]fO!^fO!c_O!d_O!e_O!hgO!khO!niO!s_O!w_O!xjO!yjO!zjO!{jO!|jO!}jO#OjO#PjO#QjO#RjO#SjO#TjO#UjO#VjO#WjO#XjO#YjO#ZjO#[jO#]jO#^jO#_jO#`jO#ajO#bjO#cjO#djO#ejO#fjO#gjO#hjO#ijO#jjO#kjO#ljO#mjO#njO#ojO#pjO#qjO#rjO#sjO#tjO#ujO#vjO#wjO#xjO#yjO#zjO#{jO#|jO#}jO$OjO$PjO$QjO$RjO$SjO$TjO$UjO$VjO$WjO$XjO$YjO$ZjO$[jO$]jO$^jO$_jO$`jO$ajO$bjO$cjO$djO$ejO$fjO$gjO$hjO$ijO$jjO$kjO$ljO$mjO$njO$ojO$pjO$qjO$rjO$sjO$tjO$ujO$vjO$wjO$xjO$yjO$zjO${jO$|jO$}jO%OjO%PjO%QjO%R_O%S_O%T_O%U_O%q]O%r^O%sZO%tWO%yZO%|[O&O_O~O%jkO~O%elO~O%rlO~OSmOTmOUmOVmOWmOXmOYmO%dmO~ORoO%coO~P+ZOqpO~PfOtrO~PfO!OtO~PfOQSO]YO__Og_Oh_Oi_Oj_Ok_Op_OrTOuUOxcOycOzcO{cO|cO!PVO!RxO!TdO!VeO!WeO![fO!]fO!^fO!c_O!d_O!e_O!hgO!khO!niO!s_O!w_O!xjO!yjO!zjO!{jO!|jO!}jO#OjO#PjO#QjO#RjO#SjO#TjO#UjO#VjO#WjO#XjO#YjO#ZjO#[jO#]jO#^jO#_jO#`jO#ajO#bjO#cjO#djO#ejO#fjO#gjO#hjO#ijO#jjO#kjO#ljO#mjO#njO#ojO#pjO#qjO#rjO#sjO#tjO#ujO#vjO#wjO#xjO#yjO#zjO#{jO#|jO#}jO$OjO$PjO$QjO$RjO$SjO$TjO$UjO$VjO$WjO$XjO$YjO$ZjO$[jO$]jO$^jO$_jO$`jO$ajO$bjO$cjO$djO$ejO$fjO$gjO$hjO$ijO$jjO$kjO$ljO$mjO$njO$ojO$pjO$qjO$rjO$sjO$tjO$ujO$vjO$wjO$xjO$yjO$zjO${jO$|jO$}jO%OjO%PjO%QjO%R_O%S_O%T_O%U_O%q]O%r^O%sZO%tWO%yZO%|[O&O_O~O^zO~O%a{O%b{O~O!P}O!b!OO!c!PO!d!PO!e!PO%m!OO%n|O&O!PO~O%p!SO~P6XO%f!UO~P,fO%f!XO~P,fO%g!ZO~P,fOQSO]YO__Og_Oh_Oi_Oj_Ok_Op_OrTOuUOxcOycOzcO{cO|cO!P!^O!TdO!VeO!WeO![fO!]fO!^fO!c_O!d_O!e_O!hgO!khO!niO!s_O!w_O!xjO!yjO!zjO!{jO!|jO!}jO#OjO#PjO#QjO#RjO#SjO#TjO#UjO#VjO#WjO#XjO#YjO#ZjO#[jO#]jO#^jO#_jO#`jO#ajO#bjO#cjO#djO#ejO#fjO#gjO#hjO#ijO#jjO#kjO#ljO#mjO#njO#ojO#pjO#qjO#rjO#sjO#tjO#ujO#vjO#wjO#xjO#yjO#zjO#{jO#|jO#}jO$OjO$PjO$QjO$RjO$SjO$TjO$UjO$VjO$WjO$XjO$YjO$ZjO$[jO$]jO$^jO$_jO$`jO$ajO$bjO$cjO$djO$ejO$fjO$gjO$hjO$ijO$jjO$kjO$ljO$mjO$njO$ojO$pjO$qjO$rjO$sjO$tjO$ujO$vjO$wjO$xjO$yjO$zjO${jO$|jO$}jO%OjO%PjO%QjO%R_O%S_O%T_O%U_O%q]O%r^O%sZO%tWO%yZO%|[O&O_O~O!R!_O%f!]O~P7aO%f!aOQ!gX]!gX_!gXg!gXh!gXi!gXj!gXk!gXp!gXr!gXu!gXx!gXy!gXz!gX{!gX|!gX!P!gX!R!gX!T!gX!V!gX!W!gX![!gX!]!gX!^!gX!c!gX!d!gX!e!gX!h!gX!k!gX!n!gX!s!gX!w!gX!x!gX!y!gX!z!gX!{!gX!|!gX!}!gX#O!gX#P!gX#Q!gX#R!gX#S!gX#T!gX#U!gX#V!gX#W!gX#X!gX#Y!gX#Z!gX#[!gX#]!gX#^!gX#_!gX#`!gX#a!gX#b!gX#c!gX#d!gX#e!gX#f!gX#g!gX#h!gX#i!gX#j!gX#k!gX#l!gX#m!gX#n!gX#o!gX#p!gX#q!gX#r!gX#s!gX#t!gX#u!gX#v!gX#w!gX#x!gX#y!gX#z!gX#{!gX#|!gX#}!gX$O!gX$P!gX$Q!gX$R!gX$S!gX$T!gX$U!gX$V!gX$W!gX$X!gX$Y!gX$Z!gX$[!gX$]!gX$^!gX$_!gX$`!gX$a!gX$b!gX$c!gX$d!gX$e!gX$f!gX$g!gX$h!gX$i!gX$j!gX$k!gX$l!gX$m!gX$n!gX$o!gX$p!gX$q!gX$r!gX$s!gX$t!gX$u!gX$v!gX$w!gX$x!gX$y!gX$z!gX${!gX$|!gX$}!gX%O!gX%P!gX%Q!gX%R!gX%S!gX%T!gX%U!gX%`!gX%q!gX%r!gX%s!gX%t!gX%y!gX%|!gX&O!gXq!gXt!gX!O!gX~O%f!cOQ!jX]!jX_!jXg!jXh!jXi!jXj!jXk!jXp!jXr!jXu!jXx!jXy!jXz!jX{!jX|!jX!P!jX!R!jX!T!jX!V!jX!W!jX![!jX!]!jX!^!jX!c!jX!d!jX!e!jX!h!jX!k!jX!n!jX!s!jX!w!jX!x!jX!y!jX!z!jX!{!jX!|!jX!}!jX#O!jX#P!jX#Q!jX#R!jX#S!jX#T!jX#U!jX#V!jX#W!jX#X!jX#Y!jX#Z!jX#[!jX#]!jX#^!jX#_!jX#`!jX#a!jX#b!jX#c!jX#d!jX#e!jX#f!jX#g!jX#h!jX#i!jX#j!jX#k!jX#l!jX#m!jX#n!jX#o!jX#p!jX#q!jX#r!jX#s!jX#t!jX#u!jX#v!jX#w!jX#x!jX#y!jX#z!jX#{!jX#|!jX#}!jX$O!jX$P!jX$Q!jX$R!jX$S!jX$T!jX$U!jX$V!jX$W!jX$X!jX$Y!jX$Z!jX$[!jX$]!jX$^!jX$_!jX$`!jX$a!jX$b!jX$c!jX$d!jX$e!jX$f!jX$g!jX$h!jX$i!jX$j!jX$k!jX$l!jX$m!jX$n!jX$o!jX$p!jX$q!jX$r!jX$s!jX$t!jX$u!jX$v!jX$w!jX$x!jX$y!jX$z!jX${!jX$|!jX$}!jX%O!jX%P!jX%Q!jX%R!jX%S!jX%T!jX%U!jX%`!jX%q!jX%r!jX%s!jX%t!jX%y!jX%|!jX&O!jXq!jXt!jX!O!jX~O%f!eOQ!mX]!mX_!mXg!mXh!mXi!mXj!mXk!mXp!mXr!mXu!mXx!mXy!mXz!mX{!mX|!mX!P!mX!R!mX!T!mX!V!mX!W!mX![!mX!]!mX!^!mX!c!mX!d!mX!e!mX!h!mX!k!mX!n!mX!s!mX!w!mX!x!mX!y!mX!z!mX!{!mX!|!mX!}!mX#O!mX#P!mX#Q!mX#R!mX#S!mX#T!mX#U!mX#V!mX#W!mX#X!mX#Y!mX#Z!mX#[!mX#]!mX#^!mX#_!mX#`!mX#a!mX#b!mX#c!mX#d!mX#e!mX#f!mX#g!mX#h!mX#i!mX#j!mX#k!mX#l!mX#m!mX#n!mX#o!mX#p!mX#q!mX#r!mX#s!mX#t!mX#u!mX#v!mX#w!mX#x!mX#y!mX#z!mX#{!mX#|!mX#}!mX$O!mX$P!mX$Q!mX$R!mX$S!mX$T!mX$U!mX$V!mX$W!mX$X!mX$Y!mX$Z!mX$[!mX$]!mX$^!mX$_!mX$`!mX$a!mX$b!mX$c!mX$d!mX$e!mX$f!mX$g!mX$h!mX$i!mX$j!mX$k!mX$l!mX$m!mX$n!mX$o!mX$p!mX$q!mX$r!mX$s!mX$t!mX$u!mX$v!mX$w!mX$x!mX$y!mX$z!mX${!mX$|!mX$}!mX%O!mX%P!mX%Q!mX%R!mX%S!mX%T!mX%U!mX%`!mX%q!mX%r!mX%s!mX%t!mX%y!mX%|!mX&O!mXq!mXt!mX!O!mX~O`!hOa!hOb!hOc!hOd!hOe!hOf!hO!P!gO!b!hO!c!hO!d!hO!e!hO%k!kO%l!hO~O%p!kO~P6XOR!nO%c!nO~P+ZOq!oO~PfOt!pO~PfO!O!qO~PfOQSO]YO__Og_Oh_Oi_Oj_Ok_Op_OrTOuUOxcOycOzcO{cO|cO!PVO!TdO!VeO!WeO![fO!]fO!^fO!c_O!d_O!e_O!hgO!khO!niO!s_O!w_O!xjO!yjO!zjO!{jO!|jO!}jO#OjO#PjO#QjO#RjO#SjO#TjO#UjO#VjO#WjO#XjO#YjO#ZjO#[jO#]jO#^jO#_jO#`jO#ajO#bjO#cjO#djO#ejO#fjO#gjO#hjO#ijO#jjO#kjO#ljO#mjO#njO#ojO#pjO#qjO#rjO#sjO#tjO#ujO#vjO#wjO#xjO#yjO#zjO#{jO#|jO#}jO$OjO$PjO$QjO$RjO$SjO$TjO$UjO$VjO$WjO$XjO$YjO$ZjO$[jO$]jO$^jO$_jO$`jO$ajO$bjO$cjO$djO$ejO$fjO$gjO$hjO$ijO$jjO$kjO$ljO$mjO$njO$ojO$pjO$qjO$rjO$sjO$tjO$ujO$vjO$wjO$xjO$yjO$zjO${jO$|jO$}jO%OjO%PjO%QjO%R_O%S_O%T_O%U_O%q]O%r^O%sZO%tWO%yZO%|[O&O_O~O!R!sO~P!2PO%o!tO~P6XO!O!vO~PfO]YOrTOuUO%q!xO!P%}X!b%}X!c%}X!d%}X!e%}X%m%}X%n%}X%p%}X&O%}X%o%}X~O%p!|O~P6XO!R#PO~P7aO!O#RO%h#QO~O!O#UO~PfO%o#XO~P6XO!O#YO~PfO]YOrTOuUO%q!xO!P%}a!b%}a!c%}a!d%}a!e%}a%m%}a%n%}a%p%}a&O%}a%o%}a~O`!hOa!hOb!hOc!hOd!hOe!hOf!hO!P!gO!b!hO!c!hO!d!hO!e!hO%l!hO~O%i#]O~P!>pO!O#^O~O!R#_O~P7aO!O#`O~PfO%i#aO~P!>pOml!d!e!cp!w%R&O%T%U~",
|
|
1674
|
+
goto: ",r&RPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP&SPPP&mPP&m&SPPPPP'[PP'_P&SP'xPP'{(O&SPPP(i(l(vPPPP(y&SP)P&SP)S&SP)V&m&S&SP&S)Y)YPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP)b)|*S*g*q+PPPPPPPPPPPPPPPPPPPPPPPP+V+eP,Q,`P,fP,n&S!P_OTUVXbcdefqsuw}!W!Y![!`!g!w#T#V!O_OTUVXbcdefqsuw}!W!Y![!`!g!w#T#VT!x!P!zR!Wch`OTUVbqsu}!g!w#V[xXcde!W!YR!swR!YdR!Ye!PXOTUVXbcdefqsuw}!W!Y![!`!g!w#T#VR!`fQ!_fS#P![!`R#_#TR#S!^X!hk!j#Q#[R!bgR!dhR!fi]!O^l|!R!l!uQbOQqTQsUQuV[!Tbqsu!w#VQ!w}R#V!gQnSR!mn[wXcde!W!YQ![fU!rw![#TR#T!`Q!jkS#W!j#[R#[#QQ!R^Q!llQ!u|V!{!R!l!uQ!z!PR#Z!ziaOTUVbqsu}!g!w#Vh`OTUVbqsu}!g!w#VgvXcdefw!W!Y![!`#TUyXdeQ!VcQ!}!WR#O!YX!ik!j#Q#[]!Q^l|!R!l!uT!y!P!z",
|
|
1675
|
+
nodeNames: "⚠ BlockComment PodDirective PodDirective PodDirective PodHeading PodStrong PodEmphasis PodCode PodLink PodFormat Heredoc Heredoc . MethodName Version CharacterClass Assertion StringLiteral Operator LineComment BlockComment VariableName StringLiteral Regex Regex Operator VariableName LineComment DocComment Program Pod Number ) ( Parens ] [ Brackets PackageDeclaration class role grammar module package PackageName } { Block ; RoutineDeclaration sub RoutineName method submethod RoutineName RoutineName RegexDeclaration token rule regex RegexName Block Regex Escape VariableName AttributeName SpecialVariable Block EnumDeclaration enum EnumName SubsetDeclaration subset SubsetName ConstantDeclaration constant ConstantName MethodCall Identifier TypeName Number StringLiteral NestedDelimiters Interpolation PairKey my our has state temp let anon augment supersede unit multi proto only if elsif else unless with orwith without for while until loop repeat given when default do gather take try return next last redo proceed succeed react whenever supply emit start use need import require no is does of returns handles where will trusts hides and or not xor so andthen orelse notandthen div mod gcd lcm eq ne lt gt le ge cmp leg eqv but self True False Nil BEGIN CHECK INIT END ENTER LEAVE KEEP UNDO FIRST NEXT LAST PRE POST CATCH CONTROL QUIT CLOSE DOC Operator , : . Regex Heredoc StringLiteral",
|
|
1676
|
+
maxTerm: 232,
|
|
1675
1677
|
context: trackContext,
|
|
1676
1678
|
nodeProps: [
|
|
1677
1679
|
["openedBy", 33,"(",36,"[",46,"{"],
|
|
1678
1680
|
["closedBy", 34,")",37,"]",47,"}"]
|
|
1679
1681
|
],
|
|
1680
1682
|
skippedNodes: [0,1,11,12,28,29],
|
|
1681
|
-
repeatNodeCount:
|
|
1682
|
-
tokenData: "!$`~R!aX^%Wpq%Wqr%{st']tu(|uv5Rvw8axy:Wyz:]z{%{{|%{|}:b}!O%{!O!P:g!P!Q%{!Q!R;V!R![=f![!]@Z!]!^FQ!^!_%{!_!`%{!`!a%{!a!b%{!b!cFV!c!}Gy!}#OJu#O#PJz#P#Q! T#Q#R%{#R#S! Y#T#o! Y#o#p!$U#p#q%{#q#r!$Z#r#s%{#y#z%W$f$g%W$p$q! Y$q$r%{${$|! Y%Q%R! Y%R%S%{%W%o! Y%o%p%{%p&a! Y&a&b%{&b#BY! Y#BY#BZ%W#BZ$IS! Y$IS$I_%W$Iz$I{%{$I|$JO%W$JT$JU%W$KV$KW%W%&Y%+t%{&/x&Et! Y&FU&FV%W&Gh;'S! Y;'S;=`!#x?&r?Bj! Y?Hw?Ic! Y?Ii?JT! Y?J`?L{! Y~%]Y%
|
|
1683
|
+
repeatNodeCount: 6,
|
|
1684
|
+
tokenData: "!$`~R!aX^%Wpq%Wqr%{st']tu(|uv5Rvw8axy:Wyz:]z{%{{|%{|}:b}!O%{!O!P:g!P!Q%{!Q!R;V!R![=f![!]@Z!]!^FQ!^!_%{!_!`%{!`!a%{!a!b%{!b!cFV!c!}Gy!}#OJu#O#PJz#P#Q! T#Q#R%{#R#S! Y#T#o! Y#o#p!$U#p#q%{#q#r!$Z#r#s%{#y#z%W$f$g%W$p$q! Y$q$r%{${$|! Y%Q%R! Y%R%S%{%W%o! Y%o%p%{%p&a! Y&a&b%{&b#BY! Y#BY#BZ%W#BZ$IS! Y$IS$I_%W$Iz$I{%{$I|$JO%W$JT$JU%W$KV$KW%W%&Y%+t%{&/x&Et! Y&FU&FV%W&Gh;'S! Y;'S;=`!#x?&r?Bj! Y?Hw?Ic! Y?Ii?JT! Y?J`?L{! Y~%]Y%v~X^%Wpq%W#y#z%W$f$g%W#BY#BZ%W$IS$I_%W$I|$JO%W$JT$JU%W$KV$KW%W&FU&FV%WP&Qc%RPqr%{z{%{{|%{}!O%{!P!Q%{!^!_%{!_!`%{!`!a%{!a!b%{#O#P%{#Q#R%{#p#q%{#r#s%{$q$r%{%R%S%{%o%p%{&a&b%{$Iz$I{%{%&Y%+t%{~'bWl~OY'zZ!_'z!_!`(c!`#p'z#p#q(c#q;'S'z;'S;=`(]<%lO'z~(PSl~OY'zZ;'S'z;'S;=`(]<%lO'z~(`P;=`<%l'z~(jSm~l~OY(cZ;'S(c;'S;=`(v<%lO(c~(yP;=`<%l(c~)Rk&O~qr*vz{.|!O!P-h!P!Q1x!Q![1}![!]2V!_!`.|!a!b.|!c!}3_#Q#R2V#R#S3_#T#o3_#r#s.|$p$q3_${$|3_%Q%R3_%W%o3_%p&a3_&b#BY3_#BZ$IS3_&/x&Et3_&Gh;'S3_;'S;=`4{?&r?Bj3_?Hw?Ic3_?Ii?JT3_?J`?L{3_~*{a!c~!c!},Q#R#S,Q#T#o,Q$p$q,Q${$|,Q%Q%R,Q%W%o,Q%p&a,Q&b#BY,Q#BZ$IS,Q&/x&Et,Q&Gh;'S,Q;'S;=`.p?&r?Bj,Q?Hw?Ic,Q?Ii?JT,Q?J`?L{,Q~,Ve!d~wx-h}!O-h!Q![,Q![!].v!c!},Q#R#S,Q#T#o,Q$p$q,Q${$|,Q%Q%R,Q%W%o,Q%p&a,Q&b#BY,Q#BZ$IS,Q&/x&Et,Q&Gh;'S,Q;'S;=`.p?&r?Bj,Q?Hw?Ic,Q?Ii?JT,Q?J`?L{,Q~-ka!c!},Q#R#S,Q#T#o,Q$p$q,Q${$|,Q%Q%R,Q%W%o,Q%p&a,Q&b#BY,Q#BZ$IS,Q&/x&Et,Q&Gh;'S,Q;'S;=`.p?&r?Bj,Q?Hw?Ic,Q?Ii?JT,Q?J`?L{,Q~.sP;=`<%l,Q~.yP![!]-h~/Pa!c!}0U#R#S0U#T#o0U$p$q0U${$|0U%Q%R0U%W%o0U%p&a0U&b#BY0U#BZ$IS0U&/x&Et0U&Gh;'S0U;'S;=`1r?&r?Bj0U?Hw?Ic0U?Ii?JT0U?J`?L{0U~0Ze!e~wx.|}!O.|!Q![0U![!]1l!c!}0U#R#S0U#T#o0U$p$q0U${$|0U%Q%R0U%W%o0U%p&a0U&b#BY0U#BZ$IS0U&/x&Et0U&Gh;'S0U;'S;=`1r?&r?Bj0U?Hw?Ic0U?Ii?JT0U?J`?L{0U~1oP![!].|~1uP;=`<%l0U~1}O!c~~2SP!c~!Q![1}~2Ya!c!}3_#R#S3_#T#o3_$p$q3_${$|3_%Q%R3_%W%o3_%p&a3_&b#BY3_#BZ$IS3_&/x&Et3_&Gh;'S3_;'S;=`4{?&r?Bj3_?Hw?Ic3_?Ii?JT3_?J`?L{3_~3de!c~wx2V}!O2V!Q![3_![!]4u!c!}3_#R#S3_#T#o3_$p$q3_${$|3_%Q%R3_%W%o3_%p&a3_&b#BY3_#BZ$IS3_&/x&Et3_&Gh;'S3_;'S;=`4{?&r?Bj3_?Hw?Ic3_?Ii?JT3_?J`?L{3_~4xP![!]2V~5OP;=`<%l3_~5Wj%RPqr-huv6xz{.|!O!P-h![!]2V!_!`7V!a!b.|!c!}3_#Q#R2V#R#S3_#T#o3_#r#s.|$p$q3_${$|3_%Q%R3_%W%o3_%p&a3_&b#BY3_#BZ$IS3_&/x&Et3_&Gh;'S3_;'S;=`4{?&r?Bj3_?Hw?Ic3_?Ii?JT3_?J`?L{3_P6}P%RP!_!`7QP7VO%RP~7[a%RP!c!}0U#R#S0U#T#o0U$p$q0U${$|0U%Q%R0U%W%o0U%p&a0U&b#BY0U#BZ$IS0U&/x&Et0U&Gh;'S0U;'S;=`1r?&r?Bj0U?Hw?Ic0U?Ii?JT0U?J`?L{0U~8fj%RPqr-hvw6xz{.|!O!P-h![!]2V!_!`7V!a!b.|!c!}3_#Q#R2V#R#S3_#T#o3_#r#s.|$p$q3_${$|3_%Q%R3_%W%o3_%p&a3_&b#BY3_#BZ$IS3_&/x&Et3_&Gh;'S3_;'S;=`4{?&r?Bj3_?Hw?Ic3_?Ii?JT3_?J`?L{3_~:]Or~~:bOq~~:gO%S~~:lQ%U~!O!P:r!_!`7QP:wQ%RP!O!P:}#Q#R7QP;SP%RP#Q#R7Q~;[^!s~!O!P<W!Q![=f!d!e>T!f!g>o!g!h<r!q!r?T!z!{?i#R#S=}#U#V>T#W#X>o#X#Y<r#]#^=a#c#d?T#l#m?i~<ZP!Q![<^~<cT!s~!Q![<^!g!h<r#R#S<W#X#Y<r#]#^=a~<uR{|=O}!O=O!Q![=U~=RP!Q![=U~=ZQ!s~!Q![=U#]#^=a~=fO!s~~=kU!s~!O!P<W!Q![=f!g!h<r#R#S=}#X#Y<r#]#^=a~>QP!Q![=f~>WR!Q!R>a!R!S>a#R#S>a~>fR!s~!Q!R>a!R!S>a#R#S>a~>rQ!Q![>x#R#S>x~>}Q!s~!Q![>x#R#S>x~?WQ!Q!Y?^#R#S?^~?cQ!s~!Q!Y?^#R#S?^~?lS!Q![?x!c!i?x#R#S?x#T#Z?x~?}S!s~!Q![?x!c!i?x#R#S?x#T#Z?x~@`e%T~qrAq!Q![Dm![!]Et!_!`7Q!c!}By#R#SBy#T#oBy$p$qBy${$|By%Q%RBy%W%oBy%p&aBy&b#BYBy#BZ$ISBy&/x&EtBy&Gh;'SBy;'S;=`Dg?&r?BjBy?Hw?IcBy?Ii?JTBy?J`?L{By~Ata!c!}By#R#SBy#T#oBy$p$qBy${$|By%Q%RBy%W%oBy%p&aBy&b#BYBy#BZ$ISBy&/x&EtBy&Gh;'SBy;'S;=`Dg?&r?BjBy?Hw?IcBy?Ii?JTBy?J`?L{By~COe!w~wxAq}!OAq!Q![By![!]Da!c!}By#R#SBy#T#oBy$p$qBy${$|By%Q%RBy%W%oBy%p&aBy&b#BYBy#BZ$ISBy&/x&EtBy&Gh;'SBy;'S;=`Dg?&r?BjBy?Hw?IcBy?Ii?JTBy?J`?L{By~DdP![!]Aq~DjP;=`<%lBy~DpQ!Q![Dm!^!_Dv~DyT!O!PEY!Q![EY!c!}EY#R#SEY#T#oEY~E]U!O!PEY!Q![EY!`!aEo!c!}EY#R#SEY#T#oEY~EtOp~PEwP![!]EzPE}P!_!`7Q~FVO!R~~F[i&O~qr-hz{.|!O!P-h![!]2V!_!`.|!a!b.|!c!}3_#Q#R2V#R#S3_#T#o3_#r#s.|$p$q3_${$|3_%Q%R3_%W%o3_%p&a3_&b#BY3_#BZ$IS3_&/x&Et3_&Gh;'S3_;'S;=`4{?&r?Bj3_?Hw?Ic3_?Ii?JT3_?J`?L{3_~HOe%|~wxIa}!OIa!Q![Gy![!]Jo!c!}Gy#R#SGy#T#oGy$p$qGy${$|Gy%Q%RGy%W%oGy%p&aGy&b#BYGy#BZ$ISGy&/x&EtGy&Gh;'SGy;'S;=`Ji?&r?BjGy?Hw?IcGy?Ii?JTGy?J`?L{Gy~Ida!c!}Gy#R#SGy#T#oGy$p$qGy${$|Gy%Q%RGy%W%oGy%p&aGy&b#BYGy#BZ$ISGy&/x&EtGy&Gh;'SGy;'S;=`Ji?&r?BjGy?Hw?IcGy?Ii?JTGy?J`?L{Gy~JlP;=`<%lGy~JrP![!]Ia~JzOu~RKPu%RPOqMdqrMirzMdz{Mi{|Mi|}Md}!OMi!O!PMd!P!QMi!Q!^Md!^!_Mi!_!`Mi!`!aMi!a!bMi!b#OMd#O#PMi#P#QMd#Q#RMi#R#pMd#p#qMi#q#rMd#r#sMi#s$qMd$q$rMi$r%RMd%R%SMi%S%oMd%o%pMi%p&aMd&a&bMi&b$IzMd$Iz$I{Mi$I{%&YMd%&Y%+tMi%+t;'SMd;'S;=`N{;=`OMdQMiO!bQRMpc!bQ%RPqr%{z{%{{|%{}!O%{!P!Q%{!^!_%{!_!`%{!`!a%{!a!b%{#O#P%{#Q#R%{#p#q%{#r#s%{$q$r%{%R%S%{%o%p%{&a&b%{$Iz$I{%{%&Y%+t%{Q! QP!bQ;=`<%lMd~! YOt~~! _e%y~wx!!p}!O!!p!Q![! Y![!]!$O!c!}! Y#R#S! Y#T#o! Y$p$q! Y${$|! Y%Q%R! Y%W%o! Y%p&a! Y&b#BY! Y#BZ$IS! Y&/x&Et! Y&Gh;'S! Y;'S;=`!#x?&r?Bj! Y?Hw?Ic! Y?Ii?JT! Y?J`?L{! Y~!!sa!c!}! Y#R#S! Y#T#o! Y$p$q! Y${$|! Y%Q%R! Y%W%o! Y%p&a! Y&b#BY! Y#BZ$IS! Y&/x&Et! Y&Gh;'S! Y;'S;=`!#x?&r?Bj! Y?Hw?Ic! Y?Ii?JT! Y?J`?L{! Y~!#{P;=`<%l! Y~!$RP![!]!!p~!$ZO!P~~!$`O!O~",
|
|
1683
1685
|
tokenizers: [smileyToken, blockComment, podToken, heredocToken, methodDotToken, nameToken, versionToken, regexToken, quoteToken, termToken, 0, 1],
|
|
1684
|
-
topRules: {"Program":[0,30],"Regex":[1,
|
|
1685
|
-
specialized: [{term:
|
|
1686
|
-
tokenPrec:
|
|
1686
|
+
topRules: {"Program":[0,30],"Regex":[1,191],"Heredoc":[2,192],"StringLiteral":[3,193]},
|
|
1687
|
+
specialized: [{term: 225, get: (value) => spec_identifier[value] || -1},{term: 228, get: (value) => spec_capIdentifier[value] || -1}],
|
|
1688
|
+
tokenPrec: 3556
|
|
1687
1689
|
});
|
|
1688
1690
|
|
|
1689
1691
|
// The keywords of the grammar, with the tag each is highlighted with.
|
|
@@ -2390,7 +2392,10 @@ const baseLanguage = language.LRLanguage.define({
|
|
|
2390
2392
|
// A heredoc starts with the line break before its first line.
|
|
2391
2393
|
Heredoc(tree) { return { from: tree.from, to: tree.to }; }
|
|
2392
2394
|
}),
|
|
2393
|
-
highlight.styleTags(Object.assign(Object.assign({}, keywordTags), { "True False": highlight.tags.bool, Nil: highlight.tags.null, Identifier: highlight.tags.function(highlight.tags.variableName), TypeName: highlight.tags.typeName, PackageName: highlight.tags.definition(highlight.tags.className), "EnumName SubsetName": highlight.tags.definition(highlight.tags.typeName), ConstantName: highlight.tags.definition(highlight.tags.constant(highlight.tags.variableName)), "RoutineName RegexName": highlight.tags.function(highlight.tags.definition(highlight.tags.variableName)), MethodName: highlight.tags.function(highlight.tags.propertyName), VariableName: highlight.tags.variableName, AttributeName: highlight.tags.propertyName, SpecialVariable: highlight.tags.special(highlight.tags.variableName), PairKey: highlight.tags.attributeName, Number: highlight.tags.number, Version: highlight.tags.literal,
|
|
2395
|
+
highlight.styleTags(Object.assign(Object.assign({}, keywordTags), { "True False": highlight.tags.bool, Nil: highlight.tags.null, Identifier: highlight.tags.function(highlight.tags.variableName), TypeName: highlight.tags.typeName, PackageName: highlight.tags.definition(highlight.tags.className), "EnumName SubsetName": highlight.tags.definition(highlight.tags.typeName), ConstantName: highlight.tags.definition(highlight.tags.constant(highlight.tags.variableName)), "RoutineName RegexName": highlight.tags.function(highlight.tags.definition(highlight.tags.variableName)), MethodName: highlight.tags.function(highlight.tags.propertyName), VariableName: highlight.tags.variableName, AttributeName: highlight.tags.propertyName, SpecialVariable: highlight.tags.special(highlight.tags.variableName), PairKey: highlight.tags.attributeName, Number: highlight.tags.number, Version: highlight.tags.literal,
|
|
2396
|
+
// A pair of delimiters in a quote is text of it, and a tag
|
|
2397
|
+
// does not reach the text in a child node.
|
|
2398
|
+
"StringLiteral Heredoc NestedDelimiters": highlight.tags.string, Regex: highlight.tags.regexp, CharacterClass: highlight.tags.character, Assertion: highlight.tags.function(highlight.tags.variableName), "Pod PodFormat": highlight.tags.docComment, PodDirective: highlight.tags.meta,
|
|
2394
2399
|
// These are still part of a comment, and are styled as one where
|
|
2395
2400
|
// a theme has no style for the second tag.
|
|
2396
2401
|
PodHeading: [highlight.tags.docComment, highlight.tags.heading], PodStrong: [highlight.tags.docComment, highlight.tags.strong], PodEmphasis: [highlight.tags.docComment, highlight.tags.emphasis], PodCode: [highlight.tags.docComment, highlight.tags.monospace], PodLink: [highlight.tags.docComment, highlight.tags.link], Escape: highlight.tags.escape, "Interpolation/{ Interpolation/}": highlight.tags.special(highlight.tags.brace), LineComment: highlight.tags.lineComment, BlockComment: highlight.tags.blockComment, DocComment: highlight.tags.docComment, Operator: highlight.tags.operator, ".": highlight.tags.derefOperator, ", ;": highlight.tags.separator, ":": highlight.tags.punctuation, "( )": highlight.tags.paren, "[ ]": highlight.tags.squareBracket, "{ }": highlight.tags.brace }))
|
package/dist/index.js
CHANGED
|
@@ -5,13 +5,13 @@ import { tags, styleTags } from '@lezer/highlight';
|
|
|
5
5
|
import { Prec, EditorState } from '@codemirror/state';
|
|
6
6
|
|
|
7
7
|
// This file was generated by lezer-generator. You probably shouldn't edit it.
|
|
8
|
-
const smiley =
|
|
9
|
-
noSmiley =
|
|
8
|
+
const smiley = 201,
|
|
9
|
+
noSmiley = 202,
|
|
10
10
|
BlockComment = 1,
|
|
11
11
|
podStart = 2,
|
|
12
|
-
podEnd =
|
|
12
|
+
podEnd = 203,
|
|
13
13
|
podEndDirective = 3,
|
|
14
|
-
podText =
|
|
14
|
+
podText = 204,
|
|
15
15
|
PodDirective = 4,
|
|
16
16
|
PodHeading = 5,
|
|
17
17
|
PodStrong = 6,
|
|
@@ -21,17 +21,17 @@ const smiley = 199,
|
|
|
21
21
|
PodFormat = 10,
|
|
22
22
|
rawHeredoc = 11,
|
|
23
23
|
interpolatingHeredoc = 12,
|
|
24
|
-
heredocStart =
|
|
24
|
+
heredocStart = 205,
|
|
25
25
|
methodDot = 13,
|
|
26
26
|
MethodName = 14,
|
|
27
|
-
declaredName =
|
|
28
|
-
declaredMethodName =
|
|
27
|
+
declaredName = 206,
|
|
28
|
+
declaredMethodName = 207,
|
|
29
29
|
Version = 15,
|
|
30
|
-
regexStart =
|
|
31
|
-
regexBodyEnd =
|
|
32
|
-
regexLitOpen =
|
|
33
|
-
regexLitClose =
|
|
34
|
-
regexText =
|
|
30
|
+
regexStart = 208,
|
|
31
|
+
regexBodyEnd = 209,
|
|
32
|
+
regexLitOpen = 210,
|
|
33
|
+
regexLitClose = 211,
|
|
34
|
+
regexText = 212,
|
|
35
35
|
CharacterClass = 16,
|
|
36
36
|
Assertion = 17,
|
|
37
37
|
regexQuote = 18,
|
|
@@ -39,18 +39,18 @@ const smiley = 199,
|
|
|
39
39
|
regexComment = 20,
|
|
40
40
|
regexBlockComment = 21,
|
|
41
41
|
regexCapture = 22,
|
|
42
|
-
quoteContent =
|
|
43
|
-
quoteNestOpen =
|
|
44
|
-
quoteNestClose =
|
|
45
|
-
quoteEnd =
|
|
46
|
-
rawString =
|
|
47
|
-
quoteStart =
|
|
42
|
+
quoteContent = 213,
|
|
43
|
+
quoteNestOpen = 214,
|
|
44
|
+
quoteNestClose = 215,
|
|
45
|
+
quoteEnd = 216,
|
|
46
|
+
rawString = 217,
|
|
47
|
+
quoteStart = 218,
|
|
48
48
|
interpolatingWordList = 23,
|
|
49
49
|
regexLiteral = 24,
|
|
50
50
|
transliteration = 25,
|
|
51
|
-
plainName =
|
|
51
|
+
plainName = 219,
|
|
52
52
|
wordOperator = 26,
|
|
53
|
-
multiName =
|
|
53
|
+
multiName = 220,
|
|
54
54
|
operatorVariable = 27,
|
|
55
55
|
LineComment = 28,
|
|
56
56
|
DocComment = 29,
|
|
@@ -72,19 +72,20 @@ const smiley = 199,
|
|
|
72
72
|
TypeName = 80,
|
|
73
73
|
Number = 81,
|
|
74
74
|
quotedString = 82,
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
75
|
+
NestedDelimiters = 83,
|
|
76
|
+
Interpolation = 84,
|
|
77
|
+
PairKey = 85,
|
|
78
|
+
multi = 96,
|
|
79
|
+
proto = 97,
|
|
80
|
+
only = 98,
|
|
81
|
+
self = 165,
|
|
82
|
+
True = 166,
|
|
83
|
+
False = 167,
|
|
84
|
+
Nil = 168,
|
|
85
|
+
Operator = 187,
|
|
86
|
+
Regex = 191,
|
|
87
|
+
Heredoc = 192,
|
|
88
|
+
StringLiteral = 193;
|
|
88
89
|
|
|
89
90
|
// Opening bracket -> closing bracket, for the delimiters of quotes and
|
|
90
91
|
// embedded comments. Raku accepts any Unicode bracket pair; this lists
|
|
@@ -154,9 +155,7 @@ function word(input, from, to) {
|
|
|
154
155
|
}
|
|
155
156
|
// A quote that is being read piece by piece because it interpolates.
|
|
156
157
|
class Quote {
|
|
157
|
-
constructor(parent, open, close, count,
|
|
158
|
-
// How many nested opening delimiters are unclosed.
|
|
159
|
-
depth, interpolates,
|
|
158
|
+
constructor(parent, open, close, count, interpolates,
|
|
160
159
|
// Whether a backslash that does not start an escape still
|
|
161
160
|
// takes the delimiter after it out of play: q:c[a \] b]
|
|
162
161
|
escapes) {
|
|
@@ -164,22 +163,18 @@ class Quote {
|
|
|
164
163
|
this.open = open;
|
|
165
164
|
this.close = close;
|
|
166
165
|
this.count = count;
|
|
167
|
-
this.depth = depth;
|
|
168
166
|
this.interpolates = interpolates;
|
|
169
167
|
this.escapes = escapes;
|
|
170
168
|
let hash = parent ? parent.hash : 7;
|
|
171
|
-
for (let part of [open, count,
|
|
169
|
+
for (let part of [open, count, interpolates, escapes ? 1 : 0])
|
|
172
170
|
hash = (hash * 31 + part) | 0;
|
|
173
171
|
this.hash = hash;
|
|
174
172
|
}
|
|
175
|
-
withDepth(depth) {
|
|
176
|
-
return new Quote(this.parent, this.open, this.close, this.count, depth, this.interpolates, this.escapes);
|
|
177
|
-
}
|
|
178
173
|
}
|
|
179
174
|
const noHeredocs = [];
|
|
180
175
|
// The quote that the text of a heredoc is read as. It has no
|
|
181
176
|
// delimiters, and ends where the text does.
|
|
182
|
-
const heredocQuote = new Quote(null, -1, -1, 1,
|
|
177
|
+
const heredocQuote = new Quote(null, -1, -1, 1, 63 /* Interpolate.All */, true);
|
|
183
178
|
// The body of a regex declaration, or the inside of a regex literal,
|
|
184
179
|
// that is being read piece by piece.
|
|
185
180
|
class RegexBody {
|
|
@@ -276,7 +271,7 @@ for (let term of [Identifier, TypeName, smiley, noSmiley, declaredName, declared
|
|
|
276
271
|
methodRoutineName, multiName, multiRoutineName, RegexName, EnumName, SubsetName, ConstantName])
|
|
277
272
|
termModes.set(term, 2 /* Mode.AfterName */);
|
|
278
273
|
// The `}` of "{...}" in a string does not take a subscript.
|
|
279
|
-
for (let term of [quoteContent, Interpolation])
|
|
274
|
+
for (let term of [quoteContent, quoteNestOpen, quoteNestClose, NestedDelimiters, Interpolation])
|
|
280
275
|
termModes.set(term, 0 /* Mode.Term */);
|
|
281
276
|
for (let term of [multi, proto, only])
|
|
282
277
|
termModes.set(term, 4 /* Mode.AfterMulti */);
|
|
@@ -367,15 +362,16 @@ function hasNewline(input, from, to) {
|
|
|
367
362
|
}
|
|
368
363
|
// The heredocs that are open after a reused node, of which the input is
|
|
369
364
|
// at the start. As when tokens are shifted, a line break between tokens
|
|
370
|
-
// and the text of a heredoc close the ones before them.
|
|
371
|
-
|
|
365
|
+
// and the text of a heredoc close the ones before them. `inQuote` tells
|
|
366
|
+
// that the node is a run of pieces of a quote.
|
|
367
|
+
function heredocsAfter(node, input, before, inQuote) {
|
|
372
368
|
// Most reused nodes are single tokens.
|
|
373
369
|
if (!node.children.length && !stringTerms.has(node.type.id) && !heredocTerms.has(node.type.id))
|
|
374
370
|
return before;
|
|
375
371
|
let cursor = node.cursor(), found = [], closedAt = -1;
|
|
376
372
|
// Goes over the node at the cursor from its end, and tells whether
|
|
377
373
|
// the heredocs before some point in it are closed.
|
|
378
|
-
function scan() {
|
|
374
|
+
function scan(text = false) {
|
|
379
375
|
let type = cursor.type.id, { from, to } = cursor;
|
|
380
376
|
if (heredocTerms.has(type)) {
|
|
381
377
|
closedAt = to;
|
|
@@ -394,7 +390,7 @@ function heredocsAfter(node, input, before) {
|
|
|
394
390
|
if (!cursor.lastChild())
|
|
395
391
|
return false;
|
|
396
392
|
// Between the pieces of a string lies its text, not whitespace.
|
|
397
|
-
let gaps = !isString;
|
|
393
|
+
let gaps = !isString && !text && type != NestedDelimiters;
|
|
398
394
|
for (let gapEnd = to;;) {
|
|
399
395
|
if (gaps && hasNewline(input, cursor.to, gapEnd)) {
|
|
400
396
|
closedAt = gapEnd;
|
|
@@ -412,7 +408,8 @@ function heredocsAfter(node, input, before) {
|
|
|
412
408
|
cursor.parent();
|
|
413
409
|
return closedAt >= 0;
|
|
414
410
|
}
|
|
415
|
-
|
|
411
|
+
// A piece on its own, such as an Interpolation, is a named node.
|
|
412
|
+
scan(inQuote && node.type.isAnonymous);
|
|
416
413
|
if (!found.length && closedAt < 0)
|
|
417
414
|
return before;
|
|
418
415
|
let after = found.filter(opener => opener.pos >= closedAt).sort((a, b) => a.pos - b.pos).map(opener => opener.heredoc);
|
|
@@ -477,17 +474,9 @@ const trackContext = new ContextTracker({
|
|
|
477
474
|
let opening = wordListOpening(input, 0) || readOpening(input);
|
|
478
475
|
if (!opening)
|
|
479
476
|
return context;
|
|
480
|
-
let quote = new Quote(context.quote, opening.open, opening.close, opening.count,
|
|
477
|
+
let quote = new Quote(context.quote, opening.open, opening.close, opening.count, opening.interpolates, opening.escapes);
|
|
481
478
|
return context.withQuote(0 /* Mode.Term */, quote, withHeredocAt(context.heredocs, input, 0));
|
|
482
479
|
}
|
|
483
|
-
case quoteNestOpen:
|
|
484
|
-
case quoteNestClose: {
|
|
485
|
-
let quote = context.quote;
|
|
486
|
-
if (!quote)
|
|
487
|
-
return context;
|
|
488
|
-
let depth = quote.depth + (term == quoteNestOpen ? 1 : -1);
|
|
489
|
-
return context.withQuote(0 /* Mode.Term */, quote.withDepth(depth));
|
|
490
|
-
}
|
|
491
480
|
case quoteEnd:
|
|
492
481
|
return context.withQuote(1 /* Mode.AfterTerm */, context.quote && context.quote.parent);
|
|
493
482
|
}
|
|
@@ -511,8 +500,13 @@ const trackContext = new ContextTracker({
|
|
|
511
500
|
return term == Identifier || term == Interpolation ? context.withMode(modeAfter(term, input, 0, context.mode))
|
|
512
501
|
: context;
|
|
513
502
|
},
|
|
514
|
-
|
|
515
|
-
|
|
503
|
+
// A node that is reused leaves the quote and the regex of the context
|
|
504
|
+
// as they are: the grammar pairs the delimiters that nest in a quote
|
|
505
|
+
// (NestedDelimiters) and the braces of a block, so a node closes what
|
|
506
|
+
// it opens.
|
|
507
|
+
reuse(context, node, stack, input) {
|
|
508
|
+
let inQuote = context.quote != null && inQuoteText(stack);
|
|
509
|
+
context = context.withHeredocs(heredocsAfter(node, input, context.heredocs, inQuote));
|
|
516
510
|
// The node's positions count from its start, where the input is.
|
|
517
511
|
let last = lastToken$1(node.topNode);
|
|
518
512
|
// What comes before a trailing `++` in a reused node is a term.
|
|
@@ -1234,17 +1228,25 @@ function hasPostfix(input, end) {
|
|
|
1234
1228
|
let methodEnd = nameEnd(input, end + 1);
|
|
1235
1229
|
return methodEnd > 0 && input.peek(methodEnd) == 40 /* Ch.ParenOpen */;
|
|
1236
1230
|
}
|
|
1231
|
+
// Whether the parser is between the pieces of a quote, as opposed to
|
|
1232
|
+
// in the code of a block in it.
|
|
1233
|
+
function inQuoteText(stack) { return stack.canShift(quoteContent); }
|
|
1234
|
+
// Whether the parser is, in a quote, right after a variable or after a
|
|
1235
|
+
// subscript or a call on one: where the grammar takes a quotePostfix.
|
|
1236
|
+
// This is asked of the parser and not of the mode, which is not known
|
|
1237
|
+
// to this precision after a reused node that ends in text of the quote.
|
|
1238
|
+
function afterQuotedVariable(stack) { return stack.canShift(rawString); }
|
|
1237
1239
|
// The pieces of a quote that interpolates.
|
|
1238
1240
|
const quoteToken = new ExternalTokenizer((input, stack) => {
|
|
1239
|
-
if (!stack
|
|
1241
|
+
if (!inQuoteText(stack))
|
|
1240
1242
|
return;
|
|
1241
|
-
let { quote
|
|
1243
|
+
let { quote } = context(stack);
|
|
1242
1244
|
if (!quote)
|
|
1243
1245
|
return;
|
|
1244
1246
|
let { open, close, count, interpolates } = quote, nests = open != close;
|
|
1245
1247
|
// After a variable, a subscript or a call continues the interpolation.
|
|
1246
1248
|
// `[` and `(` are left to the grammar's own tokens.
|
|
1247
|
-
if (
|
|
1249
|
+
if (afterQuotedVariable(stack)) {
|
|
1248
1250
|
if (input.next == 91 /* Ch.BracketOpen */ || input.next == 40 /* Ch.ParenOpen */)
|
|
1249
1251
|
return;
|
|
1250
1252
|
let end = subscriptEnd(input);
|
|
@@ -1264,7 +1266,8 @@ const quoteToken = new ExternalTokenizer((input, stack) => {
|
|
|
1264
1266
|
if (input.pos > start)
|
|
1265
1267
|
break;
|
|
1266
1268
|
input.advance(count);
|
|
1267
|
-
|
|
1269
|
+
// Inside a nested pair, a closing delimiter closes that pair.
|
|
1270
|
+
return input.acceptToken(!atClose ? quoteNestOpen : stack.canShift(quoteNestClose) ? quoteNestClose : quoteEnd);
|
|
1268
1271
|
}
|
|
1269
1272
|
if (next == 92 /* Ch.Backslash */) {
|
|
1270
1273
|
if (interpolates & 32 /* Interpolate.Backslash */)
|
|
@@ -1553,9 +1556,8 @@ const methodDotToken = new ExternalTokenizer((input, stack) => {
|
|
|
1553
1556
|
next = input.peek(++size);
|
|
1554
1557
|
if (!isIdentifierStart(next))
|
|
1555
1558
|
return;
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
(mode != 1 /* Mode.AfterTerm */ || input.peek(nameEnd(input, size)) != 40 /* Ch.ParenOpen */))
|
|
1559
|
+
if (context(stack).quote && inQuoteText(stack) &&
|
|
1560
|
+
(!afterQuotedVariable(stack) || input.peek(nameEnd(input, size)) != 40 /* Ch.ParenOpen */))
|
|
1559
1561
|
return;
|
|
1560
1562
|
input.acceptToken(methodDot, size);
|
|
1561
1563
|
});
|
|
@@ -1661,27 +1663,27 @@ const versionToken = new ExternalTokenizer((input, stack) => {
|
|
|
1661
1663
|
});
|
|
1662
1664
|
|
|
1663
1665
|
// This file was generated by lezer-generator. You probably shouldn't edit it.
|
|
1664
|
-
const spec_identifier = {__proto__:null,class:80, role:82, grammar:84, module:86, package:88, sub:102, method:106, submethod:108, token:116, rule:118, regex:120, enum:140, subset:146, constant:152, my:
|
|
1665
|
-
const spec_capIdentifier = {__proto__:null,True:
|
|
1666
|
+
const spec_identifier = {__proto__:null,class:80, role:82, grammar:84, module:86, package:88, sub:102, method:106, submethod:108, token:116, rule:118, regex:120, enum:140, subset:146, constant:152, my:172, our:174, has:176, state:178, temp:180, let:182, anon:184, augment:186, supersede:188, unit:190, multi:192, proto:194, only:196, if:198, elsif:200, else:202, unless:204, with:206, orwith:208, without:210, for:212, while:214, until:216, loop:218, repeat:220, given:222, when:224, default:226, do:228, gather:230, take:232, try:234, return:236, next:238, last:240, redo:242, proceed:244, succeed:246, react:248, whenever:250, supply:252, emit:254, start:256, use:258, need:260, import:262, require:264, no:266, is:268, does:270, of:272, returns:274, handles:276, where:278, will:280, trusts:282, hides:284, and:286, or:288, not:290, xor:292, so:294, andthen:296, orelse:298, notandthen:300, div:302, mod:304, gcd:306, lcm:308, eq:310, ne:312, lt:314, gt:316, le:318, ge:320, cmp:322, leg:324, eqv:326, but:328, self:330};
|
|
1667
|
+
const spec_capIdentifier = {__proto__:null,True:332, False:334, Nil:336, BEGIN:338, CHECK:340, INIT:342, END:344, ENTER:346, LEAVE:348, KEEP:350, UNDO:352, FIRST:354, NEXT:356, LAST:358, PRE:360, POST:362, CATCH:364, CONTROL:366, QUIT:368, CLOSE:370, DOC:372};
|
|
1666
1668
|
const parser$1 = LRParser.deserialize({
|
|
1667
1669
|
version: 14,
|
|
1668
|
-
states: "
|
|
1669
|
-
stateData: "
|
|
1670
|
-
goto: ",
|
|
1671
|
-
nodeNames: "⚠ BlockComment PodDirective PodDirective PodDirective PodHeading PodStrong PodEmphasis PodCode PodLink PodFormat Heredoc Heredoc . MethodName Version CharacterClass Assertion StringLiteral Operator LineComment BlockComment VariableName StringLiteral Regex Regex Operator VariableName LineComment DocComment Program Pod Number ) ( Parens ] [ Brackets PackageDeclaration class role grammar module package PackageName } { Block ; RoutineDeclaration sub RoutineName method submethod RoutineName RoutineName RegexDeclaration token rule regex RegexName Block Regex Escape VariableName AttributeName SpecialVariable Block EnumDeclaration enum EnumName SubsetDeclaration subset SubsetName ConstantDeclaration constant ConstantName MethodCall Identifier TypeName Number StringLiteral Interpolation PairKey my our has state temp let anon augment supersede unit multi proto only if elsif else unless with orwith without for while until loop repeat given when default do gather take try return next last redo proceed succeed react whenever supply emit start use need import require no is does of returns handles where will trusts hides and or not xor so andthen orelse notandthen div mod gcd lcm eq ne lt gt le ge cmp leg eqv but self True False Nil BEGIN CHECK INIT END ENTER LEAVE KEEP UNDO FIRST NEXT LAST PRE POST CATCH CONTROL QUIT CLOSE DOC Operator , : . Regex Heredoc StringLiteral",
|
|
1672
|
-
maxTerm:
|
|
1670
|
+
states: "/`QfQDdOOO*zO#tOOO+POWOOO+UO,UOOO+uOSO'#C{O,PQDdO'#DPO,WQDdO'#DSO,_QDdO'#D^OOQ.W'#Df'#DfO,fQDdO'#D`O5zQ8WO'#D|OOQ.W'#D}'#D}O6PQ7gO'#EOOOQ.W'#EQ'#EQO6sO!%SO'#EQOOQ.W'#HU'#HUOOQ.W'#HT'#HTOOQ.W'#Gf'#GfQfQDdOOO6zQEUO'#DTO7RQEUO'#D`O7YQEUO'#D`O@rQEUO'#DgO@|QEUO'#DsOJqQEUO'#DvO!&fQEUO'#DyOOQ.W'#H^'#H^O!0ZO!!^OOO!1XO!%SOOOOOS'#Gg'#GgO!1`OSO,59gOOQ.W,59g,59gOOQ.W,59k,59kO!1jQDdO,59kOOQ.W,59n,59nO!1qQDdO,59nOOQ.W,59x,59xO!1xQDdO,59xOOQ.W'#Gh'#GhO!;bQDdO'#HWOOQ.W'#HW'#HWOOQ.W,59z,59zOOQ.W,5:h,5:hOOQ.W,5:j,5:jO!;iO!%SO'#ERO!;pQDdO'#ESOOO&j'#HZ'#HZO!;wO!0jO'#HZOOO&j'#Gj'#GjO!<uO!%SO,5:lOOQ.W,5:l,5:lOOQ.W-E:d-E:dOOQ.W'#DZ'#DZOOQ.W,59o,59oO,fQDdO,59oOOQ.W'#Db'#DbO,fQDdO,59zOOQ.W'#De'#DeO!<|QDdO,5:ROOQ.W'#Dk'#DkO!=TQ:[O'#DlOOQ.W,5:R,5:RO!<|QDdO,5:ROOQ.W'#Du'#DuOOQ.W,5:_,5:_OOQ.W'#Dx'#DxOOQ.W,5:b,5:bOOQ.W'#D{'#D{OOQ.W,5:e,5:eO!=]QDdO'#DrOOO#t'#HX'#HXOOO#t'#Gi'#GiO!0ZO!!^OOQOOOOOO!1XO!%SOOOOOS-E:e-E:eOOQ.W1G/R1G/ROOQ.W1G/V1G/VOOQ.W1G/Y1G/YOOQ.W1G/d1G/dOOQ.W-E:f-E:fOOQ.W,5=r,5=rOOO&j,5:m,5:mO!=dO!%SO,5:mOOO&j,5:n,5:nO!=kQDdO,5:nOOO2Q'#H]'#H]OOO2Q'#Gk'#GkO!=rO!0jO,5=uOOO&j-E:h-E:hOOQ.W1G0W1G0WOOQ.W1G/Z1G/ZOOQ.W1G/f1G/fOOQ.W1G/m1G/mO!?kO!!^O'#DmOOQ.W,5:W,5:WO!?rQ7fO,5:WO!?wQDdO1G/mOOO#t,5:^,5:^O!@OQDdO,5:^OOO#t-E:g-E:gOOO&j1G0X1G0XOOO&j1G0Y1G0YOOO2Q-E:i-E:iO!@VO!!^O,5:XOOQY,5:X,5:XOOQ.W1G/r1G/rOOQ.W7+%X7+%XOOO#t1G/x1G/xOOQY1G/s1G/s",
|
|
1671
|
+
stateData: "!@j~O%vOSlOSmOSPOSZOS[OS~OQSO]YO__Og_Oh_Oi_Oj_Ok_Op_OrTOuUOxcOycOzcO{cO|cO!PVO!R`O!TdO!VeO!WeO![fO!]fO!^fO!c_O!d_O!e_O!hgO!khO!niO!s_O!w_O!xjO!yjO!zjO!{jO!|jO!}jO#OjO#PjO#QjO#RjO#SjO#TjO#UjO#VjO#WjO#XjO#YjO#ZjO#[jO#]jO#^jO#_jO#`jO#ajO#bjO#cjO#djO#ejO#fjO#gjO#hjO#ijO#jjO#kjO#ljO#mjO#njO#ojO#pjO#qjO#rjO#sjO#tjO#ujO#vjO#wjO#xjO#yjO#zjO#{jO#|jO#}jO$OjO$PjO$QjO$RjO$SjO$TjO$UjO$VjO$WjO$XjO$YjO$ZjO$[jO$]jO$^jO$_jO$`jO$ajO$bjO$cjO$djO$ejO$fjO$gjO$hjO$ijO$jjO$kjO$ljO$mjO$njO$ojO$pjO$qjO$rjO$sjO$tjO$ujO$vjO$wjO$xjO$yjO$zjO${jO$|jO$}jO%OjO%PjO%QjO%R_O%S_O%T_O%U_O%q]O%r^O%sZO%tWO%yZO%|[O&O_O~O%jkO~O%elO~O%rlO~OSmOTmOUmOVmOWmOXmOYmO%dmO~ORoO%coO~P+ZOqpO~PfOtrO~PfO!OtO~PfOQSO]YO__Og_Oh_Oi_Oj_Ok_Op_OrTOuUOxcOycOzcO{cO|cO!PVO!RxO!TdO!VeO!WeO![fO!]fO!^fO!c_O!d_O!e_O!hgO!khO!niO!s_O!w_O!xjO!yjO!zjO!{jO!|jO!}jO#OjO#PjO#QjO#RjO#SjO#TjO#UjO#VjO#WjO#XjO#YjO#ZjO#[jO#]jO#^jO#_jO#`jO#ajO#bjO#cjO#djO#ejO#fjO#gjO#hjO#ijO#jjO#kjO#ljO#mjO#njO#ojO#pjO#qjO#rjO#sjO#tjO#ujO#vjO#wjO#xjO#yjO#zjO#{jO#|jO#}jO$OjO$PjO$QjO$RjO$SjO$TjO$UjO$VjO$WjO$XjO$YjO$ZjO$[jO$]jO$^jO$_jO$`jO$ajO$bjO$cjO$djO$ejO$fjO$gjO$hjO$ijO$jjO$kjO$ljO$mjO$njO$ojO$pjO$qjO$rjO$sjO$tjO$ujO$vjO$wjO$xjO$yjO$zjO${jO$|jO$}jO%OjO%PjO%QjO%R_O%S_O%T_O%U_O%q]O%r^O%sZO%tWO%yZO%|[O&O_O~O^zO~O%a{O%b{O~O!P}O!b!OO!c!PO!d!PO!e!PO%m!OO%n|O&O!PO~O%p!SO~P6XO%f!UO~P,fO%f!XO~P,fO%g!ZO~P,fOQSO]YO__Og_Oh_Oi_Oj_Ok_Op_OrTOuUOxcOycOzcO{cO|cO!P!^O!TdO!VeO!WeO![fO!]fO!^fO!c_O!d_O!e_O!hgO!khO!niO!s_O!w_O!xjO!yjO!zjO!{jO!|jO!}jO#OjO#PjO#QjO#RjO#SjO#TjO#UjO#VjO#WjO#XjO#YjO#ZjO#[jO#]jO#^jO#_jO#`jO#ajO#bjO#cjO#djO#ejO#fjO#gjO#hjO#ijO#jjO#kjO#ljO#mjO#njO#ojO#pjO#qjO#rjO#sjO#tjO#ujO#vjO#wjO#xjO#yjO#zjO#{jO#|jO#}jO$OjO$PjO$QjO$RjO$SjO$TjO$UjO$VjO$WjO$XjO$YjO$ZjO$[jO$]jO$^jO$_jO$`jO$ajO$bjO$cjO$djO$ejO$fjO$gjO$hjO$ijO$jjO$kjO$ljO$mjO$njO$ojO$pjO$qjO$rjO$sjO$tjO$ujO$vjO$wjO$xjO$yjO$zjO${jO$|jO$}jO%OjO%PjO%QjO%R_O%S_O%T_O%U_O%q]O%r^O%sZO%tWO%yZO%|[O&O_O~O!R!_O%f!]O~P7aO%f!aOQ!gX]!gX_!gXg!gXh!gXi!gXj!gXk!gXp!gXr!gXu!gXx!gXy!gXz!gX{!gX|!gX!P!gX!R!gX!T!gX!V!gX!W!gX![!gX!]!gX!^!gX!c!gX!d!gX!e!gX!h!gX!k!gX!n!gX!s!gX!w!gX!x!gX!y!gX!z!gX!{!gX!|!gX!}!gX#O!gX#P!gX#Q!gX#R!gX#S!gX#T!gX#U!gX#V!gX#W!gX#X!gX#Y!gX#Z!gX#[!gX#]!gX#^!gX#_!gX#`!gX#a!gX#b!gX#c!gX#d!gX#e!gX#f!gX#g!gX#h!gX#i!gX#j!gX#k!gX#l!gX#m!gX#n!gX#o!gX#p!gX#q!gX#r!gX#s!gX#t!gX#u!gX#v!gX#w!gX#x!gX#y!gX#z!gX#{!gX#|!gX#}!gX$O!gX$P!gX$Q!gX$R!gX$S!gX$T!gX$U!gX$V!gX$W!gX$X!gX$Y!gX$Z!gX$[!gX$]!gX$^!gX$_!gX$`!gX$a!gX$b!gX$c!gX$d!gX$e!gX$f!gX$g!gX$h!gX$i!gX$j!gX$k!gX$l!gX$m!gX$n!gX$o!gX$p!gX$q!gX$r!gX$s!gX$t!gX$u!gX$v!gX$w!gX$x!gX$y!gX$z!gX${!gX$|!gX$}!gX%O!gX%P!gX%Q!gX%R!gX%S!gX%T!gX%U!gX%`!gX%q!gX%r!gX%s!gX%t!gX%y!gX%|!gX&O!gXq!gXt!gX!O!gX~O%f!cOQ!jX]!jX_!jXg!jXh!jXi!jXj!jXk!jXp!jXr!jXu!jXx!jXy!jXz!jX{!jX|!jX!P!jX!R!jX!T!jX!V!jX!W!jX![!jX!]!jX!^!jX!c!jX!d!jX!e!jX!h!jX!k!jX!n!jX!s!jX!w!jX!x!jX!y!jX!z!jX!{!jX!|!jX!}!jX#O!jX#P!jX#Q!jX#R!jX#S!jX#T!jX#U!jX#V!jX#W!jX#X!jX#Y!jX#Z!jX#[!jX#]!jX#^!jX#_!jX#`!jX#a!jX#b!jX#c!jX#d!jX#e!jX#f!jX#g!jX#h!jX#i!jX#j!jX#k!jX#l!jX#m!jX#n!jX#o!jX#p!jX#q!jX#r!jX#s!jX#t!jX#u!jX#v!jX#w!jX#x!jX#y!jX#z!jX#{!jX#|!jX#}!jX$O!jX$P!jX$Q!jX$R!jX$S!jX$T!jX$U!jX$V!jX$W!jX$X!jX$Y!jX$Z!jX$[!jX$]!jX$^!jX$_!jX$`!jX$a!jX$b!jX$c!jX$d!jX$e!jX$f!jX$g!jX$h!jX$i!jX$j!jX$k!jX$l!jX$m!jX$n!jX$o!jX$p!jX$q!jX$r!jX$s!jX$t!jX$u!jX$v!jX$w!jX$x!jX$y!jX$z!jX${!jX$|!jX$}!jX%O!jX%P!jX%Q!jX%R!jX%S!jX%T!jX%U!jX%`!jX%q!jX%r!jX%s!jX%t!jX%y!jX%|!jX&O!jXq!jXt!jX!O!jX~O%f!eOQ!mX]!mX_!mXg!mXh!mXi!mXj!mXk!mXp!mXr!mXu!mXx!mXy!mXz!mX{!mX|!mX!P!mX!R!mX!T!mX!V!mX!W!mX![!mX!]!mX!^!mX!c!mX!d!mX!e!mX!h!mX!k!mX!n!mX!s!mX!w!mX!x!mX!y!mX!z!mX!{!mX!|!mX!}!mX#O!mX#P!mX#Q!mX#R!mX#S!mX#T!mX#U!mX#V!mX#W!mX#X!mX#Y!mX#Z!mX#[!mX#]!mX#^!mX#_!mX#`!mX#a!mX#b!mX#c!mX#d!mX#e!mX#f!mX#g!mX#h!mX#i!mX#j!mX#k!mX#l!mX#m!mX#n!mX#o!mX#p!mX#q!mX#r!mX#s!mX#t!mX#u!mX#v!mX#w!mX#x!mX#y!mX#z!mX#{!mX#|!mX#}!mX$O!mX$P!mX$Q!mX$R!mX$S!mX$T!mX$U!mX$V!mX$W!mX$X!mX$Y!mX$Z!mX$[!mX$]!mX$^!mX$_!mX$`!mX$a!mX$b!mX$c!mX$d!mX$e!mX$f!mX$g!mX$h!mX$i!mX$j!mX$k!mX$l!mX$m!mX$n!mX$o!mX$p!mX$q!mX$r!mX$s!mX$t!mX$u!mX$v!mX$w!mX$x!mX$y!mX$z!mX${!mX$|!mX$}!mX%O!mX%P!mX%Q!mX%R!mX%S!mX%T!mX%U!mX%`!mX%q!mX%r!mX%s!mX%t!mX%y!mX%|!mX&O!mXq!mXt!mX!O!mX~O`!hOa!hOb!hOc!hOd!hOe!hOf!hO!P!gO!b!hO!c!hO!d!hO!e!hO%k!kO%l!hO~O%p!kO~P6XOR!nO%c!nO~P+ZOq!oO~PfOt!pO~PfO!O!qO~PfOQSO]YO__Og_Oh_Oi_Oj_Ok_Op_OrTOuUOxcOycOzcO{cO|cO!PVO!TdO!VeO!WeO![fO!]fO!^fO!c_O!d_O!e_O!hgO!khO!niO!s_O!w_O!xjO!yjO!zjO!{jO!|jO!}jO#OjO#PjO#QjO#RjO#SjO#TjO#UjO#VjO#WjO#XjO#YjO#ZjO#[jO#]jO#^jO#_jO#`jO#ajO#bjO#cjO#djO#ejO#fjO#gjO#hjO#ijO#jjO#kjO#ljO#mjO#njO#ojO#pjO#qjO#rjO#sjO#tjO#ujO#vjO#wjO#xjO#yjO#zjO#{jO#|jO#}jO$OjO$PjO$QjO$RjO$SjO$TjO$UjO$VjO$WjO$XjO$YjO$ZjO$[jO$]jO$^jO$_jO$`jO$ajO$bjO$cjO$djO$ejO$fjO$gjO$hjO$ijO$jjO$kjO$ljO$mjO$njO$ojO$pjO$qjO$rjO$sjO$tjO$ujO$vjO$wjO$xjO$yjO$zjO${jO$|jO$}jO%OjO%PjO%QjO%R_O%S_O%T_O%U_O%q]O%r^O%sZO%tWO%yZO%|[O&O_O~O!R!sO~P!2PO%o!tO~P6XO!O!vO~PfO]YOrTOuUO%q!xO!P%}X!b%}X!c%}X!d%}X!e%}X%m%}X%n%}X%p%}X&O%}X%o%}X~O%p!|O~P6XO!R#PO~P7aO!O#RO%h#QO~O!O#UO~PfO%o#XO~P6XO!O#YO~PfO]YOrTOuUO%q!xO!P%}a!b%}a!c%}a!d%}a!e%}a%m%}a%n%}a%p%}a&O%}a%o%}a~O`!hOa!hOb!hOc!hOd!hOe!hOf!hO!P!gO!b!hO!c!hO!d!hO!e!hO%l!hO~O%i#]O~P!>pO!O#^O~O!R#_O~P7aO!O#`O~PfO%i#aO~P!>pOml!d!e!cp!w%R&O%T%U~",
|
|
1672
|
+
goto: ",r&RPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP&SPPP&mPP&m&SPPPPP'[PP'_P&SP'xPP'{(O&SPPP(i(l(vPPPP(y&SP)P&SP)S&SP)V&m&S&SP&S)Y)YPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP)b)|*S*g*q+PPPPPPPPPPPPPPPPPPPPPPPP+V+eP,Q,`P,fP,n&S!P_OTUVXbcdefqsuw}!W!Y![!`!g!w#T#V!O_OTUVXbcdefqsuw}!W!Y![!`!g!w#T#VT!x!P!zR!Wch`OTUVbqsu}!g!w#V[xXcde!W!YR!swR!YdR!Ye!PXOTUVXbcdefqsuw}!W!Y![!`!g!w#T#VR!`fQ!_fS#P![!`R#_#TR#S!^X!hk!j#Q#[R!bgR!dhR!fi]!O^l|!R!l!uQbOQqTQsUQuV[!Tbqsu!w#VQ!w}R#V!gQnSR!mn[wXcde!W!YQ![fU!rw![#TR#T!`Q!jkS#W!j#[R#[#QQ!R^Q!llQ!u|V!{!R!l!uQ!z!PR#Z!ziaOTUVbqsu}!g!w#Vh`OTUVbqsu}!g!w#VgvXcdefw!W!Y![!`#TUyXdeQ!VcQ!}!WR#O!YX!ik!j#Q#[]!Q^l|!R!l!uT!y!P!z",
|
|
1673
|
+
nodeNames: "⚠ BlockComment PodDirective PodDirective PodDirective PodHeading PodStrong PodEmphasis PodCode PodLink PodFormat Heredoc Heredoc . MethodName Version CharacterClass Assertion StringLiteral Operator LineComment BlockComment VariableName StringLiteral Regex Regex Operator VariableName LineComment DocComment Program Pod Number ) ( Parens ] [ Brackets PackageDeclaration class role grammar module package PackageName } { Block ; RoutineDeclaration sub RoutineName method submethod RoutineName RoutineName RegexDeclaration token rule regex RegexName Block Regex Escape VariableName AttributeName SpecialVariable Block EnumDeclaration enum EnumName SubsetDeclaration subset SubsetName ConstantDeclaration constant ConstantName MethodCall Identifier TypeName Number StringLiteral NestedDelimiters Interpolation PairKey my our has state temp let anon augment supersede unit multi proto only if elsif else unless with orwith without for while until loop repeat given when default do gather take try return next last redo proceed succeed react whenever supply emit start use need import require no is does of returns handles where will trusts hides and or not xor so andthen orelse notandthen div mod gcd lcm eq ne lt gt le ge cmp leg eqv but self True False Nil BEGIN CHECK INIT END ENTER LEAVE KEEP UNDO FIRST NEXT LAST PRE POST CATCH CONTROL QUIT CLOSE DOC Operator , : . Regex Heredoc StringLiteral",
|
|
1674
|
+
maxTerm: 232,
|
|
1673
1675
|
context: trackContext,
|
|
1674
1676
|
nodeProps: [
|
|
1675
1677
|
["openedBy", 33,"(",36,"[",46,"{"],
|
|
1676
1678
|
["closedBy", 34,")",37,"]",47,"}"]
|
|
1677
1679
|
],
|
|
1678
1680
|
skippedNodes: [0,1,11,12,28,29],
|
|
1679
|
-
repeatNodeCount:
|
|
1680
|
-
tokenData: "!$`~R!aX^%Wpq%Wqr%{st']tu(|uv5Rvw8axy:Wyz:]z{%{{|%{|}:b}!O%{!O!P:g!P!Q%{!Q!R;V!R![=f![!]@Z!]!^FQ!^!_%{!_!`%{!`!a%{!a!b%{!b!cFV!c!}Gy!}#OJu#O#PJz#P#Q! T#Q#R%{#R#S! Y#T#o! Y#o#p!$U#p#q%{#q#r!$Z#r#s%{#y#z%W$f$g%W$p$q! Y$q$r%{${$|! Y%Q%R! Y%R%S%{%W%o! Y%o%p%{%p&a! Y&a&b%{&b#BY! Y#BY#BZ%W#BZ$IS! Y$IS$I_%W$Iz$I{%{$I|$JO%W$JT$JU%W$KV$KW%W%&Y%+t%{&/x&Et! Y&FU&FV%W&Gh;'S! Y;'S;=`!#x?&r?Bj! Y?Hw?Ic! Y?Ii?JT! Y?J`?L{! Y~%]Y%
|
|
1681
|
+
repeatNodeCount: 6,
|
|
1682
|
+
tokenData: "!$`~R!aX^%Wpq%Wqr%{st']tu(|uv5Rvw8axy:Wyz:]z{%{{|%{|}:b}!O%{!O!P:g!P!Q%{!Q!R;V!R![=f![!]@Z!]!^FQ!^!_%{!_!`%{!`!a%{!a!b%{!b!cFV!c!}Gy!}#OJu#O#PJz#P#Q! T#Q#R%{#R#S! Y#T#o! Y#o#p!$U#p#q%{#q#r!$Z#r#s%{#y#z%W$f$g%W$p$q! Y$q$r%{${$|! Y%Q%R! Y%R%S%{%W%o! Y%o%p%{%p&a! Y&a&b%{&b#BY! Y#BY#BZ%W#BZ$IS! Y$IS$I_%W$Iz$I{%{$I|$JO%W$JT$JU%W$KV$KW%W%&Y%+t%{&/x&Et! Y&FU&FV%W&Gh;'S! Y;'S;=`!#x?&r?Bj! Y?Hw?Ic! Y?Ii?JT! Y?J`?L{! Y~%]Y%v~X^%Wpq%W#y#z%W$f$g%W#BY#BZ%W$IS$I_%W$I|$JO%W$JT$JU%W$KV$KW%W&FU&FV%WP&Qc%RPqr%{z{%{{|%{}!O%{!P!Q%{!^!_%{!_!`%{!`!a%{!a!b%{#O#P%{#Q#R%{#p#q%{#r#s%{$q$r%{%R%S%{%o%p%{&a&b%{$Iz$I{%{%&Y%+t%{~'bWl~OY'zZ!_'z!_!`(c!`#p'z#p#q(c#q;'S'z;'S;=`(]<%lO'z~(PSl~OY'zZ;'S'z;'S;=`(]<%lO'z~(`P;=`<%l'z~(jSm~l~OY(cZ;'S(c;'S;=`(v<%lO(c~(yP;=`<%l(c~)Rk&O~qr*vz{.|!O!P-h!P!Q1x!Q![1}![!]2V!_!`.|!a!b.|!c!}3_#Q#R2V#R#S3_#T#o3_#r#s.|$p$q3_${$|3_%Q%R3_%W%o3_%p&a3_&b#BY3_#BZ$IS3_&/x&Et3_&Gh;'S3_;'S;=`4{?&r?Bj3_?Hw?Ic3_?Ii?JT3_?J`?L{3_~*{a!c~!c!},Q#R#S,Q#T#o,Q$p$q,Q${$|,Q%Q%R,Q%W%o,Q%p&a,Q&b#BY,Q#BZ$IS,Q&/x&Et,Q&Gh;'S,Q;'S;=`.p?&r?Bj,Q?Hw?Ic,Q?Ii?JT,Q?J`?L{,Q~,Ve!d~wx-h}!O-h!Q![,Q![!].v!c!},Q#R#S,Q#T#o,Q$p$q,Q${$|,Q%Q%R,Q%W%o,Q%p&a,Q&b#BY,Q#BZ$IS,Q&/x&Et,Q&Gh;'S,Q;'S;=`.p?&r?Bj,Q?Hw?Ic,Q?Ii?JT,Q?J`?L{,Q~-ka!c!},Q#R#S,Q#T#o,Q$p$q,Q${$|,Q%Q%R,Q%W%o,Q%p&a,Q&b#BY,Q#BZ$IS,Q&/x&Et,Q&Gh;'S,Q;'S;=`.p?&r?Bj,Q?Hw?Ic,Q?Ii?JT,Q?J`?L{,Q~.sP;=`<%l,Q~.yP![!]-h~/Pa!c!}0U#R#S0U#T#o0U$p$q0U${$|0U%Q%R0U%W%o0U%p&a0U&b#BY0U#BZ$IS0U&/x&Et0U&Gh;'S0U;'S;=`1r?&r?Bj0U?Hw?Ic0U?Ii?JT0U?J`?L{0U~0Ze!e~wx.|}!O.|!Q![0U![!]1l!c!}0U#R#S0U#T#o0U$p$q0U${$|0U%Q%R0U%W%o0U%p&a0U&b#BY0U#BZ$IS0U&/x&Et0U&Gh;'S0U;'S;=`1r?&r?Bj0U?Hw?Ic0U?Ii?JT0U?J`?L{0U~1oP![!].|~1uP;=`<%l0U~1}O!c~~2SP!c~!Q![1}~2Ya!c!}3_#R#S3_#T#o3_$p$q3_${$|3_%Q%R3_%W%o3_%p&a3_&b#BY3_#BZ$IS3_&/x&Et3_&Gh;'S3_;'S;=`4{?&r?Bj3_?Hw?Ic3_?Ii?JT3_?J`?L{3_~3de!c~wx2V}!O2V!Q![3_![!]4u!c!}3_#R#S3_#T#o3_$p$q3_${$|3_%Q%R3_%W%o3_%p&a3_&b#BY3_#BZ$IS3_&/x&Et3_&Gh;'S3_;'S;=`4{?&r?Bj3_?Hw?Ic3_?Ii?JT3_?J`?L{3_~4xP![!]2V~5OP;=`<%l3_~5Wj%RPqr-huv6xz{.|!O!P-h![!]2V!_!`7V!a!b.|!c!}3_#Q#R2V#R#S3_#T#o3_#r#s.|$p$q3_${$|3_%Q%R3_%W%o3_%p&a3_&b#BY3_#BZ$IS3_&/x&Et3_&Gh;'S3_;'S;=`4{?&r?Bj3_?Hw?Ic3_?Ii?JT3_?J`?L{3_P6}P%RP!_!`7QP7VO%RP~7[a%RP!c!}0U#R#S0U#T#o0U$p$q0U${$|0U%Q%R0U%W%o0U%p&a0U&b#BY0U#BZ$IS0U&/x&Et0U&Gh;'S0U;'S;=`1r?&r?Bj0U?Hw?Ic0U?Ii?JT0U?J`?L{0U~8fj%RPqr-hvw6xz{.|!O!P-h![!]2V!_!`7V!a!b.|!c!}3_#Q#R2V#R#S3_#T#o3_#r#s.|$p$q3_${$|3_%Q%R3_%W%o3_%p&a3_&b#BY3_#BZ$IS3_&/x&Et3_&Gh;'S3_;'S;=`4{?&r?Bj3_?Hw?Ic3_?Ii?JT3_?J`?L{3_~:]Or~~:bOq~~:gO%S~~:lQ%U~!O!P:r!_!`7QP:wQ%RP!O!P:}#Q#R7QP;SP%RP#Q#R7Q~;[^!s~!O!P<W!Q![=f!d!e>T!f!g>o!g!h<r!q!r?T!z!{?i#R#S=}#U#V>T#W#X>o#X#Y<r#]#^=a#c#d?T#l#m?i~<ZP!Q![<^~<cT!s~!Q![<^!g!h<r#R#S<W#X#Y<r#]#^=a~<uR{|=O}!O=O!Q![=U~=RP!Q![=U~=ZQ!s~!Q![=U#]#^=a~=fO!s~~=kU!s~!O!P<W!Q![=f!g!h<r#R#S=}#X#Y<r#]#^=a~>QP!Q![=f~>WR!Q!R>a!R!S>a#R#S>a~>fR!s~!Q!R>a!R!S>a#R#S>a~>rQ!Q![>x#R#S>x~>}Q!s~!Q![>x#R#S>x~?WQ!Q!Y?^#R#S?^~?cQ!s~!Q!Y?^#R#S?^~?lS!Q![?x!c!i?x#R#S?x#T#Z?x~?}S!s~!Q![?x!c!i?x#R#S?x#T#Z?x~@`e%T~qrAq!Q![Dm![!]Et!_!`7Q!c!}By#R#SBy#T#oBy$p$qBy${$|By%Q%RBy%W%oBy%p&aBy&b#BYBy#BZ$ISBy&/x&EtBy&Gh;'SBy;'S;=`Dg?&r?BjBy?Hw?IcBy?Ii?JTBy?J`?L{By~Ata!c!}By#R#SBy#T#oBy$p$qBy${$|By%Q%RBy%W%oBy%p&aBy&b#BYBy#BZ$ISBy&/x&EtBy&Gh;'SBy;'S;=`Dg?&r?BjBy?Hw?IcBy?Ii?JTBy?J`?L{By~COe!w~wxAq}!OAq!Q![By![!]Da!c!}By#R#SBy#T#oBy$p$qBy${$|By%Q%RBy%W%oBy%p&aBy&b#BYBy#BZ$ISBy&/x&EtBy&Gh;'SBy;'S;=`Dg?&r?BjBy?Hw?IcBy?Ii?JTBy?J`?L{By~DdP![!]Aq~DjP;=`<%lBy~DpQ!Q![Dm!^!_Dv~DyT!O!PEY!Q![EY!c!}EY#R#SEY#T#oEY~E]U!O!PEY!Q![EY!`!aEo!c!}EY#R#SEY#T#oEY~EtOp~PEwP![!]EzPE}P!_!`7Q~FVO!R~~F[i&O~qr-hz{.|!O!P-h![!]2V!_!`.|!a!b.|!c!}3_#Q#R2V#R#S3_#T#o3_#r#s.|$p$q3_${$|3_%Q%R3_%W%o3_%p&a3_&b#BY3_#BZ$IS3_&/x&Et3_&Gh;'S3_;'S;=`4{?&r?Bj3_?Hw?Ic3_?Ii?JT3_?J`?L{3_~HOe%|~wxIa}!OIa!Q![Gy![!]Jo!c!}Gy#R#SGy#T#oGy$p$qGy${$|Gy%Q%RGy%W%oGy%p&aGy&b#BYGy#BZ$ISGy&/x&EtGy&Gh;'SGy;'S;=`Ji?&r?BjGy?Hw?IcGy?Ii?JTGy?J`?L{Gy~Ida!c!}Gy#R#SGy#T#oGy$p$qGy${$|Gy%Q%RGy%W%oGy%p&aGy&b#BYGy#BZ$ISGy&/x&EtGy&Gh;'SGy;'S;=`Ji?&r?BjGy?Hw?IcGy?Ii?JTGy?J`?L{Gy~JlP;=`<%lGy~JrP![!]Ia~JzOu~RKPu%RPOqMdqrMirzMdz{Mi{|Mi|}Md}!OMi!O!PMd!P!QMi!Q!^Md!^!_Mi!_!`Mi!`!aMi!a!bMi!b#OMd#O#PMi#P#QMd#Q#RMi#R#pMd#p#qMi#q#rMd#r#sMi#s$qMd$q$rMi$r%RMd%R%SMi%S%oMd%o%pMi%p&aMd&a&bMi&b$IzMd$Iz$I{Mi$I{%&YMd%&Y%+tMi%+t;'SMd;'S;=`N{;=`OMdQMiO!bQRMpc!bQ%RPqr%{z{%{{|%{}!O%{!P!Q%{!^!_%{!_!`%{!`!a%{!a!b%{#O#P%{#Q#R%{#p#q%{#r#s%{$q$r%{%R%S%{%o%p%{&a&b%{$Iz$I{%{%&Y%+t%{Q! QP!bQ;=`<%lMd~! YOt~~! _e%y~wx!!p}!O!!p!Q![! Y![!]!$O!c!}! Y#R#S! Y#T#o! Y$p$q! Y${$|! Y%Q%R! Y%W%o! Y%p&a! Y&b#BY! Y#BZ$IS! Y&/x&Et! Y&Gh;'S! Y;'S;=`!#x?&r?Bj! Y?Hw?Ic! Y?Ii?JT! Y?J`?L{! Y~!!sa!c!}! Y#R#S! Y#T#o! Y$p$q! Y${$|! Y%Q%R! Y%W%o! Y%p&a! Y&b#BY! Y#BZ$IS! Y&/x&Et! Y&Gh;'S! Y;'S;=`!#x?&r?Bj! Y?Hw?Ic! Y?Ii?JT! Y?J`?L{! Y~!#{P;=`<%l! Y~!$RP![!]!!p~!$ZO!P~~!$`O!O~",
|
|
1681
1683
|
tokenizers: [smileyToken, blockComment, podToken, heredocToken, methodDotToken, nameToken, versionToken, regexToken, quoteToken, termToken, 0, 1],
|
|
1682
|
-
topRules: {"Program":[0,30],"Regex":[1,
|
|
1683
|
-
specialized: [{term:
|
|
1684
|
-
tokenPrec:
|
|
1684
|
+
topRules: {"Program":[0,30],"Regex":[1,191],"Heredoc":[2,192],"StringLiteral":[3,193]},
|
|
1685
|
+
specialized: [{term: 225, get: (value) => spec_identifier[value] || -1},{term: 228, get: (value) => spec_capIdentifier[value] || -1}],
|
|
1686
|
+
tokenPrec: 3556
|
|
1685
1687
|
});
|
|
1686
1688
|
|
|
1687
1689
|
// The keywords of the grammar, with the tag each is highlighted with.
|
|
@@ -2388,7 +2390,10 @@ const baseLanguage = LRLanguage.define({
|
|
|
2388
2390
|
// A heredoc starts with the line break before its first line.
|
|
2389
2391
|
Heredoc(tree) { return { from: tree.from, to: tree.to }; }
|
|
2390
2392
|
}),
|
|
2391
|
-
styleTags(Object.assign(Object.assign({}, keywordTags), { "True False": tags.bool, Nil: tags.null, Identifier: tags.function(tags.variableName), TypeName: tags.typeName, PackageName: tags.definition(tags.className), "EnumName SubsetName": tags.definition(tags.typeName), ConstantName: tags.definition(tags.constant(tags.variableName)), "RoutineName RegexName": tags.function(tags.definition(tags.variableName)), MethodName: tags.function(tags.propertyName), VariableName: tags.variableName, AttributeName: tags.propertyName, SpecialVariable: tags.special(tags.variableName), PairKey: tags.attributeName, Number: tags.number, Version: tags.literal,
|
|
2393
|
+
styleTags(Object.assign(Object.assign({}, keywordTags), { "True False": tags.bool, Nil: tags.null, Identifier: tags.function(tags.variableName), TypeName: tags.typeName, PackageName: tags.definition(tags.className), "EnumName SubsetName": tags.definition(tags.typeName), ConstantName: tags.definition(tags.constant(tags.variableName)), "RoutineName RegexName": tags.function(tags.definition(tags.variableName)), MethodName: tags.function(tags.propertyName), VariableName: tags.variableName, AttributeName: tags.propertyName, SpecialVariable: tags.special(tags.variableName), PairKey: tags.attributeName, Number: tags.number, Version: tags.literal,
|
|
2394
|
+
// A pair of delimiters in a quote is text of it, and a tag
|
|
2395
|
+
// does not reach the text in a child node.
|
|
2396
|
+
"StringLiteral Heredoc NestedDelimiters": tags.string, Regex: tags.regexp, CharacterClass: tags.character, Assertion: tags.function(tags.variableName), "Pod PodFormat": tags.docComment, PodDirective: tags.meta,
|
|
2392
2397
|
// These are still part of a comment, and are styled as one where
|
|
2393
2398
|
// a theme has no style for the second tag.
|
|
2394
2399
|
PodHeading: [tags.docComment, tags.heading], PodStrong: [tags.docComment, tags.strong], PodEmphasis: [tags.docComment, tags.emphasis], PodCode: [tags.docComment, tags.monospace], PodLink: [tags.docComment, tags.link], Escape: tags.escape, "Interpolation/{ Interpolation/}": tags.special(tags.brace), LineComment: tags.lineComment, BlockComment: tags.blockComment, DocComment: tags.docComment, Operator: tags.operator, ".": tags.derefOperator, ", ;": tags.separator, ":": tags.punctuation, "( )": tags.paren, "[ ]": tags.squareBracket, "{ }": tags.brace }))
|