@bablr/language-en-spamex 0.4.2 → 0.5.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/lib/grammar.js CHANGED
@@ -1,6 +1,6 @@
1
1
  /* @macrome
2
2
  * @generatedby @bablr/macrome-generator-bablr
3
- * @generatedfrom ./grammar.macro.js#6b39cdf5f891cd30ee8febf0552c121fa76a3c6a
3
+ * @generatedfrom ./grammar.macro.js#947c1c880e407496daeaf713698fdd425fcfa3dd
4
4
  * This file is autogenerated. Please do not edit it directly.
5
5
  * When editing run `npx macrome watch` then change the file this is generated from.
6
6
  */
@@ -8,12 +8,13 @@ import _applyDecs from "@babel/runtime/helpers/applyDecs2305";
8
8
  import { interpolateArray as _interpolateArray, interpolateArrayChildren as _interpolateArrayChildren, interpolateString as _interpolateString } from "@bablr/agast-helpers/template";
9
9
  import * as _l from "@bablr/agast-vm-helpers/languages";
10
10
  import * as _t from "@bablr/agast-helpers/shorthand";
11
- let _initProto, _MatcherDecs, _NodeMatcherDecs, _BooleanAttributeDecs, _MappingAttributeDecs, _StringMatcherDecs, _StringDecs, _RegexDecs, _ListDecs, _PunctuatorDecs, _AnyDecs;
11
+ let _initProto, _MatcherDecs, _NodeMatcherDecs, _CloseNodeMatcherDecs, _BooleanAttributeDecs, _MappingAttributeDecs, _StringMatcherDecs, _StringDecs, _RegexDecs, _ListDecs, _PunctuatorDecs, _AnyDecs;
12
12
  import { Node, CoveredBy, InjectFrom } from '@bablr/helpers/decorators';
13
13
  import * as productions from '@bablr/helpers/productions';
14
14
  import * as Regex from '@bablr/language-en-regex-vm-pattern';
15
15
  import * as CSTML from '@bablr/language-en-cstml';
16
16
  import * as Space from '@bablr/language-en-blank-space';
17
+ import { notNull } from '@bablr/agast-helpers/tree';
17
18
  export const canonicalURL = 'https://bablr.org/languages/core/en/spamex';
18
19
  export const dependencies = {
19
20
  Regex,
@@ -25,67 +26,101 @@ const {
25
26
  } = CSTML;
26
27
  export const grammar = class SpamexGrammar {
27
28
  static {
28
- [_initProto] = _applyDecs(this, [[_MatcherDecs, 2, "Matcher"], [_NodeMatcherDecs, 2, "NodeMatcher"], [_BooleanAttributeDecs, 2, "BooleanAttribute"], [_MappingAttributeDecs, 2, "MappingAttribute"], [_StringMatcherDecs, 2, "StringMatcher"], [_StringDecs, 2, "String"], [_RegexDecs, 2, "Regex"], [_ListDecs, 2, "List"], [_PunctuatorDecs, 2, "Punctuator"], [_AnyDecs, 2, "Any"]], []).e;
29
+ [_initProto] = _applyDecs(this, [[Node, 2, "Pattern"], [_MatcherDecs, 2, "Matcher"], [_NodeMatcherDecs, 2, "NodeMatcher"], [Node, 2, "OpenNodeMatcher"], [_CloseNodeMatcherDecs, 2, "CloseNodeMatcher"], [_BooleanAttributeDecs, 2, "BooleanAttribute"], [_MappingAttributeDecs, 2, "MappingAttribute"], [_StringMatcherDecs, 2, "StringMatcher"], [_StringDecs, 2, "String"], [_RegexDecs, 2, "Regex"], [_ListDecs, 2, "List"], [_PunctuatorDecs, 2, "Punctuator"], [_AnyDecs, 2, "Any"]], []).e;
29
30
  }
30
31
  constructor() {
31
32
  _initProto(this);
32
33
  }
33
- *[(_MatcherDecs = CoveredBy('Expression'), _NodeMatcherDecs = [CoveredBy('Matcher'), CoveredBy('Expression'), Node], _BooleanAttributeDecs = [CoveredBy('Attribute'), Node], _MappingAttributeDecs = [CoveredBy('Attribute'), Node], _StringMatcherDecs = [CoveredBy('Matcher'), CoveredBy('Expression')], _StringDecs = [CoveredBy('StringMatcher'), CoveredBy('Matcher'), CoveredBy('Expression'), Node], _RegexDecs = [CoveredBy('StringMatcher'), CoveredBy('Matcher'), CoveredBy('Expression'), Node], _ListDecs = InjectFrom(productions), _PunctuatorDecs = [Node, InjectFrom(productions)], _AnyDecs = InjectFrom(productions), "Matcher")]() {
34
+ *[(_MatcherDecs = CoveredBy('Expression'), _NodeMatcherDecs = [Node, CoveredBy('Matcher')], _CloseNodeMatcherDecs = [Node, CoveredBy('Matcher')], _BooleanAttributeDecs = [CoveredBy('Attribute'), Node], _MappingAttributeDecs = [CoveredBy('Attribute'), Node], _StringMatcherDecs = [CoveredBy('Matcher'), CoveredBy('Expression')], _StringDecs = [CoveredBy('StringMatcher'), CoveredBy('Matcher'), CoveredBy('Expression'), Node], _RegexDecs = [CoveredBy('StringMatcher'), CoveredBy('Matcher'), CoveredBy('Expression'), Node], _ListDecs = InjectFrom(productions), _PunctuatorDecs = [Node, InjectFrom(productions)], _AnyDecs = InjectFrom(productions), "Pattern")]() {
34
35
  yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
35
36
  verb: _t.s_node(_l.Instruction, "Identifier", "eat"),
36
- arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
37
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
37
38
  openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
38
- values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`type`, _t.ref`closeToken`], {
39
- openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
40
- flags: _t.node(_l.CSTML, "Flags", [], {}, {}),
41
- type: _t.s_node(_l.Spamex, "Identifier", "Any"),
42
- closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
43
- }, {}), _t.node(_l.Instruction, "Null", [_t.ref`sigilToken`], {
44
- sigilToken: _t.s_i_node(_l.Instruction, "Keyword", "null")
45
- }, {}), _t.node(_l.Instruction, "Array", [_t.ref`openToken`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit("\n ")], {}, {})), _t.ref`elements[]`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit("\n ")], {}, {})), _t.ref`elements[]`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit("\n ")], {}, {})), _t.ref`elements[]`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit("\n ")], {}, {})), _t.ref`closeToken`], {
46
- openToken: _t.s_i_node(_l.Instruction, "Punctuator", "["),
47
- elements: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`type`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit(" ")], {}, {})), _t.ref`intrinsicValue`, _t.ref`closeToken`], {
39
+ values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`open`], {
40
+ open: _t.node(_l.Spamex, "OpenNodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`type`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`selfClosingTagToken`, _t.ref`closeToken`], {
48
41
  openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
49
42
  flags: _t.node(_l.CSTML, "Flags", [], {}, {}),
50
- type: _t.s_node(_l.Spamex, "Identifier", "NodeMatcher"),
51
- intrinsicValue: _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
52
- openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
53
- content: _t.node(_l.CSTML, "Content", [_t.lit("<")], {}, {}),
54
- closeToken: _t.s_i_node(_l.CSTML, "Punctuator", "'")
55
- }, {}),
56
- closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
57
- }, {}), _t.node(_l.Spamex, "NodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`language`, _t.ref`namespaceSeparatorToken`, _t.ref`type`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit(" ")], {}, {})), _t.ref`intrinsicValue`, _t.ref`closeToken`], {
58
- openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
59
- flags: _t.node(_l.CSTML, "Flags", [], {}, {}),
60
- language: _t.s_node(_l.Spamex, "Identifier", "CSTML"),
61
- namespaceSeparatorToken: _t.s_i_node(_l.Spamex, "Punctuator", ":"),
62
- type: _t.s_node(_l.Spamex, "Identifier", "String"),
63
- intrinsicValue: _t.node(_l.Regex, "Pattern", [_t.ref`openToken`, _t.ref`alternatives[]`, _t.ref`closeToken`], {
64
- openToken: _t.s_i_node(_l.Regex, "Punctuator", "/"),
65
- alternatives: [_t.node(_l.Regex, "Alternative", [_t.ref`elements[]`], {
66
- elements: [_t.node(_l.Regex, "CharacterClass", [_t.ref`openToken`, _t.ref`elements[]`, _t.ref`elements[]`, _t.ref`closeToken`], {
67
- openToken: _t.s_i_node(_l.Regex, "Punctuator", "["),
68
- elements: [_t.node(_l.Regex, "Character", [_t.lit("'")], {}, {}), _t.node(_l.Regex, "Character", [_t.lit("\"")], {}, {})],
69
- closeToken: _t.s_i_node(_l.Regex, "Punctuator", "]")
70
- }, {
71
- negate: false
72
- })]
73
- }, {})],
74
- closeToken: _t.s_i_node(_l.Regex, "Punctuator", "/")
75
- }, {}),
43
+ type: _t.s_node(_l.Spamex, "Identifier", "Matcher"),
44
+ selfClosingTagToken: _t.s_i_node(_l.Spamex, "Punctuator", "/"),
76
45
  closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
77
- }, {}), _t.node(_l.Spamex, "NodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`language`, _t.ref`namespaceSeparatorToken`, _t.ref`type`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit(" ")], {}, {})), _t.ref`intrinsicValue`, _t.ref`closeToken`], {
46
+ }, {})
47
+ }, {}), _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
48
+ openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
49
+ content: _t.node(_l.CSTML, "Content", [_t.lit("matcher")], {}, {}),
50
+ closeToken: _t.s_i_node(_l.CSTML, "Punctuator", "'")
51
+ }, {})],
52
+ closeToken: _t.s_i_node(_l.Instruction, "Punctuator", ")")
53
+ }, {})
54
+ }, {});
55
+ }
56
+ *Matcher() {
57
+ yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
58
+ verb: _t.s_node(_l.Instruction, "Identifier", "eat"),
59
+ arguments: _t.node(_l.Instruction, "Tuple", [9, [[_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`], [_t.embedded(_t.node(_l.Instruction, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`]]], {
60
+ openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
61
+ values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`open`], {
62
+ open: _t.node(_l.Spamex, "OpenNodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`type`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`selfClosingTagToken`, _t.ref`closeToken`], {
78
63
  openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
79
64
  flags: _t.node(_l.CSTML, "Flags", [], {}, {}),
80
- language: _t.s_node(_l.Spamex, "Identifier", "Regex"),
81
- namespaceSeparatorToken: _t.s_i_node(_l.Spamex, "Punctuator", ":"),
82
- type: _t.s_node(_l.Spamex, "Identifier", "Pattern"),
83
- intrinsicValue: _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
84
- openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
85
- content: _t.node(_l.CSTML, "Content", [_t.lit("/")], {}, {}),
86
- closeToken: _t.s_i_node(_l.CSTML, "Punctuator", "'")
87
- }, {}),
65
+ type: _t.s_node(_l.Spamex, "Identifier", "Any"),
66
+ selfClosingTagToken: _t.s_i_node(_l.Spamex, "Punctuator", "/"),
88
67
  closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
68
+ }, {})
69
+ }, {}), _t.node(_l.Instruction, "Null", [_t.ref`sigilToken`], {
70
+ sigilToken: _t.s_i_node(_l.Instruction, "Keyword", "null")
71
+ }, {}), _t.node(_l.Instruction, "Array", [11, [[_t.ref`openToken`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit("\n ")], {}, {})), _t.ref`elements[]`, _t.arr()], [_t.ref`elements[]`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit("\n ")], {}, {})), _t.ref`elements[]`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit("\n ")], {}, {})), _t.ref`elements[]`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit("\n ")], {}, {})), _t.ref`closeToken`]]], {
72
+ openToken: _t.s_i_node(_l.Instruction, "Punctuator", "["),
73
+ elements: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`open`], {
74
+ open: _t.node(_l.Spamex, "OpenNodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`type`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`intrinsicValue`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`selfClosingTagToken`, _t.ref`closeToken`], {
75
+ openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
76
+ flags: _t.node(_l.CSTML, "Flags", [], {}, {}),
77
+ type: _t.s_node(_l.Spamex, "Identifier", "NodeMatcher"),
78
+ intrinsicValue: _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
79
+ openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
80
+ content: _t.node(_l.CSTML, "Content", [_t.lit("<")], {}, {}),
81
+ closeToken: _t.s_i_node(_l.CSTML, "Punctuator", "'")
82
+ }, {}),
83
+ selfClosingTagToken: _t.s_i_node(_l.Spamex, "Punctuator", "/"),
84
+ closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
85
+ }, {})
86
+ }, {}), _t.node(_l.Spamex, "NodeMatcher", [_t.ref`open`], {
87
+ open: _t.node(_l.Spamex, "OpenNodeMatcher", [10, [[_t.ref`openToken`, _t.ref`flags`, _t.ref`language`, _t.ref`namespaceSeparatorToken`], [_t.ref`type`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`intrinsicValue`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`selfClosingTagToken`, _t.ref`closeToken`]]], {
88
+ openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
89
+ flags: _t.node(_l.CSTML, "Flags", [], {}, {}),
90
+ language: _t.s_node(_l.Spamex, "Identifier", "CSTML"),
91
+ namespaceSeparatorToken: _t.s_i_node(_l.Spamex, "Punctuator", ":"),
92
+ type: _t.s_node(_l.Spamex, "Identifier", "String"),
93
+ intrinsicValue: _t.node(_l.Regex, "Pattern", [_t.ref`openToken`, _t.ref`alternatives[]`, _t.arr(), _t.ref`alternatives[]`, _t.ref`closeToken`], {
94
+ openToken: _t.s_i_node(_l.Regex, "Punctuator", "/"),
95
+ alternatives: [_t.node(_l.Regex, "Alternative", [_t.ref`elements[]`, _t.arr(), _t.ref`elements[]`], {
96
+ elements: [_t.node(_l.Regex, "CharacterClass", [_t.ref`openToken`, _t.ref`elements[]`, _t.arr(), _t.ref`elements[]`, _t.ref`elements[]`, _t.ref`closeToken`], {
97
+ openToken: _t.s_i_node(_l.Regex, "Punctuator", "["),
98
+ elements: [_t.node(_l.Regex, "Character", [_t.lit("'")], {}, {}), _t.node(_l.Regex, "Character", [_t.lit("\"")], {}, {})],
99
+ closeToken: _t.s_i_node(_l.Regex, "Punctuator", "]")
100
+ }, {
101
+ negate: false
102
+ })]
103
+ }, {})],
104
+ closeToken: _t.s_i_node(_l.Regex, "Punctuator", "/")
105
+ }, {}),
106
+ selfClosingTagToken: _t.s_i_node(_l.Spamex, "Punctuator", "/"),
107
+ closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
108
+ }, {})
109
+ }, {}), _t.node(_l.Spamex, "NodeMatcher", [_t.ref`open`], {
110
+ open: _t.node(_l.Spamex, "OpenNodeMatcher", [10, [[_t.ref`openToken`, _t.ref`flags`, _t.ref`language`, _t.ref`namespaceSeparatorToken`], [_t.ref`type`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`intrinsicValue`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`selfClosingTagToken`, _t.ref`closeToken`]]], {
111
+ openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
112
+ flags: _t.node(_l.CSTML, "Flags", [], {}, {}),
113
+ language: _t.s_node(_l.Spamex, "Identifier", "Regex"),
114
+ namespaceSeparatorToken: _t.s_i_node(_l.Spamex, "Punctuator", ":"),
115
+ type: _t.s_node(_l.Spamex, "Identifier", "Pattern"),
116
+ intrinsicValue: _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
117
+ openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
118
+ content: _t.node(_l.CSTML, "Content", [_t.lit("/")], {}, {}),
119
+ closeToken: _t.s_i_node(_l.CSTML, "Punctuator", "'")
120
+ }, {}),
121
+ selfClosingTagToken: _t.s_i_node(_l.Spamex, "Punctuator", "/"),
122
+ closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
123
+ }, {})
89
124
  }, {})],
90
125
  closeToken: _t.s_i_node(_l.Instruction, "Punctuator", "]")
91
126
  }, {})],
@@ -94,40 +129,127 @@ export const grammar = class SpamexGrammar {
94
129
  }, {});
95
130
  }
96
131
  *NodeMatcher() {
97
- yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
132
+ let open = yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
98
133
  verb: _t.s_node(_l.Instruction, "Identifier", "eat"),
99
- arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
134
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
100
135
  openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
101
- values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`type`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit(" ")], {}, {})), _t.ref`intrinsicValue`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit(" ")], {}, {})), _t.ref`attributes[]`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit(" ")], {}, {})), _t.ref`attributes[]`, _t.ref`closeToken`], {
102
- openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
103
- flags: _t.node(_l.CSTML, "Flags", [_t.ref`intrinsicToken`, _t.ref`tokenToken`], {
104
- intrinsicToken: _t.s_i_node(_l.CSTML, "Punctuator", "~"),
105
- tokenToken: _t.s_i_node(_l.CSTML, "Punctuator", "*")
106
- }, {}),
107
- type: _t.s_node(_l.Spamex, "Identifier", "Punctuator"),
108
- intrinsicValue: _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
136
+ values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`open`], {
137
+ open: _t.node(_l.Spamex, "OpenNodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`type`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`selfClosingTagToken`, _t.ref`closeToken`], {
138
+ openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
139
+ flags: _t.node(_l.CSTML, "Flags", [], {}, {}),
140
+ type: _t.s_node(_l.Spamex, "Identifier", "OpenNodeMatcher"),
141
+ selfClosingTagToken: _t.s_i_node(_l.Spamex, "Punctuator", "/"),
142
+ closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
143
+ }, {})
144
+ }, {}), _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
145
+ openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
146
+ content: _t.node(_l.CSTML, "Content", [_t.lit("open")], {}, {}),
147
+ closeToken: _t.s_i_node(_l.CSTML, "Punctuator", "'")
148
+ }, {})],
149
+ closeToken: _t.s_i_node(_l.Instruction, "Punctuator", ")")
150
+ }, {})
151
+ }, {});
152
+
153
+ // Problem: not handling gaps
154
+ // gaps have a non-nullish representation
155
+ //
156
+ const {
157
+ selfClosingTagToken
158
+ } = open.properties;
159
+ const selfClosing = notNull(selfClosingTagToken);
160
+ if (selfClosing) {
161
+ yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
162
+ verb: _t.s_node(_l.Instruction, "Identifier", "eat"),
163
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
164
+ openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
165
+ values: [_t.node(_l.Instruction, "Array", [_t.ref`openToken`, _t.ref`closeToken`], {
166
+ openToken: _t.s_i_node(_l.Instruction, "Punctuator", "["),
167
+ closeToken: _t.s_i_node(_l.Instruction, "Punctuator", "]")
168
+ }, {}), _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
109
169
  openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
110
- content: _t.node(_l.CSTML, "Content", [_t.lit("<")], {}, {}),
170
+ content: _t.node(_l.CSTML, "Content", [_t.lit("children[]")], {}, {}),
111
171
  closeToken: _t.s_i_node(_l.CSTML, "Punctuator", "'")
112
- }, {}),
113
- attributes: [_t.node(_l.Spamex, "MappingAttribute", [_t.ref`key`, _t.ref`mapToken`, _t.ref`value`], {
114
- key: _t.node(_l.Spamex, "Literal", [_t.lit("balancedSpan")], {}, {}),
115
- mapToken: _t.s_i_node(_l.Spamex, "Punctuator", "="),
116
- value: _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
117
- openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
118
- content: _t.node(_l.CSTML, "Content", [_t.lit("Tag")], {}, {}),
119
- closeToken: _t.s_i_node(_l.CSTML, "Punctuator", "'")
172
+ }, {})],
173
+ closeToken: _t.s_i_node(_l.Instruction, "Punctuator", ")")
174
+ }, {})
175
+ }, {});
176
+ yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
177
+ verb: _t.s_node(_l.Instruction, "Identifier", "eat"),
178
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
179
+ openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
180
+ values: [_t.node(_l.Instruction, "Null", [_t.ref`sigilToken`], {
181
+ sigilToken: _t.s_i_node(_l.Instruction, "Keyword", "null")
182
+ }, {}), _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
183
+ openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
184
+ content: _t.node(_l.CSTML, "Content", [_t.lit("close")], {}, {}),
185
+ closeToken: _t.s_i_node(_l.CSTML, "Punctuator", "'")
186
+ }, {})],
187
+ closeToken: _t.s_i_node(_l.Instruction, "Punctuator", ")")
188
+ }, {})
189
+ }, {});
190
+ } else {
191
+ // TODO
192
+ yield* eatMatchTrivia();
193
+ yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
194
+ verb: _t.s_node(_l.Instruction, "Identifier", "eat"),
195
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
196
+ openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
197
+ values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`open`], {
198
+ open: _t.node(_l.Spamex, "OpenNodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`type`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`selfClosingTagToken`, _t.ref`closeToken`], {
199
+ openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
200
+ flags: _t.node(_l.CSTML, "Flags", [], {}, {}),
201
+ type: _t.s_node(_l.Spamex, "Identifier", "CloseNodeMatcher"),
202
+ selfClosingTagToken: _t.s_i_node(_l.Spamex, "Punctuator", "/"),
203
+ closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
120
204
  }, {})
121
- }, {}), _t.node(_l.Spamex, "MappingAttribute", [_t.ref`key`, _t.ref`mapToken`, _t.ref`value`], {
122
- key: _t.node(_l.Spamex, "Literal", [_t.lit("balanced")], {}, {}),
123
- mapToken: _t.s_i_node(_l.Spamex, "Punctuator", "="),
124
- value: _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
205
+ }, {}), _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
206
+ openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
207
+ content: _t.node(_l.CSTML, "Content", [_t.lit("close")], {}, {}),
208
+ closeToken: _t.s_i_node(_l.CSTML, "Punctuator", "'")
209
+ }, {})],
210
+ closeToken: _t.s_i_node(_l.Instruction, "Punctuator", ")")
211
+ }, {})
212
+ }, {});
213
+ }
214
+ }
215
+ *OpenNodeMatcher() {
216
+ yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
217
+ verb: _t.s_node(_l.Instruction, "Identifier", "eat"),
218
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
219
+ openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
220
+ values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`open`], {
221
+ open: _t.node(_l.Spamex, "OpenNodeMatcher", [14, [[_t.ref`openToken`, _t.ref`flags`, _t.ref`type`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {}))], [_t.ref`intrinsicValue`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`attributes[]`, _t.arr()], [_t.ref`attributes[]`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`attributes[]`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`selfClosingTagToken`, _t.ref`closeToken`]]], {
222
+ openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
223
+ flags: _t.node(_l.CSTML, "Flags", [_t.ref`intrinsicToken`, _t.ref`tokenToken`], {
224
+ intrinsicToken: _t.s_i_node(_l.CSTML, "Punctuator", "~"),
225
+ tokenToken: _t.s_i_node(_l.CSTML, "Punctuator", "*")
226
+ }, {}),
227
+ type: _t.s_node(_l.Spamex, "Identifier", "Punctuator"),
228
+ intrinsicValue: _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
125
229
  openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
126
- content: _t.node(_l.CSTML, "Content", [_t.lit(">")], {}, {}),
230
+ content: _t.node(_l.CSTML, "Content", [_t.lit("<")], {}, {}),
127
231
  closeToken: _t.s_i_node(_l.CSTML, "Punctuator", "'")
128
- }, {})
129
- }, {})],
130
- closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
232
+ }, {}),
233
+ attributes: [_t.node(_l.Spamex, "MappingAttribute", [_t.ref`key`, _t.ref`mapToken`, _t.ref`value`], {
234
+ key: _t.s_node(_l.Spamex, "Identifier", "balancedSpan"),
235
+ mapToken: _t.s_i_node(_l.Spamex, "Punctuator", "="),
236
+ value: _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
237
+ openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
238
+ content: _t.node(_l.CSTML, "Content", [_t.lit("Tag")], {}, {}),
239
+ closeToken: _t.s_i_node(_l.CSTML, "Punctuator", "'")
240
+ }, {})
241
+ }, {}), _t.node(_l.Spamex, "MappingAttribute", [_t.ref`key`, _t.ref`mapToken`, _t.ref`value`], {
242
+ key: _t.s_node(_l.Spamex, "Identifier", "balanced"),
243
+ mapToken: _t.s_i_node(_l.Spamex, "Punctuator", "="),
244
+ value: _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
245
+ openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
246
+ content: _t.node(_l.CSTML, "Content", [_t.lit(">")], {}, {}),
247
+ closeToken: _t.s_i_node(_l.CSTML, "Punctuator", "'")
248
+ }, {})
249
+ }, {})],
250
+ selfClosingTagToken: _t.s_i_node(_l.Spamex, "Punctuator", "/"),
251
+ closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
252
+ }, {})
131
253
  }, {}), _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
132
254
  openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
133
255
  content: _t.node(_l.CSTML, "Content", [_t.lit("open")], {}, {}),
@@ -138,28 +260,35 @@ export const grammar = class SpamexGrammar {
138
260
  }, {});
139
261
  yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
140
262
  verb: _t.s_node(_l.Instruction, "Identifier", "eat"),
141
- arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.ref`closeToken`], {
263
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
142
264
  openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
143
- values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`language`, _t.ref`namespaceSeparatorToken`, _t.ref`type`, _t.ref`closeToken`], {
144
- openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
145
- flags: _t.node(_l.CSTML, "Flags", [], {}, {}),
146
- language: _t.s_node(_l.Spamex, "Identifier", "CSTML"),
147
- namespaceSeparatorToken: _t.s_i_node(_l.Spamex, "Punctuator", ":"),
148
- type: _t.s_node(_l.Spamex, "Identifier", "Flags"),
149
- closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
265
+ values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`open`], {
266
+ open: _t.node(_l.Spamex, "OpenNodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`language`, _t.ref`namespaceSeparatorToken`, _t.ref`type`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`selfClosingTagToken`, _t.ref`closeToken`], {
267
+ openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
268
+ flags: _t.node(_l.CSTML, "Flags", [], {}, {}),
269
+ language: _t.s_node(_l.Spamex, "Identifier", "CSTML"),
270
+ namespaceSeparatorToken: _t.s_i_node(_l.Spamex, "Punctuator", ":"),
271
+ type: _t.s_node(_l.Spamex, "Identifier", "Flags"),
272
+ selfClosingTagToken: _t.s_i_node(_l.Spamex, "Punctuator", "/"),
273
+ closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
274
+ }, {})
275
+ }, {}), _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
276
+ openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
277
+ content: _t.node(_l.CSTML, "Content", [_t.lit("flags")], {}, {}),
278
+ closeToken: _t.s_i_node(_l.CSTML, "Punctuator", "'")
150
279
  }, {})],
151
280
  closeToken: _t.s_i_node(_l.Instruction, "Punctuator", ")")
152
281
  }, {})
153
282
  }, {});
154
283
  if (yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
155
284
  verb: _t.s_node(_l.Instruction, "Identifier", "match"),
156
- arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.ref`closeToken`], {
285
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.ref`closeToken`], {
157
286
  openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
158
- values: [_t.node(_l.Regex, "Pattern", [_t.ref`openToken`, _t.ref`alternatives[]`, _t.ref`closeToken`], {
287
+ values: [_t.node(_l.Regex, "Pattern", [_t.ref`openToken`, _t.ref`alternatives[]`, _t.arr(), _t.ref`alternatives[]`, _t.ref`closeToken`], {
159
288
  openToken: _t.s_i_node(_l.Regex, "Punctuator", "/"),
160
- alternatives: [_t.node(_l.Regex, "Alternative", [_t.ref`elements[]`, _t.ref`elements[]`], {
289
+ alternatives: [_t.node(_l.Regex, "Alternative", [_t.ref`elements[]`, _t.arr(), _t.ref`elements[]`, _t.ref`elements[]`], {
161
290
  elements: [_t.node(_l.Regex, "Quantifier", [_t.ref`element`, _t.ref`value`], {
162
- element: _t.node(_l.Regex, "CharacterClass", [_t.ref`openToken`, _t.ref`elements[]`, _t.ref`elements[]`, _t.ref`closeToken`], {
291
+ element: _t.node(_l.Regex, "CharacterClass", [_t.ref`openToken`, _t.ref`elements[]`, _t.arr(), _t.ref`elements[]`, _t.ref`elements[]`, _t.ref`closeToken`], {
163
292
  openToken: _t.s_i_node(_l.Regex, "Punctuator", "["),
164
293
  elements: [_t.node(_l.Regex, "CharacterClassRange", [_t.ref`min`, _t.ref`rangeToken`, _t.ref`max`], {
165
294
  min: _t.node(_l.Regex, "Character", [_t.lit("a")], {}, {}),
@@ -188,17 +317,20 @@ export const grammar = class SpamexGrammar {
188
317
  }, {})) {
189
318
  yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
190
319
  verb: _t.s_node(_l.Instruction, "Identifier", "eat"),
191
- arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
320
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
192
321
  openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
193
- values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`language`, _t.ref`namespaceSeparatorToken`, _t.ref`type`, _t.ref`closeToken`], {
194
- openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
195
- flags: _t.node(_l.CSTML, "Flags", [_t.ref`tokenToken`], {
196
- tokenToken: _t.s_i_node(_l.CSTML, "Punctuator", "*")
197
- }, {}),
198
- language: _t.s_node(_l.Spamex, "Identifier", "CSTML"),
199
- namespaceSeparatorToken: _t.s_i_node(_l.Spamex, "Punctuator", ":"),
200
- type: _t.s_node(_l.Spamex, "Identifier", "Identifier"),
201
- closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
322
+ values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`open`], {
323
+ open: _t.node(_l.Spamex, "OpenNodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`language`, _t.ref`namespaceSeparatorToken`, _t.ref`type`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`selfClosingTagToken`, _t.ref`closeToken`], {
324
+ openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
325
+ flags: _t.node(_l.CSTML, "Flags", [_t.ref`tokenToken`], {
326
+ tokenToken: _t.s_i_node(_l.CSTML, "Punctuator", "*")
327
+ }, {}),
328
+ language: _t.s_node(_l.Spamex, "Identifier", "CSTML"),
329
+ namespaceSeparatorToken: _t.s_i_node(_l.Spamex, "Punctuator", ":"),
330
+ type: _t.s_node(_l.Spamex, "Identifier", "Identifier"),
331
+ selfClosingTagToken: _t.s_i_node(_l.Spamex, "Punctuator", "/"),
332
+ closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
333
+ }, {})
202
334
  }, {}), _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
203
335
  openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
204
336
  content: _t.node(_l.CSTML, "Content", [_t.lit("language")], {}, {}),
@@ -209,21 +341,24 @@ export const grammar = class SpamexGrammar {
209
341
  }, {});
210
342
  yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
211
343
  verb: _t.s_node(_l.Instruction, "Identifier", "eat"),
212
- arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
344
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
213
345
  openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
214
- values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`type`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit(" ")], {}, {})), _t.ref`intrinsicValue`, _t.ref`closeToken`], {
215
- openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
216
- flags: _t.node(_l.CSTML, "Flags", [_t.ref`intrinsicToken`, _t.ref`tokenToken`], {
217
- intrinsicToken: _t.s_i_node(_l.CSTML, "Punctuator", "~"),
218
- tokenToken: _t.s_i_node(_l.CSTML, "Punctuator", "*")
219
- }, {}),
220
- type: _t.s_node(_l.Spamex, "Identifier", "Punctuator"),
221
- intrinsicValue: _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
222
- openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
223
- content: _t.node(_l.CSTML, "Content", [_t.lit(":")], {}, {}),
224
- closeToken: _t.s_i_node(_l.CSTML, "Punctuator", "'")
225
- }, {}),
226
- closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
346
+ values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`open`], {
347
+ open: _t.node(_l.Spamex, "OpenNodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`type`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`intrinsicValue`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`selfClosingTagToken`, _t.ref`closeToken`], {
348
+ openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
349
+ flags: _t.node(_l.CSTML, "Flags", [_t.ref`intrinsicToken`, _t.ref`tokenToken`], {
350
+ intrinsicToken: _t.s_i_node(_l.CSTML, "Punctuator", "~"),
351
+ tokenToken: _t.s_i_node(_l.CSTML, "Punctuator", "*")
352
+ }, {}),
353
+ type: _t.s_node(_l.Spamex, "Identifier", "Punctuator"),
354
+ intrinsicValue: _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
355
+ openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
356
+ content: _t.node(_l.CSTML, "Content", [_t.lit(":")], {}, {}),
357
+ closeToken: _t.s_i_node(_l.CSTML, "Punctuator", "'")
358
+ }, {}),
359
+ selfClosingTagToken: _t.s_i_node(_l.Spamex, "Punctuator", "/"),
360
+ closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
361
+ }, {})
227
362
  }, {}), _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
228
363
  openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
229
364
  content: _t.node(_l.CSTML, "Content", [_t.lit("namespaceOperator")], {}, {}),
@@ -234,17 +369,20 @@ export const grammar = class SpamexGrammar {
234
369
  }, {});
235
370
  yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
236
371
  verb: _t.s_node(_l.Instruction, "Identifier", "eat"),
237
- arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
372
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
238
373
  openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
239
- values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`language`, _t.ref`namespaceSeparatorToken`, _t.ref`type`, _t.ref`closeToken`], {
240
- openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
241
- flags: _t.node(_l.CSTML, "Flags", [_t.ref`tokenToken`], {
242
- tokenToken: _t.s_i_node(_l.CSTML, "Punctuator", "*")
243
- }, {}),
244
- language: _t.s_node(_l.Spamex, "Identifier", "CSTML"),
245
- namespaceSeparatorToken: _t.s_i_node(_l.Spamex, "Punctuator", ":"),
246
- type: _t.s_node(_l.Spamex, "Identifier", "Identifier"),
247
- closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
374
+ values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`open`], {
375
+ open: _t.node(_l.Spamex, "OpenNodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`language`, _t.ref`namespaceSeparatorToken`, _t.ref`type`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`selfClosingTagToken`, _t.ref`closeToken`], {
376
+ openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
377
+ flags: _t.node(_l.CSTML, "Flags", [_t.ref`tokenToken`], {
378
+ tokenToken: _t.s_i_node(_l.CSTML, "Punctuator", "*")
379
+ }, {}),
380
+ language: _t.s_node(_l.Spamex, "Identifier", "CSTML"),
381
+ namespaceSeparatorToken: _t.s_i_node(_l.Spamex, "Punctuator", ":"),
382
+ type: _t.s_node(_l.Spamex, "Identifier", "Identifier"),
383
+ selfClosingTagToken: _t.s_i_node(_l.Spamex, "Punctuator", "/"),
384
+ closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
385
+ }, {})
248
386
  }, {}), _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
249
387
  openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
250
388
  content: _t.node(_l.CSTML, "Content", [_t.lit("type")], {}, {}),
@@ -253,10 +391,37 @@ export const grammar = class SpamexGrammar {
253
391
  closeToken: _t.s_i_node(_l.Instruction, "Punctuator", ")")
254
392
  }, {})
255
393
  }, {});
256
- } else {
394
+ } else if (yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
395
+ verb: _t.s_node(_l.Instruction, "Identifier", "match"),
396
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.ref`closeToken`], {
397
+ openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
398
+ values: [_t.node(_l.Regex, "Pattern", [_t.ref`openToken`, _t.ref`alternatives[]`, _t.arr(), _t.ref`alternatives[]`, _t.ref`closeToken`], {
399
+ openToken: _t.s_i_node(_l.Regex, "Punctuator", "/"),
400
+ alternatives: [_t.node(_l.Regex, "Alternative", [_t.ref`elements[]`, _t.arr(), _t.ref`elements[]`], {
401
+ elements: [_t.node(_l.Regex, "CharacterClass", [_t.ref`openToken`, _t.ref`elements[]`, _t.arr(), _t.ref`elements[]`, _t.ref`elements[]`, _t.ref`closeToken`], {
402
+ openToken: _t.s_i_node(_l.Regex, "Punctuator", "["),
403
+ elements: [_t.node(_l.Regex, "CharacterClassRange", [_t.ref`min`, _t.ref`rangeToken`, _t.ref`max`], {
404
+ min: _t.node(_l.Regex, "Character", [_t.lit("a")], {}, {}),
405
+ rangeToken: _t.s_i_node(_l.Regex, "Punctuator", "-"),
406
+ max: _t.node(_l.Regex, "Character", [_t.lit("z")], {}, {})
407
+ }, {}), _t.node(_l.Regex, "CharacterClassRange", [_t.ref`min`, _t.ref`rangeToken`, _t.ref`max`], {
408
+ min: _t.node(_l.Regex, "Character", [_t.lit("A")], {}, {}),
409
+ rangeToken: _t.s_i_node(_l.Regex, "Punctuator", "-"),
410
+ max: _t.node(_l.Regex, "Character", [_t.lit("Z")], {}, {})
411
+ }, {})],
412
+ closeToken: _t.s_i_node(_l.Regex, "Punctuator", "]")
413
+ }, {
414
+ negate: false
415
+ })]
416
+ }, {})],
417
+ closeToken: _t.s_i_node(_l.Regex, "Punctuator", "/")
418
+ }, {})],
419
+ closeToken: _t.s_i_node(_l.Instruction, "Punctuator", ")")
420
+ }, {})
421
+ }, {})) {
257
422
  yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
258
423
  verb: _t.s_node(_l.Instruction, "Identifier", "eat"),
259
- arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
424
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
260
425
  openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
261
426
  values: [_t.node(_l.Instruction, "Null", [_t.ref`sigilToken`], {
262
427
  sigilToken: _t.s_i_node(_l.Instruction, "Keyword", "null")
@@ -270,7 +435,7 @@ export const grammar = class SpamexGrammar {
270
435
  }, {});
271
436
  yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
272
437
  verb: _t.s_node(_l.Instruction, "Identifier", "eat"),
273
- arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
438
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
274
439
  openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
275
440
  values: [_t.node(_l.Instruction, "Null", [_t.ref`sigilToken`], {
276
441
  sigilToken: _t.s_i_node(_l.Instruction, "Keyword", "null")
@@ -284,17 +449,127 @@ export const grammar = class SpamexGrammar {
284
449
  }, {});
285
450
  yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
286
451
  verb: _t.s_node(_l.Instruction, "Identifier", "eatMatch"),
287
- arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
452
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
288
453
  openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
289
- values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`language`, _t.ref`namespaceSeparatorToken`, _t.ref`type`, _t.ref`closeToken`], {
290
- openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
291
- flags: _t.node(_l.CSTML, "Flags", [_t.ref`tokenToken`], {
292
- tokenToken: _t.s_i_node(_l.CSTML, "Punctuator", "*")
293
- }, {}),
294
- language: _t.s_node(_l.Spamex, "Identifier", "CSTML"),
295
- namespaceSeparatorToken: _t.s_i_node(_l.Spamex, "Punctuator", ":"),
296
- type: _t.s_node(_l.Spamex, "Identifier", "Identifier"),
297
- closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
454
+ values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`open`], {
455
+ open: _t.node(_l.Spamex, "OpenNodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`language`, _t.ref`namespaceSeparatorToken`, _t.ref`type`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`selfClosingTagToken`, _t.ref`closeToken`], {
456
+ openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
457
+ flags: _t.node(_l.CSTML, "Flags", [_t.ref`tokenToken`], {
458
+ tokenToken: _t.s_i_node(_l.CSTML, "Punctuator", "*")
459
+ }, {}),
460
+ language: _t.s_node(_l.Spamex, "Identifier", "CSTML"),
461
+ namespaceSeparatorToken: _t.s_i_node(_l.Spamex, "Punctuator", ":"),
462
+ type: _t.s_node(_l.Spamex, "Identifier", "Identifier"),
463
+ selfClosingTagToken: _t.s_i_node(_l.Spamex, "Punctuator", "/"),
464
+ closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
465
+ }, {})
466
+ }, {}), _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
467
+ openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
468
+ content: _t.node(_l.CSTML, "Content", [_t.lit("type")], {}, {}),
469
+ closeToken: _t.s_i_node(_l.CSTML, "Punctuator", "'")
470
+ }, {})],
471
+ closeToken: _t.s_i_node(_l.Instruction, "Punctuator", ")")
472
+ }, {})
473
+ }, {});
474
+ } else if (yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
475
+ verb: _t.s_node(_l.Instruction, "Identifier", "match"),
476
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.ref`closeToken`], {
477
+ openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
478
+ values: [_t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
479
+ openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
480
+ content: _t.node(_l.CSTML, "Content", [_t.lit("?")], {}, {}),
481
+ closeToken: _t.s_i_node(_l.CSTML, "Punctuator", "'")
482
+ }, {})],
483
+ closeToken: _t.s_i_node(_l.Instruction, "Punctuator", ")")
484
+ }, {})
485
+ }, {})) {
486
+ yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
487
+ verb: _t.s_node(_l.Instruction, "Identifier", "eat"),
488
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
489
+ openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
490
+ values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`open`], {
491
+ open: _t.node(_l.Spamex, "OpenNodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`type`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`intrinsicValue`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`selfClosingTagToken`, _t.ref`closeToken`], {
492
+ openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
493
+ flags: _t.node(_l.CSTML, "Flags", [_t.ref`intrinsicToken`, _t.ref`tokenToken`], {
494
+ intrinsicToken: _t.s_i_node(_l.CSTML, "Punctuator", "~"),
495
+ tokenToken: _t.s_i_node(_l.CSTML, "Punctuator", "*")
496
+ }, {}),
497
+ type: _t.s_node(_l.Spamex, "Identifier", "Punctuator"),
498
+ intrinsicValue: _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
499
+ openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
500
+ content: _t.node(_l.CSTML, "Content", [_t.lit("?")], {}, {}),
501
+ closeToken: _t.s_i_node(_l.CSTML, "Punctuator", "'")
502
+ }, {}),
503
+ selfClosingTagToken: _t.s_i_node(_l.Spamex, "Punctuator", "/"),
504
+ closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
505
+ }, {})
506
+ }, {}), _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
507
+ openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
508
+ content: _t.node(_l.CSTML, "Content", [_t.lit("type")], {}, {}),
509
+ closeToken: _t.s_i_node(_l.CSTML, "Punctuator", "'")
510
+ }, {})],
511
+ closeToken: _t.s_i_node(_l.Instruction, "Punctuator", ")")
512
+ }, {})
513
+ }, {});
514
+ } else if (yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
515
+ verb: _t.s_node(_l.Instruction, "Identifier", "match"),
516
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.ref`closeToken`], {
517
+ openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
518
+ values: [_t.node(_l.Regex, "Pattern", [_t.ref`openToken`, _t.ref`alternatives[]`, _t.arr(), _t.ref`alternatives[]`, _t.ref`closeToken`], {
519
+ openToken: _t.s_i_node(_l.Regex, "Punctuator", "/"),
520
+ alternatives: [_t.node(_l.Regex, "Alternative", [_t.ref`elements[]`, _t.arr(), _t.ref`elements[]`], {
521
+ elements: [_t.node(_l.Regex, "CharacterClass", [_t.ref`openToken`, _t.ref`elements[]`, _t.arr(), _t.ref`elements[]`, _t.ref`elements[]`, _t.ref`closeToken`], {
522
+ openToken: _t.s_i_node(_l.Regex, "Punctuator", "["),
523
+ elements: [_t.node(_l.Regex, "Character", [_t.lit(" ")], {}, {}), _t.node(_l.Regex, "Character", [_t.embedded(_t.s_e_node(_l.Regex, "Escape", [_t.lit("\\t")], {}, {
524
+ cooked: "\t"
525
+ }))], {}, {})],
526
+ closeToken: _t.s_i_node(_l.Regex, "Punctuator", "]")
527
+ }, {
528
+ negate: false
529
+ })]
530
+ }, {})],
531
+ closeToken: _t.s_i_node(_l.Regex, "Punctuator", "/")
532
+ }, {})],
533
+ closeToken: _t.s_i_node(_l.Instruction, "Punctuator", ")")
534
+ }, {})
535
+ }, {})) {
536
+ yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
537
+ verb: _t.s_node(_l.Instruction, "Identifier", "eatMatch"),
538
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
539
+ openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
540
+ values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`open`], {
541
+ open: _t.node(_l.Spamex, "OpenNodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`type`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`intrinsicValue`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`selfClosingTagToken`, _t.ref`closeToken`], {
542
+ openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
543
+ flags: _t.node(_l.CSTML, "Flags", [_t.ref`intrinsicToken`, _t.ref`tokenToken`], {
544
+ intrinsicToken: _t.s_i_node(_l.CSTML, "Punctuator", "~"),
545
+ tokenToken: _t.s_i_node(_l.CSTML, "Punctuator", "*")
546
+ }, {}),
547
+ type: _t.s_node(_l.Spamex, "Identifier", "Punctuator"),
548
+ intrinsicValue: _t.node(_l.Regex, "Pattern", [_t.ref`openToken`, _t.ref`alternatives[]`, _t.arr(), _t.ref`alternatives[]`, _t.ref`closeToken`], {
549
+ openToken: _t.s_i_node(_l.Regex, "Punctuator", "/"),
550
+ alternatives: [_t.node(_l.Regex, "Alternative", [_t.ref`elements[]`, _t.arr(), _t.ref`elements[]`], {
551
+ elements: [_t.node(_l.Regex, "Quantifier", [_t.ref`element`, _t.ref`value`], {
552
+ element: _t.node(_l.Regex, "CharacterClass", [_t.ref`openToken`, _t.ref`elements[]`, _t.arr(), _t.ref`elements[]`, _t.ref`elements[]`, _t.ref`closeToken`], {
553
+ openToken: _t.s_i_node(_l.Regex, "Punctuator", "["),
554
+ elements: [_t.node(_l.Regex, "Character", [_t.lit(" ")], {}, {}), _t.node(_l.Regex, "Character", [_t.embedded(_t.s_e_node(_l.Regex, "Escape", [_t.lit("\\t")], {}, {
555
+ cooked: "\t"
556
+ }))], {}, {})],
557
+ closeToken: _t.s_i_node(_l.Regex, "Punctuator", "]")
558
+ }, {
559
+ negate: false
560
+ }),
561
+ value: _t.s_i_node(_l.Regex, "Keyword", "+")
562
+ }, {
563
+ min: 1,
564
+ max: Infinity,
565
+ greedy: true
566
+ })]
567
+ }, {})],
568
+ closeToken: _t.s_i_node(_l.Regex, "Punctuator", "/")
569
+ }, {}),
570
+ selfClosingTagToken: _t.s_i_node(_l.Spamex, "Punctuator", "/"),
571
+ closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
572
+ }, {})
298
573
  }, {}), _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
299
574
  openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
300
575
  content: _t.node(_l.CSTML, "Content", [_t.lit("type")], {}, {}),
@@ -307,13 +582,16 @@ export const grammar = class SpamexGrammar {
307
582
  let sp = yield* eatMatchTrivia();
308
583
  if (sp && (yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
309
584
  verb: _t.s_node(_l.Instruction, "Identifier", "eatMatch"),
310
- arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
585
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
311
586
  openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
312
- values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`type`, _t.ref`closeToken`], {
313
- openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
314
- flags: _t.node(_l.CSTML, "Flags", [], {}, {}),
315
- type: _t.s_node(_l.Spamex, "Identifier", "StringMatcher"),
316
- closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
587
+ values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`open`], {
588
+ open: _t.node(_l.Spamex, "OpenNodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`type`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`selfClosingTagToken`, _t.ref`closeToken`], {
589
+ openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
590
+ flags: _t.node(_l.CSTML, "Flags", [], {}, {}),
591
+ type: _t.s_node(_l.Spamex, "Identifier", "StringMatcher"),
592
+ selfClosingTagToken: _t.s_i_node(_l.Spamex, "Punctuator", "/"),
593
+ closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
594
+ }, {})
317
595
  }, {}), _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
318
596
  openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
319
597
  content: _t.node(_l.CSTML, "Content", [_t.lit("intrinsicValue")], {}, {}),
@@ -326,11 +604,11 @@ export const grammar = class SpamexGrammar {
326
604
  }
327
605
  while (sp && (yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
328
606
  verb: _t.s_node(_l.Instruction, "Identifier", "match"),
329
- arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.ref`closeToken`], {
607
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.ref`closeToken`], {
330
608
  openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
331
- values: [_t.node(_l.Regex, "Pattern", [_t.ref`openToken`, _t.ref`alternatives[]`, _t.ref`closeToken`], {
609
+ values: [_t.node(_l.Regex, "Pattern", [_t.ref`openToken`, _t.ref`alternatives[]`, _t.arr(), _t.ref`alternatives[]`, _t.ref`closeToken`], {
332
610
  openToken: _t.s_i_node(_l.Regex, "Punctuator", "/"),
333
- alternatives: [_t.node(_l.Regex, "Alternative", [_t.ref`elements[]`, _t.ref`elements[]`], {
611
+ alternatives: [_t.node(_l.Regex, "Alternative", [_t.ref`elements[]`, _t.arr(), _t.ref`elements[]`, _t.ref`elements[]`], {
334
612
  elements: [_t.node(_l.Regex, "Quantifier", [_t.ref`element`, _t.ref`value`], {
335
613
  element: _t.node(_l.Regex, "Character", [_t.lit("!")], {}, {}),
336
614
  value: _t.s_i_node(_l.Regex, "Keyword", "?")
@@ -338,7 +616,7 @@ export const grammar = class SpamexGrammar {
338
616
  min: 0,
339
617
  max: 1,
340
618
  greedy: true
341
- }), _t.node(_l.Regex, "CharacterClass", [_t.ref`openToken`, _t.ref`elements[]`, _t.ref`elements[]`, _t.ref`closeToken`], {
619
+ }), _t.node(_l.Regex, "CharacterClass", [_t.ref`openToken`, _t.ref`elements[]`, _t.arr(), _t.ref`elements[]`, _t.ref`elements[]`, _t.ref`closeToken`], {
342
620
  openToken: _t.s_i_node(_l.Regex, "Punctuator", "["),
343
621
  elements: [_t.node(_l.Regex, "CharacterClassRange", [_t.ref`min`, _t.ref`rangeToken`, _t.ref`max`], {
344
622
  min: _t.node(_l.Regex, "Character", [_t.lit("a")], {}, {}),
@@ -361,13 +639,16 @@ export const grammar = class SpamexGrammar {
361
639
  }, {}))) {
362
640
  yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
363
641
  verb: _t.s_node(_l.Instruction, "Identifier", "eat"),
364
- arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
642
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
365
643
  openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
366
- values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`type`, _t.ref`closeToken`], {
367
- openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
368
- flags: _t.node(_l.CSTML, "Flags", [], {}, {}),
369
- type: _t.s_node(_l.Spamex, "Identifier", "Attribute"),
370
- closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
644
+ values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`open`], {
645
+ open: _t.node(_l.Spamex, "OpenNodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`type`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`selfClosingTagToken`, _t.ref`closeToken`], {
646
+ openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
647
+ flags: _t.node(_l.CSTML, "Flags", [], {}, {}),
648
+ type: _t.s_node(_l.Spamex, "Identifier", "Attribute"),
649
+ selfClosingTagToken: _t.s_i_node(_l.Spamex, "Punctuator", "/"),
650
+ closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
651
+ }, {})
371
652
  }, {}), _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
372
653
  openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
373
654
  content: _t.node(_l.CSTML, "Content", [_t.lit("attributes[]")], {}, {}),
@@ -378,26 +659,57 @@ export const grammar = class SpamexGrammar {
378
659
  }, {});
379
660
  sp = yield* eatMatchTrivia();
380
661
  }
662
+ yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
663
+ verb: _t.s_node(_l.Instruction, "Identifier", "eatMatch"),
664
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
665
+ openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
666
+ values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`open`], {
667
+ open: _t.node(_l.Spamex, "OpenNodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`type`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`intrinsicValue`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`selfClosingTagToken`, _t.ref`closeToken`], {
668
+ openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
669
+ flags: _t.node(_l.CSTML, "Flags", [_t.ref`intrinsicToken`, _t.ref`tokenToken`], {
670
+ intrinsicToken: _t.s_i_node(_l.CSTML, "Punctuator", "~"),
671
+ tokenToken: _t.s_i_node(_l.CSTML, "Punctuator", "*")
672
+ }, {}),
673
+ type: _t.s_node(_l.Spamex, "Identifier", "Punctuator"),
674
+ intrinsicValue: _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
675
+ openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
676
+ content: _t.node(_l.CSTML, "Content", [_t.lit("/")], {}, {}),
677
+ closeToken: _t.s_i_node(_l.CSTML, "Punctuator", "'")
678
+ }, {}),
679
+ selfClosingTagToken: _t.s_i_node(_l.Spamex, "Punctuator", "/"),
680
+ closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
681
+ }, {})
682
+ }, {}), _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
683
+ openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
684
+ content: _t.node(_l.CSTML, "Content", [_t.lit("selfClosingTagToken")], {}, {}),
685
+ closeToken: _t.s_i_node(_l.CSTML, "Punctuator", "'")
686
+ }, {})],
687
+ closeToken: _t.s_i_node(_l.Instruction, "Punctuator", ")")
688
+ }, {})
689
+ }, {});
381
690
  yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
382
691
  verb: _t.s_node(_l.Instruction, "Identifier", "eat"),
383
- arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
692
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
384
693
  openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
385
- values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`type`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit(" ")], {}, {})), _t.ref`intrinsicValue`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit(" ")], {}, {})), _t.ref`attributes[]`, _t.ref`closeToken`], {
386
- openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
387
- flags: _t.node(_l.CSTML, "Flags", [_t.ref`intrinsicToken`, _t.ref`tokenToken`], {
388
- intrinsicToken: _t.s_i_node(_l.CSTML, "Punctuator", "~"),
389
- tokenToken: _t.s_i_node(_l.CSTML, "Punctuator", "*")
390
- }, {}),
391
- type: _t.s_node(_l.Spamex, "Identifier", "Punctuator"),
392
- intrinsicValue: _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
393
- openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
394
- content: _t.node(_l.CSTML, "Content", [_t.lit(">")], {}, {}),
395
- closeToken: _t.s_i_node(_l.CSTML, "Punctuator", "'")
396
- }, {}),
397
- attributes: [_t.node(_l.Spamex, "BooleanAttribute", [_t.ref`key`], {
398
- key: _t.node(_l.Spamex, "Literal", [_t.lit("balancer")], {}, {})
399
- }, {})],
400
- closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
694
+ values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`open`], {
695
+ open: _t.node(_l.Spamex, "OpenNodeMatcher", [12, [[_t.ref`openToken`, _t.ref`flags`, _t.ref`type`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {}))], [_t.ref`intrinsicValue`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`attributes[]`, _t.arr(), _t.ref`attributes[]`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`selfClosingTagToken`, _t.ref`closeToken`]]], {
696
+ openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
697
+ flags: _t.node(_l.CSTML, "Flags", [_t.ref`intrinsicToken`, _t.ref`tokenToken`], {
698
+ intrinsicToken: _t.s_i_node(_l.CSTML, "Punctuator", "~"),
699
+ tokenToken: _t.s_i_node(_l.CSTML, "Punctuator", "*")
700
+ }, {}),
701
+ type: _t.s_node(_l.Spamex, "Identifier", "Punctuator"),
702
+ intrinsicValue: _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
703
+ openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
704
+ content: _t.node(_l.CSTML, "Content", [_t.lit(">")], {}, {}),
705
+ closeToken: _t.s_i_node(_l.CSTML, "Punctuator", "'")
706
+ }, {}),
707
+ attributes: [_t.node(_l.Spamex, "BooleanAttribute", [_t.ref`key`], {
708
+ key: _t.s_node(_l.Spamex, "Identifier", "balancer")
709
+ }, {})],
710
+ selfClosingTagToken: _t.s_i_node(_l.Spamex, "Punctuator", "/"),
711
+ closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
712
+ }, {})
401
713
  }, {}), _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
402
714
  openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
403
715
  content: _t.node(_l.CSTML, "Content", [_t.lit("close")], {}, {}),
@@ -407,30 +719,122 @@ export const grammar = class SpamexGrammar {
407
719
  }, {})
408
720
  }, {});
409
721
  }
722
+ *CloseNodeMatcher() {
723
+ yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
724
+ verb: _t.s_node(_l.Instruction, "Identifier", "eat"),
725
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
726
+ openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
727
+ values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`open`], {
728
+ open: _t.node(_l.Spamex, "OpenNodeMatcher", [12, [[_t.ref`openToken`, _t.ref`flags`, _t.ref`type`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {}))], [_t.ref`intrinsicValue`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`attributes[]`, _t.arr(), _t.ref`attributes[]`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`selfClosingTagToken`, _t.ref`closeToken`]]], {
729
+ openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
730
+ flags: _t.node(_l.CSTML, "Flags", [_t.ref`intrinsicToken`, _t.ref`tokenToken`], {
731
+ intrinsicToken: _t.s_i_node(_l.CSTML, "Punctuator", "~"),
732
+ tokenToken: _t.s_i_node(_l.CSTML, "Punctuator", "*")
733
+ }, {}),
734
+ type: _t.s_node(_l.Spamex, "Identifier", "Punctuator"),
735
+ intrinsicValue: _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
736
+ openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
737
+ content: _t.node(_l.CSTML, "Content", [_t.lit("</")], {}, {}),
738
+ closeToken: _t.s_i_node(_l.CSTML, "Punctuator", "'")
739
+ }, {}),
740
+ attributes: [_t.node(_l.Spamex, "MappingAttribute", [_t.ref`key`, _t.ref`mapToken`, _t.ref`value`], {
741
+ key: _t.s_node(_l.Spamex, "Identifier", "balanced"),
742
+ mapToken: _t.s_i_node(_l.Spamex, "Punctuator", "="),
743
+ value: _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
744
+ openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
745
+ content: _t.node(_l.CSTML, "Content", [_t.lit(">")], {}, {}),
746
+ closeToken: _t.s_i_node(_l.CSTML, "Punctuator", "'")
747
+ }, {})
748
+ }, {})],
749
+ selfClosingTagToken: _t.s_i_node(_l.Spamex, "Punctuator", "/"),
750
+ closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
751
+ }, {})
752
+ }, {}), _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
753
+ openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
754
+ content: _t.node(_l.CSTML, "Content", [_t.lit("openToken")], {}, {}),
755
+ closeToken: _t.s_i_node(_l.CSTML, "Punctuator", "'")
756
+ }, {})],
757
+ closeToken: _t.s_i_node(_l.Instruction, "Punctuator", ")")
758
+ }, {})
759
+ }, {});
760
+ yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
761
+ verb: _t.s_node(_l.Instruction, "Identifier", "eatMatch"),
762
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.ref`closeToken`], {
763
+ openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
764
+ values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`open`], {
765
+ open: _t.node(_l.Spamex, "OpenNodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`type`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`selfClosingTagToken`, _t.ref`closeToken`], {
766
+ openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
767
+ flags: _t.node(_l.CSTML, "Flags", [], {}, {}),
768
+ type: _t.s_node(_l.Spamex, "Identifier", "TagType"),
769
+ selfClosingTagToken: _t.s_i_node(_l.Spamex, "Punctuator", "/"),
770
+ closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
771
+ }, {})
772
+ }, {})],
773
+ closeToken: _t.s_i_node(_l.Instruction, "Punctuator", ")")
774
+ }, {})
775
+ }, {});
776
+ yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
777
+ verb: _t.s_node(_l.Instruction, "Identifier", "eat"),
778
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
779
+ openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
780
+ values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`open`], {
781
+ open: _t.node(_l.Spamex, "OpenNodeMatcher", [12, [[_t.ref`openToken`, _t.ref`flags`, _t.ref`type`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {}))], [_t.ref`intrinsicValue`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`attributes[]`, _t.arr(), _t.ref`attributes[]`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`selfClosingTagToken`, _t.ref`closeToken`]]], {
782
+ openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
783
+ flags: _t.node(_l.CSTML, "Flags", [_t.ref`intrinsicToken`, _t.ref`tokenToken`], {
784
+ intrinsicToken: _t.s_i_node(_l.CSTML, "Punctuator", "~"),
785
+ tokenToken: _t.s_i_node(_l.CSTML, "Punctuator", "*")
786
+ }, {}),
787
+ type: _t.s_node(_l.Spamex, "Identifier", "Punctuator"),
788
+ intrinsicValue: _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
789
+ openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
790
+ content: _t.node(_l.CSTML, "Content", [_t.lit(">")], {}, {}),
791
+ closeToken: _t.s_i_node(_l.CSTML, "Punctuator", "'")
792
+ }, {}),
793
+ attributes: [_t.node(_l.Spamex, "BooleanAttribute", [_t.ref`key`], {
794
+ key: _t.s_node(_l.Spamex, "Identifier", "balancer")
795
+ }, {})],
796
+ selfClosingTagToken: _t.s_i_node(_l.Spamex, "Punctuator", "/"),
797
+ closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
798
+ }, {})
799
+ }, {}), _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
800
+ openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
801
+ content: _t.node(_l.CSTML, "Content", [_t.lit("closeToken")], {}, {}),
802
+ closeToken: _t.s_i_node(_l.CSTML, "Punctuator", "'")
803
+ }, {})],
804
+ closeToken: _t.s_i_node(_l.Instruction, "Punctuator", ")")
805
+ }, {})
806
+ }, {});
807
+ }
410
808
  *Attributes() {
411
809
  yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
412
810
  verb: _t.s_node(_l.Instruction, "Identifier", "eatMatch"),
413
- arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
811
+ arguments: _t.node(_l.Instruction, "Tuple", [9, [[_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`], [_t.embedded(_t.node(_l.Instruction, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`]]], {
414
812
  openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
415
- values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`type`, _t.ref`closeToken`], {
416
- openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
417
- flags: _t.node(_l.CSTML, "Flags", [], {}, {}),
418
- type: _t.s_node(_l.Spamex, "Identifier", "List"),
419
- closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
813
+ values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`open`], {
814
+ open: _t.node(_l.Spamex, "OpenNodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`type`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`selfClosingTagToken`, _t.ref`closeToken`], {
815
+ openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
816
+ flags: _t.node(_l.CSTML, "Flags", [], {}, {}),
817
+ type: _t.s_node(_l.Spamex, "Identifier", "List"),
818
+ selfClosingTagToken: _t.s_i_node(_l.Spamex, "Punctuator", "/"),
819
+ closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
820
+ }, {})
420
821
  }, {}), _t.node(_l.Instruction, "Null", [_t.ref`sigilToken`], {
421
822
  sigilToken: _t.s_i_node(_l.Instruction, "Keyword", "null")
422
- }, {}), _t.node(_l.Instruction, "Object", [_t.ref`openToken`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit("\n ")], {}, {})), _t.ref`properties[]`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit("\n ")], {}, {})), _t.ref`properties[]`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit("\n ")], {}, {})), _t.ref`closeToken`], {
823
+ }, {}), _t.node(_l.Instruction, "Object", [9, [[_t.ref`openToken`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit("\n ")], {}, {})), _t.ref`properties[]`, _t.arr()], [_t.ref`properties[]`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit("\n ")], {}, {})), _t.ref`properties[]`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit("\n ")], {}, {})), _t.ref`closeToken`]]], {
423
824
  openToken: _t.s_i_node(_l.Instruction, "Punctuator", "{"),
424
- properties: [_t.node(_l.Instruction, "Property", [_t.ref`key`, _t.ref`mapToken`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit(" ")], {}, {})), _t.ref`value`], {
825
+ properties: [_t.node(_l.Instruction, "Property", [_t.ref`key`, _t.ref`mapToken`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit(" ")], {}, {})), _t.ref`value`], {
425
826
  key: _t.node(_l.Instruction, "Literal", [_t.lit("element")], {}, {}),
426
827
  mapToken: _t.s_i_node(_l.Instruction, "Punctuator", ":"),
427
- value: _t.node(_l.Spamex, "NodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`type`, _t.ref`closeToken`], {
428
- openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
429
- flags: _t.node(_l.CSTML, "Flags", [], {}, {}),
430
- type: _t.s_node(_l.Spamex, "Identifier", "Attribute"),
431
- closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
828
+ value: _t.node(_l.Spamex, "NodeMatcher", [_t.ref`open`], {
829
+ open: _t.node(_l.Spamex, "OpenNodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`type`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`selfClosingTagToken`, _t.ref`closeToken`], {
830
+ openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
831
+ flags: _t.node(_l.CSTML, "Flags", [], {}, {}),
832
+ type: _t.s_node(_l.Spamex, "Identifier", "Attribute"),
833
+ selfClosingTagToken: _t.s_i_node(_l.Spamex, "Punctuator", "/"),
834
+ closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
835
+ }, {})
432
836
  }, {})
433
- }, {}), _t.node(_l.Instruction, "Property", [_t.ref`key`, _t.ref`mapToken`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit(" ")], {}, {})), _t.ref`value`], {
837
+ }, {}), _t.node(_l.Instruction, "Property", [_t.ref`key`, _t.ref`mapToken`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit(" ")], {}, {})), _t.ref`value`], {
434
838
  key: _t.node(_l.Instruction, "Literal", [_t.lit("allowTrailingSeparator")], {}, {}),
435
839
  mapToken: _t.s_i_node(_l.Instruction, "Punctuator", ":"),
436
840
  value: _t.node(_l.Instruction, "Boolean", [_t.ref`sigilToken`], {
@@ -446,13 +850,13 @@ export const grammar = class SpamexGrammar {
446
850
  *Attribute() {
447
851
  if (yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
448
852
  verb: _t.s_node(_l.Instruction, "Identifier", "match"),
449
- arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.ref`closeToken`], {
853
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.ref`closeToken`], {
450
854
  openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
451
- values: [_t.node(_l.Regex, "Pattern", [_t.ref`openToken`, _t.ref`alternatives[]`, _t.ref`closeToken`], {
855
+ values: [_t.node(_l.Regex, "Pattern", [_t.ref`openToken`, _t.ref`alternatives[]`, _t.arr(), _t.ref`alternatives[]`, _t.ref`closeToken`], {
452
856
  openToken: _t.s_i_node(_l.Regex, "Punctuator", "/"),
453
- alternatives: [_t.node(_l.Regex, "Alternative", [_t.ref`elements[]`, _t.ref`elements[]`, _t.ref`elements[]`], {
857
+ alternatives: [_t.node(_l.Regex, "Alternative", [_t.ref`elements[]`, _t.arr(), _t.ref`elements[]`, _t.ref`elements[]`, _t.ref`elements[]`], {
454
858
  elements: [_t.node(_l.Regex, "Quantifier", [_t.ref`element`, _t.ref`value`], {
455
- element: _t.node(_l.Regex, "CharacterClass", [_t.ref`openToken`, _t.ref`elements[]`, _t.ref`elements[]`, _t.ref`closeToken`], {
859
+ element: _t.node(_l.Regex, "CharacterClass", [_t.ref`openToken`, _t.ref`elements[]`, _t.arr(), _t.ref`elements[]`, _t.ref`elements[]`, _t.ref`closeToken`], {
456
860
  openToken: _t.s_i_node(_l.Regex, "Punctuator", "["),
457
861
  elements: [_t.node(_l.Regex, "CharacterClassRange", [_t.ref`min`, _t.ref`rangeToken`, _t.ref`max`], {
458
862
  min: _t.node(_l.Regex, "Character", [_t.lit("a")], {}, {}),
@@ -491,13 +895,16 @@ export const grammar = class SpamexGrammar {
491
895
  }, {})) {
492
896
  yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
493
897
  verb: _t.s_node(_l.Instruction, "Identifier", "eat"),
494
- arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.ref`closeToken`], {
898
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.ref`closeToken`], {
495
899
  openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
496
- values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`type`, _t.ref`closeToken`], {
497
- openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
498
- flags: _t.node(_l.CSTML, "Flags", [], {}, {}),
499
- type: _t.s_node(_l.Spamex, "Identifier", "MappingAttribute"),
500
- closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
900
+ values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`open`], {
901
+ open: _t.node(_l.Spamex, "OpenNodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`type`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`selfClosingTagToken`, _t.ref`closeToken`], {
902
+ openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
903
+ flags: _t.node(_l.CSTML, "Flags", [], {}, {}),
904
+ type: _t.s_node(_l.Spamex, "Identifier", "MappingAttribute"),
905
+ selfClosingTagToken: _t.s_i_node(_l.Spamex, "Punctuator", "/"),
906
+ closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
907
+ }, {})
501
908
  }, {})],
502
909
  closeToken: _t.s_i_node(_l.Instruction, "Punctuator", ")")
503
910
  }, {})
@@ -505,13 +912,16 @@ export const grammar = class SpamexGrammar {
505
912
  } else {
506
913
  yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
507
914
  verb: _t.s_node(_l.Instruction, "Identifier", "eat"),
508
- arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.ref`closeToken`], {
915
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.ref`closeToken`], {
509
916
  openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
510
- values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`type`, _t.ref`closeToken`], {
511
- openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
512
- flags: _t.node(_l.CSTML, "Flags", [], {}, {}),
513
- type: _t.s_node(_l.Spamex, "Identifier", "BooleanAttribute"),
514
- closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
917
+ values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`open`], {
918
+ open: _t.node(_l.Spamex, "OpenNodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`type`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`selfClosingTagToken`, _t.ref`closeToken`], {
919
+ openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
920
+ flags: _t.node(_l.CSTML, "Flags", [], {}, {}),
921
+ type: _t.s_node(_l.Spamex, "Identifier", "BooleanAttribute"),
922
+ selfClosingTagToken: _t.s_i_node(_l.Spamex, "Punctuator", "/"),
923
+ closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
924
+ }, {})
515
925
  }, {})],
516
926
  closeToken: _t.s_i_node(_l.Instruction, "Punctuator", ")")
517
927
  }, {})
@@ -521,17 +931,20 @@ export const grammar = class SpamexGrammar {
521
931
  *BooleanAttribute() {
522
932
  yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
523
933
  verb: _t.s_node(_l.Instruction, "Identifier", "eat"),
524
- arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
934
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
525
935
  openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
526
- values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`language`, _t.ref`namespaceSeparatorToken`, _t.ref`type`, _t.ref`closeToken`], {
527
- openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
528
- flags: _t.node(_l.CSTML, "Flags", [_t.ref`tokenToken`], {
529
- tokenToken: _t.s_i_node(_l.CSTML, "Punctuator", "*")
530
- }, {}),
531
- language: _t.s_node(_l.Spamex, "Identifier", "CSTML"),
532
- namespaceSeparatorToken: _t.s_i_node(_l.Spamex, "Punctuator", ":"),
533
- type: _t.s_node(_l.Spamex, "Identifier", "Identifier"),
534
- closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
936
+ values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`open`], {
937
+ open: _t.node(_l.Spamex, "OpenNodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`language`, _t.ref`namespaceSeparatorToken`, _t.ref`type`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`selfClosingTagToken`, _t.ref`closeToken`], {
938
+ openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
939
+ flags: _t.node(_l.CSTML, "Flags", [_t.ref`tokenToken`], {
940
+ tokenToken: _t.s_i_node(_l.CSTML, "Punctuator", "*")
941
+ }, {}),
942
+ language: _t.s_node(_l.Spamex, "Identifier", "CSTML"),
943
+ namespaceSeparatorToken: _t.s_i_node(_l.Spamex, "Punctuator", ":"),
944
+ type: _t.s_node(_l.Spamex, "Identifier", "Identifier"),
945
+ selfClosingTagToken: _t.s_i_node(_l.Spamex, "Punctuator", "/"),
946
+ closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
947
+ }, {})
535
948
  }, {}), _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
536
949
  openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
537
950
  content: _t.node(_l.CSTML, "Content", [_t.lit("key")], {}, {}),
@@ -544,17 +957,20 @@ export const grammar = class SpamexGrammar {
544
957
  *MappingAttribute() {
545
958
  yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
546
959
  verb: _t.s_node(_l.Instruction, "Identifier", "eat"),
547
- arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
960
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
548
961
  openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
549
- values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`language`, _t.ref`namespaceSeparatorToken`, _t.ref`type`, _t.ref`closeToken`], {
550
- openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
551
- flags: _t.node(_l.CSTML, "Flags", [_t.ref`tokenToken`], {
552
- tokenToken: _t.s_i_node(_l.CSTML, "Punctuator", "*")
553
- }, {}),
554
- language: _t.s_node(_l.Spamex, "Identifier", "CSTML"),
555
- namespaceSeparatorToken: _t.s_i_node(_l.Spamex, "Punctuator", ":"),
556
- type: _t.s_node(_l.Spamex, "Identifier", "Identifier"),
557
- closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
962
+ values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`open`], {
963
+ open: _t.node(_l.Spamex, "OpenNodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`language`, _t.ref`namespaceSeparatorToken`, _t.ref`type`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`selfClosingTagToken`, _t.ref`closeToken`], {
964
+ openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
965
+ flags: _t.node(_l.CSTML, "Flags", [_t.ref`tokenToken`], {
966
+ tokenToken: _t.s_i_node(_l.CSTML, "Punctuator", "*")
967
+ }, {}),
968
+ language: _t.s_node(_l.Spamex, "Identifier", "CSTML"),
969
+ namespaceSeparatorToken: _t.s_i_node(_l.Spamex, "Punctuator", ":"),
970
+ type: _t.s_node(_l.Spamex, "Identifier", "Identifier"),
971
+ selfClosingTagToken: _t.s_i_node(_l.Spamex, "Punctuator", "/"),
972
+ closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
973
+ }, {})
558
974
  }, {}), _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
559
975
  openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
560
976
  content: _t.node(_l.CSTML, "Content", [_t.lit("key")], {}, {}),
@@ -565,21 +981,24 @@ export const grammar = class SpamexGrammar {
565
981
  }, {});
566
982
  yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
567
983
  verb: _t.s_node(_l.Instruction, "Identifier", "eat"),
568
- arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
984
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
569
985
  openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
570
- values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`type`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit(" ")], {}, {})), _t.ref`intrinsicValue`, _t.ref`closeToken`], {
571
- openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
572
- flags: _t.node(_l.CSTML, "Flags", [_t.ref`intrinsicToken`, _t.ref`tokenToken`], {
573
- intrinsicToken: _t.s_i_node(_l.CSTML, "Punctuator", "~"),
574
- tokenToken: _t.s_i_node(_l.CSTML, "Punctuator", "*")
575
- }, {}),
576
- type: _t.s_node(_l.Spamex, "Identifier", "Punctuator"),
577
- intrinsicValue: _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
578
- openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
579
- content: _t.node(_l.CSTML, "Content", [_t.lit("=")], {}, {}),
580
- closeToken: _t.s_i_node(_l.CSTML, "Punctuator", "'")
581
- }, {}),
582
- closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
986
+ values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`open`], {
987
+ open: _t.node(_l.Spamex, "OpenNodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`type`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`intrinsicValue`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`selfClosingTagToken`, _t.ref`closeToken`], {
988
+ openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
989
+ flags: _t.node(_l.CSTML, "Flags", [_t.ref`intrinsicToken`, _t.ref`tokenToken`], {
990
+ intrinsicToken: _t.s_i_node(_l.CSTML, "Punctuator", "~"),
991
+ tokenToken: _t.s_i_node(_l.CSTML, "Punctuator", "*")
992
+ }, {}),
993
+ type: _t.s_node(_l.Spamex, "Identifier", "Punctuator"),
994
+ intrinsicValue: _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
995
+ openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
996
+ content: _t.node(_l.CSTML, "Content", [_t.lit("=")], {}, {}),
997
+ closeToken: _t.s_i_node(_l.CSTML, "Punctuator", "'")
998
+ }, {}),
999
+ selfClosingTagToken: _t.s_i_node(_l.Spamex, "Punctuator", "/"),
1000
+ closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
1001
+ }, {})
583
1002
  }, {}), _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
584
1003
  openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
585
1004
  content: _t.node(_l.CSTML, "Content", [_t.lit("mapOperator")], {}, {}),
@@ -590,15 +1009,18 @@ export const grammar = class SpamexGrammar {
590
1009
  }, {});
591
1010
  yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
592
1011
  verb: _t.s_node(_l.Instruction, "Identifier", "eat"),
593
- arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
1012
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
594
1013
  openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
595
- values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`language`, _t.ref`namespaceSeparatorToken`, _t.ref`type`, _t.ref`closeToken`], {
596
- openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
597
- flags: _t.node(_l.CSTML, "Flags", [], {}, {}),
598
- language: _t.s_node(_l.Spamex, "Identifier", "CSTML"),
599
- namespaceSeparatorToken: _t.s_i_node(_l.Spamex, "Punctuator", ":"),
600
- type: _t.s_node(_l.Spamex, "Identifier", "AttributeValue"),
601
- closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
1014
+ values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`open`], {
1015
+ open: _t.node(_l.Spamex, "OpenNodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`language`, _t.ref`namespaceSeparatorToken`, _t.ref`type`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`selfClosingTagToken`, _t.ref`closeToken`], {
1016
+ openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
1017
+ flags: _t.node(_l.CSTML, "Flags", [], {}, {}),
1018
+ language: _t.s_node(_l.Spamex, "Identifier", "CSTML"),
1019
+ namespaceSeparatorToken: _t.s_i_node(_l.Spamex, "Punctuator", ":"),
1020
+ type: _t.s_node(_l.Spamex, "Identifier", "AttributeValue"),
1021
+ selfClosingTagToken: _t.s_i_node(_l.Spamex, "Punctuator", "/"),
1022
+ closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
1023
+ }, {})
602
1024
  }, {}), _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
603
1025
  openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
604
1026
  content: _t.node(_l.CSTML, "Content", [_t.lit("value")], {}, {}),
@@ -611,12 +1033,12 @@ export const grammar = class SpamexGrammar {
611
1033
  *StringMatcher() {
612
1034
  if (yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
613
1035
  verb: _t.s_node(_l.Instruction, "Identifier", "match"),
614
- arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.ref`closeToken`], {
1036
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.ref`closeToken`], {
615
1037
  openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
616
- values: [_t.node(_l.Regex, "Pattern", [_t.ref`openToken`, _t.ref`alternatives[]`, _t.ref`closeToken`], {
1038
+ values: [_t.node(_l.Regex, "Pattern", [_t.ref`openToken`, _t.ref`alternatives[]`, _t.arr(), _t.ref`alternatives[]`, _t.ref`closeToken`], {
617
1039
  openToken: _t.s_i_node(_l.Regex, "Punctuator", "/"),
618
- alternatives: [_t.node(_l.Regex, "Alternative", [_t.ref`elements[]`], {
619
- elements: [_t.node(_l.Regex, "CharacterClass", [_t.ref`openToken`, _t.ref`elements[]`, _t.ref`elements[]`, _t.ref`closeToken`], {
1040
+ alternatives: [_t.node(_l.Regex, "Alternative", [_t.ref`elements[]`, _t.arr(), _t.ref`elements[]`], {
1041
+ elements: [_t.node(_l.Regex, "CharacterClass", [_t.ref`openToken`, _t.ref`elements[]`, _t.arr(), _t.ref`elements[]`, _t.ref`elements[]`, _t.ref`closeToken`], {
620
1042
  openToken: _t.s_i_node(_l.Regex, "Punctuator", "["),
621
1043
  elements: [_t.node(_l.Regex, "Character", [_t.lit("'")], {}, {}), _t.node(_l.Regex, "Character", [_t.lit("\"")], {}, {})],
622
1044
  closeToken: _t.s_i_node(_l.Regex, "Punctuator", "]")
@@ -631,15 +1053,18 @@ export const grammar = class SpamexGrammar {
631
1053
  }, {})) {
632
1054
  yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
633
1055
  verb: _t.s_node(_l.Instruction, "Identifier", "eat"),
634
- arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.ref`closeToken`], {
1056
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.ref`closeToken`], {
635
1057
  openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
636
- values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`language`, _t.ref`namespaceSeparatorToken`, _t.ref`type`, _t.ref`closeToken`], {
637
- openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
638
- flags: _t.node(_l.CSTML, "Flags", [], {}, {}),
639
- language: _t.s_node(_l.Spamex, "Identifier", "CSTML"),
640
- namespaceSeparatorToken: _t.s_i_node(_l.Spamex, "Punctuator", ":"),
641
- type: _t.s_node(_l.Spamex, "Identifier", "String"),
642
- closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
1058
+ values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`open`], {
1059
+ open: _t.node(_l.Spamex, "OpenNodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`language`, _t.ref`namespaceSeparatorToken`, _t.ref`type`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`selfClosingTagToken`, _t.ref`closeToken`], {
1060
+ openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
1061
+ flags: _t.node(_l.CSTML, "Flags", [], {}, {}),
1062
+ language: _t.s_node(_l.Spamex, "Identifier", "CSTML"),
1063
+ namespaceSeparatorToken: _t.s_i_node(_l.Spamex, "Punctuator", ":"),
1064
+ type: _t.s_node(_l.Spamex, "Identifier", "String"),
1065
+ selfClosingTagToken: _t.s_i_node(_l.Spamex, "Punctuator", "/"),
1066
+ closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
1067
+ }, {})
643
1068
  }, {})],
644
1069
  closeToken: _t.s_i_node(_l.Instruction, "Punctuator", ")")
645
1070
  }, {})
@@ -647,15 +1072,18 @@ export const grammar = class SpamexGrammar {
647
1072
  } else {
648
1073
  yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
649
1074
  verb: _t.s_node(_l.Instruction, "Identifier", "eat"),
650
- arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.ref`closeToken`], {
1075
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.ref`closeToken`], {
651
1076
  openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
652
- values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`language`, _t.ref`namespaceSeparatorToken`, _t.ref`type`, _t.ref`closeToken`], {
653
- openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
654
- flags: _t.node(_l.CSTML, "Flags", [], {}, {}),
655
- language: _t.s_node(_l.Spamex, "Identifier", "Regex"),
656
- namespaceSeparatorToken: _t.s_i_node(_l.Spamex, "Punctuator", ":"),
657
- type: _t.s_node(_l.Spamex, "Identifier", "Pattern"),
658
- closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
1077
+ values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`open`], {
1078
+ open: _t.node(_l.Spamex, "OpenNodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`language`, _t.ref`namespaceSeparatorToken`, _t.ref`type`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`selfClosingTagToken`, _t.ref`closeToken`], {
1079
+ openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
1080
+ flags: _t.node(_l.CSTML, "Flags", [], {}, {}),
1081
+ language: _t.s_node(_l.Spamex, "Identifier", "Regex"),
1082
+ namespaceSeparatorToken: _t.s_i_node(_l.Spamex, "Punctuator", ":"),
1083
+ type: _t.s_node(_l.Spamex, "Identifier", "Pattern"),
1084
+ selfClosingTagToken: _t.s_i_node(_l.Spamex, "Punctuator", "/"),
1085
+ closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
1086
+ }, {})
659
1087
  }, {})],
660
1088
  closeToken: _t.s_i_node(_l.Instruction, "Punctuator", ")")
661
1089
  }, {})
@@ -665,15 +1093,18 @@ export const grammar = class SpamexGrammar {
665
1093
  *String() {
666
1094
  yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
667
1095
  verb: _t.s_node(_l.Instruction, "Identifier", "eat"),
668
- arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.ref`closeToken`], {
1096
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.ref`closeToken`], {
669
1097
  openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
670
- values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`language`, _t.ref`namespaceSeparatorToken`, _t.ref`type`, _t.ref`closeToken`], {
671
- openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
672
- flags: _t.node(_l.CSTML, "Flags", [], {}, {}),
673
- language: _t.s_node(_l.Spamex, "Identifier", "CSTML"),
674
- namespaceSeparatorToken: _t.s_i_node(_l.Spamex, "Punctuator", ":"),
675
- type: _t.s_node(_l.Spamex, "Identifier", "String"),
676
- closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
1098
+ values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`open`], {
1099
+ open: _t.node(_l.Spamex, "OpenNodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`language`, _t.ref`namespaceSeparatorToken`, _t.ref`type`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`selfClosingTagToken`, _t.ref`closeToken`], {
1100
+ openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
1101
+ flags: _t.node(_l.CSTML, "Flags", [], {}, {}),
1102
+ language: _t.s_node(_l.Spamex, "Identifier", "CSTML"),
1103
+ namespaceSeparatorToken: _t.s_i_node(_l.Spamex, "Punctuator", ":"),
1104
+ type: _t.s_node(_l.Spamex, "Identifier", "String"),
1105
+ selfClosingTagToken: _t.s_i_node(_l.Spamex, "Punctuator", "/"),
1106
+ closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
1107
+ }, {})
677
1108
  }, {})],
678
1109
  closeToken: _t.s_i_node(_l.Instruction, "Punctuator", ")")
679
1110
  }, {})
@@ -682,30 +1113,33 @@ export const grammar = class SpamexGrammar {
682
1113
  *Regex() {
683
1114
  yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
684
1115
  verb: _t.s_node(_l.Instruction, "Identifier", "eat"),
685
- arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
1116
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
686
1117
  openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
687
- values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`type`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit(" ")], {}, {})), _t.ref`intrinsicValue`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit(" ")], {}, {})), _t.ref`attributes[]`, _t.ref`closeToken`], {
688
- openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
689
- flags: _t.node(_l.CSTML, "Flags", [_t.ref`intrinsicToken`, _t.ref`tokenToken`], {
690
- intrinsicToken: _t.s_i_node(_l.CSTML, "Punctuator", "~"),
691
- tokenToken: _t.s_i_node(_l.CSTML, "Punctuator", "*")
692
- }, {}),
693
- type: _t.s_node(_l.Spamex, "Identifier", "Punctuator"),
694
- intrinsicValue: _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
695
- openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
696
- content: _t.node(_l.CSTML, "Content", [_t.lit("/")], {}, {}),
697
- closeToken: _t.s_i_node(_l.CSTML, "Punctuator", "'")
698
- }, {}),
699
- attributes: [_t.node(_l.Spamex, "MappingAttribute", [_t.ref`key`, _t.ref`mapToken`, _t.ref`value`], {
700
- key: _t.node(_l.Spamex, "Literal", [_t.lit("balanced")], {}, {}),
701
- mapToken: _t.s_i_node(_l.Spamex, "Punctuator", "="),
702
- value: _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
1118
+ values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`open`], {
1119
+ open: _t.node(_l.Spamex, "OpenNodeMatcher", [12, [[_t.ref`openToken`, _t.ref`flags`, _t.ref`type`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {}))], [_t.ref`intrinsicValue`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`attributes[]`, _t.arr(), _t.ref`attributes[]`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`selfClosingTagToken`, _t.ref`closeToken`]]], {
1120
+ openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
1121
+ flags: _t.node(_l.CSTML, "Flags", [_t.ref`intrinsicToken`, _t.ref`tokenToken`], {
1122
+ intrinsicToken: _t.s_i_node(_l.CSTML, "Punctuator", "~"),
1123
+ tokenToken: _t.s_i_node(_l.CSTML, "Punctuator", "*")
1124
+ }, {}),
1125
+ type: _t.s_node(_l.Spamex, "Identifier", "Punctuator"),
1126
+ intrinsicValue: _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
703
1127
  openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
704
1128
  content: _t.node(_l.CSTML, "Content", [_t.lit("/")], {}, {}),
705
1129
  closeToken: _t.s_i_node(_l.CSTML, "Punctuator", "'")
706
- }, {})
707
- }, {})],
708
- closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
1130
+ }, {}),
1131
+ attributes: [_t.node(_l.Spamex, "MappingAttribute", [_t.ref`key`, _t.ref`mapToken`, _t.ref`value`], {
1132
+ key: _t.s_node(_l.Spamex, "Identifier", "balanced"),
1133
+ mapToken: _t.s_i_node(_l.Spamex, "Punctuator", "="),
1134
+ value: _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
1135
+ openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
1136
+ content: _t.node(_l.CSTML, "Content", [_t.lit("/")], {}, {}),
1137
+ closeToken: _t.s_i_node(_l.CSTML, "Punctuator", "'")
1138
+ }, {})
1139
+ }, {})],
1140
+ selfClosingTagToken: _t.s_i_node(_l.Spamex, "Punctuator", "/"),
1141
+ closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
1142
+ }, {})
709
1143
  }, {}), _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
710
1144
  openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
711
1145
  content: _t.node(_l.CSTML, "Content", [_t.lit("open")], {}, {}),
@@ -716,15 +1150,18 @@ export const grammar = class SpamexGrammar {
716
1150
  }, {});
717
1151
  yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
718
1152
  verb: _t.s_node(_l.Instruction, "Identifier", "eat"),
719
- arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
1153
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
720
1154
  openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
721
- values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`language`, _t.ref`namespaceSeparatorToken`, _t.ref`type`, _t.ref`closeToken`], {
722
- openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
723
- flags: _t.node(_l.CSTML, "Flags", [], {}, {}),
724
- language: _t.s_node(_l.Spamex, "Identifier", "Regex"),
725
- namespaceSeparatorToken: _t.s_i_node(_l.Spamex, "Punctuator", ":"),
726
- type: _t.s_node(_l.Spamex, "Identifier", "Alternatives"),
727
- closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
1155
+ values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`open`], {
1156
+ open: _t.node(_l.Spamex, "OpenNodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`language`, _t.ref`namespaceSeparatorToken`, _t.ref`type`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`selfClosingTagToken`, _t.ref`closeToken`], {
1157
+ openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
1158
+ flags: _t.node(_l.CSTML, "Flags", [], {}, {}),
1159
+ language: _t.s_node(_l.Spamex, "Identifier", "Regex"),
1160
+ namespaceSeparatorToken: _t.s_i_node(_l.Spamex, "Punctuator", ":"),
1161
+ type: _t.s_node(_l.Spamex, "Identifier", "Alternatives"),
1162
+ selfClosingTagToken: _t.s_i_node(_l.Spamex, "Punctuator", "/"),
1163
+ closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
1164
+ }, {})
728
1165
  }, {}), _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
729
1166
  openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
730
1167
  content: _t.node(_l.CSTML, "Content", [_t.lit("alternatives[]")], {}, {}),
@@ -735,24 +1172,27 @@ export const grammar = class SpamexGrammar {
735
1172
  }, {});
736
1173
  yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
737
1174
  verb: _t.s_node(_l.Instruction, "Identifier", "eat"),
738
- arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
1175
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
739
1176
  openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
740
- values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`type`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit(" ")], {}, {})), _t.ref`intrinsicValue`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit(" ")], {}, {})), _t.ref`attributes[]`, _t.ref`closeToken`], {
741
- openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
742
- flags: _t.node(_l.CSTML, "Flags", [_t.ref`intrinsicToken`, _t.ref`tokenToken`], {
743
- intrinsicToken: _t.s_i_node(_l.CSTML, "Punctuator", "~"),
744
- tokenToken: _t.s_i_node(_l.CSTML, "Punctuator", "*")
745
- }, {}),
746
- type: _t.s_node(_l.Spamex, "Identifier", "Punctuator"),
747
- intrinsicValue: _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
748
- openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
749
- content: _t.node(_l.CSTML, "Content", [_t.lit("/")], {}, {}),
750
- closeToken: _t.s_i_node(_l.CSTML, "Punctuator", "'")
751
- }, {}),
752
- attributes: [_t.node(_l.Spamex, "BooleanAttribute", [_t.ref`key`], {
753
- key: _t.node(_l.Spamex, "Literal", [_t.lit("balancer")], {}, {})
754
- }, {})],
755
- closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
1177
+ values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`open`], {
1178
+ open: _t.node(_l.Spamex, "OpenNodeMatcher", [12, [[_t.ref`openToken`, _t.ref`flags`, _t.ref`type`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {}))], [_t.ref`intrinsicValue`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`attributes[]`, _t.arr(), _t.ref`attributes[]`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`selfClosingTagToken`, _t.ref`closeToken`]]], {
1179
+ openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
1180
+ flags: _t.node(_l.CSTML, "Flags", [_t.ref`intrinsicToken`, _t.ref`tokenToken`], {
1181
+ intrinsicToken: _t.s_i_node(_l.CSTML, "Punctuator", "~"),
1182
+ tokenToken: _t.s_i_node(_l.CSTML, "Punctuator", "*")
1183
+ }, {}),
1184
+ type: _t.s_node(_l.Spamex, "Identifier", "Punctuator"),
1185
+ intrinsicValue: _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
1186
+ openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
1187
+ content: _t.node(_l.CSTML, "Content", [_t.lit("/")], {}, {}),
1188
+ closeToken: _t.s_i_node(_l.CSTML, "Punctuator", "'")
1189
+ }, {}),
1190
+ attributes: [_t.node(_l.Spamex, "BooleanAttribute", [_t.ref`key`], {
1191
+ key: _t.s_node(_l.Spamex, "Identifier", "balancer")
1192
+ }, {})],
1193
+ selfClosingTagToken: _t.s_i_node(_l.Spamex, "Punctuator", "/"),
1194
+ closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
1195
+ }, {})
756
1196
  }, {}), _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
757
1197
  openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
758
1198
  content: _t.node(_l.CSTML, "Content", [_t.lit("close")], {}, {}),
@@ -763,15 +1203,18 @@ export const grammar = class SpamexGrammar {
763
1203
  }, {});
764
1204
  yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
765
1205
  verb: _t.s_node(_l.Instruction, "Identifier", "eat"),
766
- arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.embedded(_t.s_t_node(_l.Space, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
1206
+ arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), _t.ref`values[]`, _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
767
1207
  openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
768
- values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`language`, _t.ref`namespaceSeparatorToken`, _t.ref`type`, _t.ref`closeToken`], {
769
- openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
770
- flags: _t.node(_l.CSTML, "Flags", [], {}, {}),
771
- language: _t.s_node(_l.Spamex, "Identifier", "Regex"),
772
- namespaceSeparatorToken: _t.s_i_node(_l.Spamex, "Punctuator", ":"),
773
- type: _t.s_node(_l.Spamex, "Identifier", "Flags"),
774
- closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
1208
+ values: [_t.node(_l.Spamex, "NodeMatcher", [_t.ref`open`], {
1209
+ open: _t.node(_l.Spamex, "OpenNodeMatcher", [_t.ref`openToken`, _t.ref`flags`, _t.ref`language`, _t.ref`namespaceSeparatorToken`, _t.ref`type`, _t.embedded(_t.node(_l.Spamex, "Space", [_t.lit(" ")], {}, {})), _t.ref`selfClosingTagToken`, _t.ref`closeToken`], {
1210
+ openToken: _t.s_i_node(_l.Spamex, "Punctuator", "<"),
1211
+ flags: _t.node(_l.CSTML, "Flags", [], {}, {}),
1212
+ language: _t.s_node(_l.Spamex, "Identifier", "Regex"),
1213
+ namespaceSeparatorToken: _t.s_i_node(_l.Spamex, "Punctuator", ":"),
1214
+ type: _t.s_node(_l.Spamex, "Identifier", "Flags"),
1215
+ selfClosingTagToken: _t.s_i_node(_l.Spamex, "Punctuator", "/"),
1216
+ closeToken: _t.s_i_node(_l.Spamex, "Punctuator", ">")
1217
+ }, {})
775
1218
  }, {}), _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
776
1219
  openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
777
1220
  content: _t.node(_l.CSTML, "Content", [_t.lit("flags")], {}, {}),