@bablr/language-en-regex-vm-pattern 0.7.1 → 0.9.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 +151 -10216
- package/lib/grammar.macro.js +147 -127
- package/package.json +16 -9
package/lib/grammar.macro.js
CHANGED
|
@@ -1,14 +1,25 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { re, spam as m } from '@bablr/boot';
|
|
2
2
|
import {
|
|
3
3
|
Node,
|
|
4
4
|
CoveredBy,
|
|
5
5
|
InjectFrom,
|
|
6
|
-
|
|
6
|
+
UndefinedAttributes,
|
|
7
7
|
AllowEmpty,
|
|
8
|
+
Literal,
|
|
8
9
|
} from '@bablr/helpers/decorators';
|
|
9
10
|
import objectEntries from 'iter-tools-es/methods/object-entries';
|
|
10
11
|
import * as Shared from '@bablr/helpers/productions';
|
|
11
|
-
import {
|
|
12
|
+
import {
|
|
13
|
+
eat,
|
|
14
|
+
eatMatch,
|
|
15
|
+
match,
|
|
16
|
+
holdForMatch,
|
|
17
|
+
guard,
|
|
18
|
+
defineAttribute,
|
|
19
|
+
fail,
|
|
20
|
+
o,
|
|
21
|
+
} from '@bablr/helpers/grammar';
|
|
22
|
+
import { buildString, buildBoolean } from '@bablr/helpers/builders';
|
|
12
23
|
|
|
13
24
|
export const canonicalURL = 'https://bablr.org/languages/core/en/bablr-regex-pattern';
|
|
14
25
|
|
|
@@ -66,17 +77,17 @@ const getSpecialPattern = (span) => {
|
|
|
66
77
|
export const grammar = class RegexGrammar {
|
|
67
78
|
@Node
|
|
68
79
|
*Pattern() {
|
|
69
|
-
yield
|
|
70
|
-
yield
|
|
71
|
-
yield
|
|
72
|
-
yield
|
|
80
|
+
yield eat(m`openToken: <*Punctuator '/' { balanced: '/', balancedSpan: 'Pattern' } />`);
|
|
81
|
+
yield eat(m`<_Alternatives />`);
|
|
82
|
+
yield eat(m`closeToken: <*Punctuator '/' { balancer: true } />`);
|
|
83
|
+
yield eat(m`flags$: <Flags />`);
|
|
73
84
|
}
|
|
74
85
|
|
|
75
|
-
@
|
|
86
|
+
@UndefinedAttributes(Object.keys(flagCharacters))
|
|
76
87
|
@AllowEmpty
|
|
77
88
|
@Node
|
|
78
89
|
*Flags({ ctx }) {
|
|
79
|
-
const flags = yield
|
|
90
|
+
const flags = yield match(re`/[gimsuy]+/`);
|
|
80
91
|
|
|
81
92
|
const flagsStr = ctx.sourceTextFor(flags) || '';
|
|
82
93
|
|
|
@@ -84,212 +95,216 @@ export const grammar = class RegexGrammar {
|
|
|
84
95
|
|
|
85
96
|
for (const { 0: name, 1: chr } of Object.entries(flagCharacters)) {
|
|
86
97
|
if (flagsStr.includes(chr)) {
|
|
87
|
-
yield
|
|
98
|
+
yield defineAttribute(name, true);
|
|
88
99
|
} else {
|
|
89
|
-
yield
|
|
100
|
+
yield defineAttribute(name, false);
|
|
90
101
|
}
|
|
91
102
|
}
|
|
92
103
|
|
|
93
104
|
for (const flagChr of flagsStr) {
|
|
94
|
-
yield
|
|
105
|
+
yield eat(m`tokens[]: <*Keyword ${buildString(flagChr)} />`);
|
|
95
106
|
}
|
|
96
107
|
}
|
|
97
108
|
|
|
98
109
|
@AllowEmpty
|
|
99
110
|
*Alternatives() {
|
|
100
111
|
do {
|
|
101
|
-
yield
|
|
102
|
-
} while (yield
|
|
112
|
+
yield eat(m`alternatives[]$: <Alternative />`);
|
|
113
|
+
} while (yield eatMatch(m`separatorTokens[]: <*Punctuator '|' />`));
|
|
103
114
|
}
|
|
104
115
|
|
|
105
116
|
@AllowEmpty
|
|
106
117
|
@Node
|
|
107
118
|
*Alternative() {
|
|
108
|
-
yield
|
|
119
|
+
yield eat(m`elements[]+$: <_Elements />`);
|
|
109
120
|
}
|
|
110
121
|
|
|
111
122
|
@AllowEmpty
|
|
112
123
|
*Elements() {
|
|
113
|
-
yield
|
|
114
|
-
while (yield
|
|
115
|
-
yield
|
|
124
|
+
yield eat(m`.[]: []`);
|
|
125
|
+
while (yield match(re`/[^|]/`)) {
|
|
126
|
+
yield eat(m`.[]+: <__Element />`);
|
|
116
127
|
}
|
|
117
128
|
}
|
|
118
129
|
|
|
119
130
|
*Element() {
|
|
120
|
-
yield
|
|
121
|
-
|
|
122
|
-
yield
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
if (yield
|
|
132
|
-
return
|
|
131
|
+
yield guard(m`<*Keyword /[*+?]/ />`);
|
|
132
|
+
|
|
133
|
+
yield eat(m`<_Any />`, [
|
|
134
|
+
m`<CharacterClass '[' />`,
|
|
135
|
+
m`<Group '(?:' />`,
|
|
136
|
+
m`<__Assertion /[$^]|\\b/i />`,
|
|
137
|
+
m`<Gap '\\g' />`,
|
|
138
|
+
m`<__CharacterSet /\.|\\[dswp]/i />`,
|
|
139
|
+
m`<*Character />`,
|
|
140
|
+
]);
|
|
141
|
+
|
|
142
|
+
if (yield match(re`/[*+?{]/`)) {
|
|
143
|
+
return holdForMatch(m`<Quantifier />`);
|
|
133
144
|
}
|
|
134
145
|
}
|
|
135
146
|
|
|
136
147
|
@CoveredBy('Element')
|
|
137
148
|
@Node
|
|
138
149
|
*Group() {
|
|
139
|
-
yield
|
|
140
|
-
yield
|
|
141
|
-
yield
|
|
150
|
+
yield eat(m`openToken: <*Punctuator '(?:' { balanced: ')' } />`);
|
|
151
|
+
yield eat(m`<_Alternatives />`);
|
|
152
|
+
yield eat(m`closeToken: <*Punctuator ')' { balancer: true } />`);
|
|
142
153
|
}
|
|
143
154
|
|
|
144
155
|
@Node
|
|
145
156
|
*CapturingGroup() {
|
|
146
|
-
yield
|
|
147
|
-
yield
|
|
148
|
-
yield
|
|
157
|
+
yield eat(m`openToken: <*Punctuator '(' { balanced: ')' } />`);
|
|
158
|
+
yield eat(m`<_Alternatives />`);
|
|
159
|
+
yield eat(m`closeToken: <*Punctuator ')' { balancer: true } />`);
|
|
149
160
|
}
|
|
150
161
|
|
|
151
162
|
@CoveredBy('Element')
|
|
152
163
|
*Assertion() {
|
|
153
|
-
yield
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
])
|
|
164
|
+
yield eat(m`<_Any />`, [
|
|
165
|
+
m`<*StartOfInputAssertion '^' />`,
|
|
166
|
+
m`<*EndOfInputAssertion '$' />`,
|
|
167
|
+
m`<*WordBoundaryAssertion /\\b/i />`,
|
|
168
|
+
]);
|
|
158
169
|
}
|
|
159
170
|
|
|
160
171
|
@CoveredBy('Assertion')
|
|
161
172
|
@Node
|
|
162
173
|
*StartOfInputAssertion() {
|
|
163
|
-
yield
|
|
174
|
+
yield eat(m`sigilToken: <*Keyword '^' />`);
|
|
164
175
|
}
|
|
165
176
|
|
|
166
177
|
@CoveredBy('Assertion')
|
|
167
178
|
@Node
|
|
168
179
|
*EndOfInputAssertion() {
|
|
169
|
-
yield
|
|
180
|
+
yield eatMatch(m`sigilToken: <*Keyword '$' />`);
|
|
170
181
|
}
|
|
171
182
|
|
|
172
|
-
@
|
|
183
|
+
@UndefinedAttributes(['negate'])
|
|
173
184
|
@CoveredBy('Assertion')
|
|
174
185
|
@Node
|
|
175
186
|
*WordBoundaryAssertion({ ctx }) {
|
|
176
|
-
yield
|
|
177
|
-
const
|
|
178
|
-
yield
|
|
187
|
+
yield eatMatch(m`escapeToken: <*Punctuator '\\' />`);
|
|
188
|
+
const m_ = yield eat(m`value: <*Keyword /b/i />`);
|
|
189
|
+
yield defineAttribute('negate', buildBoolean(ctx.sourceTextFor(m_) === 'B'));
|
|
179
190
|
}
|
|
180
191
|
|
|
181
192
|
@CoveredBy('Assertion')
|
|
182
193
|
@Node
|
|
183
194
|
*Gap() {
|
|
184
|
-
yield
|
|
185
|
-
yield
|
|
195
|
+
yield eatMatch(m`escapeToken: <*Punctuator '\\' />`);
|
|
196
|
+
yield eat(m`value: <*Keyword 'g' />`);
|
|
186
197
|
}
|
|
187
198
|
|
|
188
199
|
@CoveredBy('Element')
|
|
189
200
|
@CoveredBy('CharacterClassElement')
|
|
190
201
|
@Node
|
|
191
202
|
*Character() {
|
|
192
|
-
if (yield
|
|
193
|
-
yield
|
|
203
|
+
if (yield match('\\')) {
|
|
204
|
+
yield eat(m`@: <EscapeSequence />`);
|
|
194
205
|
} else {
|
|
195
|
-
yield
|
|
206
|
+
yield eat(re`/[^\r\n\t]/`);
|
|
196
207
|
}
|
|
197
208
|
}
|
|
198
209
|
|
|
199
|
-
@
|
|
210
|
+
@UndefinedAttributes(['negate'])
|
|
200
211
|
@CoveredBy('Element')
|
|
201
212
|
@Node
|
|
202
213
|
*CharacterClass() {
|
|
203
|
-
yield
|
|
214
|
+
yield eat(m`openToken: <*Punctuator '[' { balancedSpan: 'CharacterClass', balanced: ']' } />`);
|
|
204
215
|
|
|
205
|
-
let
|
|
216
|
+
let negate = yield eatMatch(m`negateToken: <*Keyword '^' />`, null, o({ bind: true }));
|
|
206
217
|
|
|
207
|
-
yield
|
|
218
|
+
yield defineAttribute('negate', !!negate);
|
|
208
219
|
|
|
209
|
-
while (yield
|
|
210
|
-
yield
|
|
220
|
+
while (yield match(re`/./s`)) {
|
|
221
|
+
yield eat(m`elements[]+$: <__CharacterClassElement />`);
|
|
211
222
|
}
|
|
212
223
|
|
|
213
|
-
yield
|
|
224
|
+
yield eat(m`closeToken: <*Punctuator ']' { balancer: true } />`);
|
|
214
225
|
}
|
|
215
226
|
|
|
216
227
|
*CharacterClassElement() {
|
|
217
|
-
yield
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
if (yield
|
|
224
|
-
return
|
|
228
|
+
yield eat(m`<_Any />`, [
|
|
229
|
+
m`<__CharacterSet /\\[dswp]/i />`,
|
|
230
|
+
m`<Gap '\\g' />`,
|
|
231
|
+
m`<*Character />`,
|
|
232
|
+
]);
|
|
233
|
+
|
|
234
|
+
if (yield match('-')) {
|
|
235
|
+
return holdForMatch(m`<CharacterClassRange />`);
|
|
225
236
|
}
|
|
226
237
|
}
|
|
227
238
|
|
|
228
239
|
@CoveredBy('CharacterClassElement')
|
|
229
240
|
@Node
|
|
230
241
|
*CharacterClassRange() {
|
|
231
|
-
yield
|
|
232
|
-
yield
|
|
233
|
-
yield
|
|
242
|
+
yield eat(m`min+$: <*Character />`);
|
|
243
|
+
yield eat(m`sigilToken: <*Punctuator '-' />`);
|
|
244
|
+
yield eat(m`max+$: <*Character />`);
|
|
234
245
|
}
|
|
235
246
|
|
|
236
247
|
@CoveredBy('Element')
|
|
237
248
|
*CharacterSet() {
|
|
238
|
-
yield
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
])
|
|
249
|
+
yield eat(m`<_Any />`, [
|
|
250
|
+
m`<AnyCharacterSet '.' />`,
|
|
251
|
+
m`<DigitCharacterSet /\\[dD]/ />`,
|
|
252
|
+
m`<SpaceCharacterSet /\\[sS]/ />`,
|
|
253
|
+
m`<WordCharacterSet /\\[wW]/ />`,
|
|
254
|
+
]);
|
|
244
255
|
}
|
|
245
256
|
|
|
257
|
+
@CoveredBy('Element')
|
|
246
258
|
@CoveredBy('CharacterSet')
|
|
247
259
|
@Node
|
|
248
260
|
*AnyCharacterSet() {
|
|
249
|
-
yield
|
|
261
|
+
yield eat(m`sigilToken: <*Keyword '.' />`);
|
|
250
262
|
}
|
|
251
263
|
|
|
252
|
-
@
|
|
264
|
+
@UndefinedAttributes(['negate'])
|
|
265
|
+
@CoveredBy('Element')
|
|
253
266
|
@CoveredBy('CharacterSet')
|
|
254
267
|
@Node
|
|
255
268
|
*DigitCharacterSet({ ctx }) {
|
|
256
|
-
yield
|
|
269
|
+
yield eat(m`escapeToken: <*Punctuator '\\' />`);
|
|
257
270
|
|
|
258
|
-
let code = yield
|
|
271
|
+
let code = yield eat(m`value: <*Keyword /[dD]/ />`);
|
|
259
272
|
|
|
260
|
-
yield
|
|
273
|
+
yield defineAttribute('negate', ctx.sourceTextFor(code) === 'D');
|
|
261
274
|
}
|
|
262
275
|
|
|
263
|
-
@
|
|
276
|
+
@UndefinedAttributes(['negate'])
|
|
277
|
+
@CoveredBy('Element')
|
|
264
278
|
@CoveredBy('CharacterSet')
|
|
265
279
|
@Node
|
|
266
280
|
*SpaceCharacterSet({ ctx }) {
|
|
267
|
-
yield
|
|
281
|
+
yield eat(m`escapeToken: <*Punctuator '\\' />`);
|
|
268
282
|
|
|
269
|
-
let code = yield
|
|
283
|
+
let code = yield eat(m`value: <*Keyword /[sS]/ />`);
|
|
270
284
|
|
|
271
|
-
yield
|
|
285
|
+
yield defineAttribute('negate', ctx.sourceTextFor(code) === 'S');
|
|
272
286
|
}
|
|
273
287
|
|
|
274
|
-
@
|
|
288
|
+
@UndefinedAttributes(['negate'])
|
|
289
|
+
@CoveredBy('Element')
|
|
275
290
|
@CoveredBy('CharacterSet')
|
|
276
291
|
@Node
|
|
277
292
|
*WordCharacterSet({ ctx }) {
|
|
278
|
-
yield
|
|
293
|
+
yield eat(m`escapeToken: <*Punctuator '\\' />`);
|
|
279
294
|
|
|
280
|
-
let code = yield
|
|
295
|
+
let code = yield eat(m`value: <*Keyword /[wW]/ />`);
|
|
281
296
|
|
|
282
|
-
yield
|
|
297
|
+
yield defineAttribute('negate', ctx.sourceTextFor(code) === 'W');
|
|
283
298
|
}
|
|
284
299
|
|
|
285
|
-
@
|
|
300
|
+
@UndefinedAttributes(['min', 'max'])
|
|
286
301
|
@Node
|
|
287
302
|
*Quantifier({ ctx }) {
|
|
288
|
-
yield
|
|
303
|
+
yield eat(m`element+$: <__Element />`);
|
|
289
304
|
|
|
290
305
|
let attrs, sigil;
|
|
291
306
|
|
|
292
|
-
if ((sigil = yield
|
|
307
|
+
if ((sigil = yield eatMatch(m`sigilToken: <*Keyword /[*+?]/ />`))) {
|
|
293
308
|
switch (ctx.sourceTextFor(sigil)) {
|
|
294
309
|
case '*':
|
|
295
310
|
attrs = { min: 0, max: Infinity };
|
|
@@ -301,12 +316,12 @@ export const grammar = class RegexGrammar {
|
|
|
301
316
|
attrs = { min: 0, max: 1 };
|
|
302
317
|
break;
|
|
303
318
|
}
|
|
304
|
-
} else if (yield
|
|
319
|
+
} else if (yield eat(m`openToken: <*Punctuator '{' { balanced: '}' } />`)) {
|
|
305
320
|
let max;
|
|
306
|
-
let min = yield
|
|
321
|
+
let min = yield eat(m`min$: <*UnsignedInteger />`);
|
|
307
322
|
|
|
308
|
-
if (yield
|
|
309
|
-
max = yield
|
|
323
|
+
if (yield eatMatch(m`separator: <*Punctuator ',' />`)) {
|
|
324
|
+
max = yield eatMatch(m`max$: <*UnsignedInteger />`);
|
|
310
325
|
}
|
|
311
326
|
|
|
312
327
|
min = min && ctx.sourceTextFor(min);
|
|
@@ -317,74 +332,79 @@ export const grammar = class RegexGrammar {
|
|
|
317
332
|
|
|
318
333
|
attrs = { min, max };
|
|
319
334
|
|
|
320
|
-
yield
|
|
335
|
+
yield eat(m`closeToken: <*Punctuator '}' { balancer: true } />`);
|
|
321
336
|
}
|
|
322
337
|
|
|
323
|
-
yield
|
|
324
|
-
yield
|
|
338
|
+
yield defineAttribute('min', attrs.min);
|
|
339
|
+
yield defineAttribute('max', attrs.max);
|
|
325
340
|
}
|
|
326
341
|
|
|
327
342
|
@Node
|
|
328
343
|
*UnsignedInteger() {
|
|
329
|
-
yield
|
|
344
|
+
yield eat(re`/\d+/`);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
@Node
|
|
348
|
+
*UnsignedHexInteger() {
|
|
349
|
+
yield eat(re`/[\da-fA-F]+/`);
|
|
330
350
|
}
|
|
331
351
|
|
|
332
352
|
@Node
|
|
333
|
-
*EscapeSequence({ state, ctx
|
|
353
|
+
*EscapeSequence({ state, ctx }) {
|
|
334
354
|
const parentSpan = state.span;
|
|
335
355
|
|
|
336
|
-
yield
|
|
356
|
+
yield eat(m`escape: <*Punctuator '\\' { openSpan: 'Escape' } />`);
|
|
337
357
|
|
|
338
|
-
let
|
|
358
|
+
let m_;
|
|
339
359
|
|
|
340
|
-
if ((
|
|
341
|
-
const match_ = ctx.sourceTextFor(
|
|
342
|
-
yield
|
|
343
|
-
} else if (
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
yield
|
|
348
|
-
} else if (yield i`match(/[ux]/)`) {
|
|
349
|
-
yield i`eat(<EscapeCode closeSpan='Escape' /> 'code')`;
|
|
360
|
+
if ((m_ = yield match(re`/[\\/nrt0]/`))) {
|
|
361
|
+
const match_ = ctx.sourceTextFor(m_);
|
|
362
|
+
yield eat(m`code: <*Keyword ${buildString(match_)} { closeSpan: 'Escape' } />`);
|
|
363
|
+
} else if ((m_ = yield match(getSpecialPattern(parentSpan)))) {
|
|
364
|
+
const match_ = ctx.sourceTextFor(m_);
|
|
365
|
+
yield eat(m`code: <*Keyword ${buildString(match_)} { closeSpan: 'Escape' } />`);
|
|
366
|
+
} else if (yield match(re`/[ux]/`)) {
|
|
367
|
+
yield eat(m`code: <EscapeCode { closeSpan: 'Escape' } />`);
|
|
350
368
|
} else {
|
|
351
|
-
yield
|
|
369
|
+
yield fail();
|
|
352
370
|
}
|
|
353
371
|
}
|
|
354
372
|
|
|
355
373
|
@Node
|
|
356
374
|
*EscapeCode() {
|
|
357
|
-
if (yield
|
|
358
|
-
if (yield
|
|
359
|
-
yield
|
|
360
|
-
yield
|
|
375
|
+
if (yield eatMatch(m`type: <*Keyword 'u' />`)) {
|
|
376
|
+
if (yield eatMatch(m`openToken: <*Punctuator '{' />`)) {
|
|
377
|
+
yield eatMatch(m`value$: <*UnsignedHexInteger />`);
|
|
378
|
+
yield eat(m`closeToken: <*Punctuator '}' />`);
|
|
361
379
|
} else {
|
|
362
|
-
yield
|
|
363
|
-
yield
|
|
380
|
+
yield eat(m`value$: <*UnsignedHexInteger /[\da-fA-F]{4}/ />`);
|
|
381
|
+
yield eat(m`closeToken: null`);
|
|
364
382
|
}
|
|
365
|
-
} else if (yield
|
|
366
|
-
yield
|
|
367
|
-
yield
|
|
368
|
-
yield
|
|
383
|
+
} else if (yield eatMatch(m`type: <*Keyword 'x' />`)) {
|
|
384
|
+
yield eat(m`openToken: null`);
|
|
385
|
+
yield eat(m`value$: <*UnsignedHexInteger /[\da-fA-F]{2}/ />`);
|
|
386
|
+
yield eat(m`closeToken: null`);
|
|
369
387
|
}
|
|
370
388
|
}
|
|
371
389
|
|
|
372
390
|
*Digits() {
|
|
373
|
-
while (yield
|
|
391
|
+
while (yield eatMatch(m`<*Digit />`));
|
|
374
392
|
}
|
|
375
393
|
|
|
376
394
|
@Node
|
|
377
395
|
*Digit() {
|
|
378
|
-
yield
|
|
396
|
+
yield eat(re`/\d/`);
|
|
379
397
|
}
|
|
380
398
|
|
|
381
399
|
@InjectFrom(Shared)
|
|
382
400
|
*Any() {}
|
|
383
401
|
|
|
402
|
+
@Literal
|
|
384
403
|
@Node
|
|
385
404
|
@InjectFrom(Shared)
|
|
386
405
|
*Keyword() {}
|
|
387
406
|
|
|
407
|
+
@Literal
|
|
388
408
|
@Node
|
|
389
409
|
@InjectFrom(Shared)
|
|
390
410
|
*Punctuator() {}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bablr/language-en-regex-vm-pattern",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "A BABLR language for nonbacktracking JS-style regexes",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": ">=12.0.0"
|
|
@@ -10,7 +10,9 @@
|
|
|
10
10
|
".": "./lib/grammar.js",
|
|
11
11
|
"./package.json": "./package.json"
|
|
12
12
|
},
|
|
13
|
-
"files": [
|
|
13
|
+
"files": [
|
|
14
|
+
"lib/**/*.js"
|
|
15
|
+
],
|
|
14
16
|
"sideEffects": false,
|
|
15
17
|
"scripts": {
|
|
16
18
|
"build": "macrome build",
|
|
@@ -20,18 +22,18 @@
|
|
|
20
22
|
},
|
|
21
23
|
"dependencies": {
|
|
22
24
|
"@babel/runtime": "^7.23.2",
|
|
23
|
-
"@bablr/
|
|
24
|
-
"@bablr/
|
|
25
|
-
"@bablr/agast-
|
|
26
|
-
"
|
|
25
|
+
"@bablr/boot": "0.8.1",
|
|
26
|
+
"@bablr/helpers": "0.22.1",
|
|
27
|
+
"@bablr/agast-helpers": "0.7.1",
|
|
28
|
+
"@bablr/agast-vm-helpers": "0.7.1",
|
|
29
|
+
"iter-tools-es": "7.5.3"
|
|
27
30
|
},
|
|
28
31
|
"devDependencies": {
|
|
29
|
-
"@bablr/boot": "^0.6.0",
|
|
30
32
|
"@bablr/eslint-config-base": "github:bablr-lang/eslint-config-base#49f5952efed27f94ee9b94340eb1563c440bf64e",
|
|
31
33
|
"@bablr/macrome": "^0.1.3",
|
|
32
34
|
"@bablr/macrome-generator-bablr": "^0.3.2",
|
|
33
35
|
"@qnighy/dedent": "0.1.1",
|
|
34
|
-
"bablr": "^0.
|
|
36
|
+
"bablr": "^0.7.0",
|
|
35
37
|
"enhanced-resolve": "^5.12.0",
|
|
36
38
|
"eslint": "^8.47.0",
|
|
37
39
|
"eslint-import-resolver-enhanced-resolve": "^1.0.5",
|
|
@@ -40,7 +42,12 @@
|
|
|
40
42
|
"mocha": "^10.4.0",
|
|
41
43
|
"prettier": "^2.0.5"
|
|
42
44
|
},
|
|
43
|
-
"keywords": [
|
|
45
|
+
"keywords": [
|
|
46
|
+
"bablr-language",
|
|
47
|
+
"grammar",
|
|
48
|
+
"english",
|
|
49
|
+
"regex"
|
|
50
|
+
],
|
|
44
51
|
"repository": "git@github.com:bablr-lang/language-en-regex-vm-pattern.git",
|
|
45
52
|
"homepage": "https://github.com/bablr-lang/language-en-regex-vm-pattern",
|
|
46
53
|
"author": "Conrad Buck <conartist6@gmail.com>",
|