@bablr/helpers 0.18.2 → 0.20.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/decorators.js +7 -0
- package/lib/grammar.js +10 -9
- package/lib/productions.js +37 -38
- package/lib/productions.macro.js +2 -4
- package/lib/source.js +10 -10
- package/lib/stream.js +30 -27
- package/lib/symbols.js +1 -1
- package/lib/tree.js +1 -1
- package/lib/trivia.js +3 -6
- package/package.json +7 -7
package/lib/decorators.js
CHANGED
|
@@ -49,3 +49,10 @@ export const Attributes = (attributes) => (desc, context) => {
|
|
|
49
49
|
this.attributes.set(context.name, attributes);
|
|
50
50
|
});
|
|
51
51
|
};
|
|
52
|
+
|
|
53
|
+
export const UnboundAttributes = (attributes) => (desc, context) => {
|
|
54
|
+
context.addInitializer(function () {
|
|
55
|
+
this.unboundAttributes = this.unboundAttributes || new Map();
|
|
56
|
+
this.unboundAttributes.set(context.name, attributes);
|
|
57
|
+
});
|
|
58
|
+
};
|
package/lib/grammar.js
CHANGED
|
@@ -2,6 +2,7 @@ import every from 'iter-tools-es/methods/every';
|
|
|
2
2
|
import isString from 'iter-tools-es/methods/is-string';
|
|
3
3
|
import objectEntries from 'iter-tools-es/methods/object-entries';
|
|
4
4
|
import { getPrototypeOf } from './object.js';
|
|
5
|
+
import { OpenNodeTag, CloseNodeTag } from './symbols.js';
|
|
5
6
|
|
|
6
7
|
const { isArray } = Array;
|
|
7
8
|
const isSymbol = (value) => typeof value === 'symbol';
|
|
@@ -110,14 +111,14 @@ export const buildDependentLanguages = (language, transformLanguage = (l) => l)
|
|
|
110
111
|
|
|
111
112
|
const arrayLast = (arr) => arr[arr.length - 1];
|
|
112
113
|
|
|
113
|
-
export function* zipLanguages(
|
|
114
|
+
export function* zipLanguages(tags, rootLanguage) {
|
|
114
115
|
const languages = [rootLanguage];
|
|
115
116
|
|
|
116
|
-
for (const
|
|
117
|
-
switch (
|
|
118
|
-
case
|
|
119
|
-
if (
|
|
120
|
-
const dependentLanguage = languages.dependencies[
|
|
117
|
+
for (const tag of tags) {
|
|
118
|
+
switch (tag.type) {
|
|
119
|
+
case OpenNodeTag: {
|
|
120
|
+
if (tag.value.language) {
|
|
121
|
+
const dependentLanguage = languages.dependencies[tag.value.language];
|
|
121
122
|
|
|
122
123
|
if (!dependentLanguage) throw new Error('language was not a dependency');
|
|
123
124
|
|
|
@@ -126,14 +127,14 @@ export function* zipLanguages(tokens, rootLanguage) {
|
|
|
126
127
|
break;
|
|
127
128
|
}
|
|
128
129
|
|
|
129
|
-
case
|
|
130
|
-
if (
|
|
130
|
+
case CloseNodeTag: {
|
|
131
|
+
if (tag.value.language !== arrayLast(languages).canonicalURL) {
|
|
131
132
|
languages.pop();
|
|
132
133
|
}
|
|
133
134
|
break;
|
|
134
135
|
}
|
|
135
136
|
}
|
|
136
137
|
|
|
137
|
-
yield [
|
|
138
|
+
yield [tag, arrayLast(languages)];
|
|
138
139
|
}
|
|
139
140
|
}
|
package/lib/productions.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/* @macrome
|
|
2
2
|
* @generatedby @bablr/macrome-generator-bablr
|
|
3
|
-
* @generatedfrom ./productions.macro.js#
|
|
3
|
+
* @generatedfrom ./productions.macro.js#ab30a55dff3676ff2418023be450dabe54386ee0
|
|
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
|
*/
|
|
7
|
-
import { interpolateArray as _interpolateArray,
|
|
7
|
+
import { interpolateArray as _interpolateArray, interpolateFragmentChildren as _interpolateFragmentChildren, interpolateString as _interpolateString } from "@bablr/agast-helpers/template";
|
|
8
8
|
import * as _l from "@bablr/agast-vm-helpers/languages";
|
|
9
9
|
import * as _t from "@bablr/agast-helpers/shorthand";
|
|
10
10
|
export function* List({
|
|
@@ -17,51 +17,50 @@ export function* List({
|
|
|
17
17
|
allowHoles = false,
|
|
18
18
|
allowTrailingSeparator = true
|
|
19
19
|
} = ctx.unbox(props);
|
|
20
|
+
yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
|
|
21
|
+
verb: _t.s_node(_l.Instruction, "Identifier", "eat"),
|
|
22
|
+
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`], {
|
|
23
|
+
openToken: _t.s_node(_l.Instruction, "Punctuator", "("),
|
|
24
|
+
values: [_t.node(_l.Instruction, "Array", [_t.ref`openToken`, _t.ref`closeToken`], {
|
|
25
|
+
openToken: _t.s_node(_l.Instruction, "Punctuator", "["),
|
|
26
|
+
closeToken: _t.s_node(_l.Instruction, "Punctuator", "]")
|
|
27
|
+
}, {}), _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
|
|
28
|
+
openToken: _t.s_node(_l.CSTML, "Punctuator", "'"),
|
|
29
|
+
content: _t.node(_l.CSTML, "Content", [_t.lit("separators[]")], {}, {}),
|
|
30
|
+
closeToken: _t.s_node(_l.CSTML, "Punctuator", "'")
|
|
31
|
+
}, {})],
|
|
32
|
+
closeToken: _t.s_node(_l.Instruction, "Punctuator", ")")
|
|
33
|
+
}, {})
|
|
34
|
+
}, {});
|
|
20
35
|
let sep,
|
|
21
36
|
it,
|
|
22
37
|
anySep = false;
|
|
23
38
|
for (;;) {
|
|
24
39
|
it = yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
|
|
25
40
|
verb: _t.s_node(_l.Instruction, "Identifier", "eatMatch"),
|
|
26
|
-
arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`,
|
|
27
|
-
openToken: _t.
|
|
41
|
+
arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), ..._interpolateFragmentChildren(element, _t.ref`values[]`), _t.ref`closeToken`], {
|
|
42
|
+
openToken: _t.s_node(_l.Instruction, "Punctuator", "("),
|
|
28
43
|
values: [..._interpolateArray(element)],
|
|
29
|
-
closeToken: _t.
|
|
44
|
+
closeToken: _t.s_node(_l.Instruction, "Punctuator", ")")
|
|
30
45
|
}, {})
|
|
31
46
|
}, {});
|
|
32
47
|
if (it || allowTrailingSeparator) {
|
|
33
48
|
sep = yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
|
|
34
49
|
verb: _t.s_node(_l.Instruction, "Identifier", "eatMatch"),
|
|
35
|
-
arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`,
|
|
36
|
-
openToken: _t.
|
|
50
|
+
arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), ..._interpolateFragmentChildren(separator, _t.ref`values[]`), _t.embedded(_t.node(_l.Instruction, "Space", [_t.lit(" ")], {}, {})), _t.ref`values[]`, _t.ref`closeToken`], {
|
|
51
|
+
openToken: _t.s_node(_l.Instruction, "Punctuator", "("),
|
|
37
52
|
values: [..._interpolateArray(separator), _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
|
|
38
|
-
openToken: _t.
|
|
53
|
+
openToken: _t.s_node(_l.CSTML, "Punctuator", "'"),
|
|
39
54
|
content: _t.node(_l.CSTML, "Content", [_t.lit("separators[]")], {}, {}),
|
|
40
|
-
closeToken: _t.
|
|
55
|
+
closeToken: _t.s_node(_l.CSTML, "Punctuator", "'")
|
|
41
56
|
}, {})],
|
|
42
|
-
closeToken: _t.
|
|
57
|
+
closeToken: _t.s_node(_l.Instruction, "Punctuator", ")")
|
|
43
58
|
}, {})
|
|
44
59
|
}, {});
|
|
45
60
|
anySep ||= sep;
|
|
46
61
|
}
|
|
47
62
|
if (!(sep || allowHoles)) break;
|
|
48
63
|
}
|
|
49
|
-
if (!anySep) {
|
|
50
|
-
yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
|
|
51
|
-
verb: _t.s_node(_l.Instruction, "Identifier", "eat"),
|
|
52
|
-
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`], {
|
|
53
|
-
openToken: _t.s_i_node(_l.Instruction, "Punctuator", "("),
|
|
54
|
-
values: [_t.node(_l.Instruction, "Null", [_t.ref`sigilToken`], {
|
|
55
|
-
sigilToken: _t.s_i_node(_l.Instruction, "Keyword", "null")
|
|
56
|
-
}, {}), _t.node(_l.CSTML, "String", [_t.ref`openToken`, _t.ref`content`, _t.ref`closeToken`], {
|
|
57
|
-
openToken: _t.s_i_node(_l.CSTML, "Punctuator", "'"),
|
|
58
|
-
content: _t.node(_l.CSTML, "Content", [_t.lit("separators[]")], {}, {}),
|
|
59
|
-
closeToken: _t.s_i_node(_l.CSTML, "Punctuator", "'")
|
|
60
|
-
}, {})],
|
|
61
|
-
closeToken: _t.s_i_node(_l.Instruction, "Punctuator", ")")
|
|
62
|
-
}, {})
|
|
63
|
-
}, {});
|
|
64
|
-
}
|
|
65
64
|
}
|
|
66
65
|
export function* Any({
|
|
67
66
|
value: matchers,
|
|
@@ -70,10 +69,10 @@ export function* Any({
|
|
|
70
69
|
for (const matcher of ctx.unbox(matchers)) {
|
|
71
70
|
if (yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
|
|
72
71
|
verb: _t.s_node(_l.Instruction, "Identifier", "eatMatch"),
|
|
73
|
-
arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`,
|
|
74
|
-
openToken: _t.
|
|
72
|
+
arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), ..._interpolateFragmentChildren(matcher, _t.ref`values[]`), _t.ref`closeToken`], {
|
|
73
|
+
openToken: _t.s_node(_l.Instruction, "Punctuator", "("),
|
|
75
74
|
values: [..._interpolateArray(matcher)],
|
|
76
|
-
closeToken: _t.
|
|
75
|
+
closeToken: _t.s_node(_l.Instruction, "Punctuator", ")")
|
|
77
76
|
}, {})
|
|
78
77
|
}, {})) break;
|
|
79
78
|
}
|
|
@@ -85,10 +84,10 @@ export function* All({
|
|
|
85
84
|
for (const matcher of ctx.unbox(matchers)) {
|
|
86
85
|
yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
|
|
87
86
|
verb: _t.s_node(_l.Instruction, "Identifier", "eat"),
|
|
88
|
-
arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`,
|
|
89
|
-
openToken: _t.
|
|
87
|
+
arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), ..._interpolateFragmentChildren(matcher, _t.ref`values[]`), _t.ref`closeToken`], {
|
|
88
|
+
openToken: _t.s_node(_l.Instruction, "Punctuator", "("),
|
|
90
89
|
values: [..._interpolateArray(matcher)],
|
|
91
|
-
closeToken: _t.
|
|
90
|
+
closeToken: _t.s_node(_l.Instruction, "Punctuator", ")")
|
|
92
91
|
}, {})
|
|
93
92
|
}, {});
|
|
94
93
|
}
|
|
@@ -99,10 +98,10 @@ export function* Punctuator({
|
|
|
99
98
|
if (!intrinsicValue) throw new Error('Intrinsic productions must have value');
|
|
100
99
|
yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
|
|
101
100
|
verb: _t.s_node(_l.Instruction, "Identifier", "eat"),
|
|
102
|
-
arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`,
|
|
103
|
-
openToken: _t.
|
|
101
|
+
arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), ..._interpolateFragmentChildren(intrinsicValue, _t.ref`values[]`), _t.ref`closeToken`], {
|
|
102
|
+
openToken: _t.s_node(_l.Instruction, "Punctuator", "("),
|
|
104
103
|
values: [..._interpolateArray(intrinsicValue)],
|
|
105
|
-
closeToken: _t.
|
|
104
|
+
closeToken: _t.s_node(_l.Instruction, "Punctuator", ")")
|
|
106
105
|
}, {})
|
|
107
106
|
}, {});
|
|
108
107
|
}
|
|
@@ -117,10 +116,10 @@ export function* Optional({
|
|
|
117
116
|
}
|
|
118
117
|
yield _t.node(_l.Instruction, "Call", [_t.ref`verb`, _t.ref`arguments`], {
|
|
119
118
|
verb: _t.s_node(_l.Instruction, "Identifier", "eatMatch"),
|
|
120
|
-
arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`,
|
|
121
|
-
openToken: _t.
|
|
119
|
+
arguments: _t.node(_l.Instruction, "Tuple", [_t.ref`openToken`, _t.ref`values[]`, _t.arr(), ..._interpolateFragmentChildren(matchers_[0], _t.ref`values[]`), _t.ref`closeToken`], {
|
|
120
|
+
openToken: _t.s_node(_l.Instruction, "Punctuator", "("),
|
|
122
121
|
values: [..._interpolateArray(matchers_[0])],
|
|
123
|
-
closeToken: _t.
|
|
122
|
+
closeToken: _t.s_node(_l.Instruction, "Punctuator", ")")
|
|
124
123
|
}, {})
|
|
125
124
|
}, {});
|
|
126
125
|
}
|
package/lib/productions.macro.js
CHANGED
|
@@ -8,6 +8,8 @@ export function* List({ value: props, ctx }) {
|
|
|
8
8
|
allowTrailingSeparator = true,
|
|
9
9
|
} = ctx.unbox(props);
|
|
10
10
|
|
|
11
|
+
yield i`eat([] 'separators[]')`;
|
|
12
|
+
|
|
11
13
|
let sep,
|
|
12
14
|
it,
|
|
13
15
|
anySep = false;
|
|
@@ -19,10 +21,6 @@ export function* List({ value: props, ctx }) {
|
|
|
19
21
|
}
|
|
20
22
|
if (!(sep || allowHoles)) break;
|
|
21
23
|
}
|
|
22
|
-
|
|
23
|
-
if (!anySep) {
|
|
24
|
-
yield i`eat(null 'separators[]')`;
|
|
25
|
-
}
|
|
26
24
|
}
|
|
27
25
|
|
|
28
26
|
export function* Any({ value: matchers, ctx }) {
|
package/lib/source.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import slice from 'iter-tools-es/methods/slice';
|
|
2
2
|
import { streamFromTree } from '@bablr/agast-helpers/tree';
|
|
3
3
|
import { StreamIterable, getStreamIterator } from '@bablr/agast-helpers/stream';
|
|
4
|
+
import { ShiftTag, GapTag, LiteralTag } from './symbols.js';
|
|
4
5
|
|
|
5
6
|
const escapables = {
|
|
6
7
|
n: '\n',
|
|
@@ -91,8 +92,8 @@ function* __embeddedSourceFrom(iterable) {
|
|
|
91
92
|
|
|
92
93
|
export const embeddedSourceFrom = (iterable) => new StreamIterable(__embeddedSourceFrom(iterable));
|
|
93
94
|
|
|
94
|
-
function* __sourceFromTokenStream(
|
|
95
|
-
let iter = getStreamIterator(
|
|
95
|
+
function* __sourceFromTokenStream(Tags) {
|
|
96
|
+
let iter = getStreamIterator(Tags);
|
|
96
97
|
let step;
|
|
97
98
|
|
|
98
99
|
for (;;) {
|
|
@@ -104,18 +105,17 @@ function* __sourceFromTokenStream(terminals) {
|
|
|
104
105
|
|
|
105
106
|
if (step.done) break;
|
|
106
107
|
|
|
107
|
-
const
|
|
108
|
+
const tag = step.value;
|
|
108
109
|
|
|
109
|
-
if (
|
|
110
|
-
yield*
|
|
111
|
-
} else if (
|
|
110
|
+
if (tag.type === LiteralTag) {
|
|
111
|
+
yield* tag.value;
|
|
112
|
+
} else if (tag.type === GapTag) {
|
|
112
113
|
yield null;
|
|
113
114
|
}
|
|
114
115
|
}
|
|
115
116
|
}
|
|
116
117
|
|
|
117
|
-
export const sourceFromTokenStream = (
|
|
118
|
-
new StreamIterable(__sourceFromTokenStream(terminals));
|
|
118
|
+
export const sourceFromTokenStream = (Tags) => new StreamIterable(__sourceFromTokenStream(Tags));
|
|
119
119
|
|
|
120
120
|
function* __sourceFromQuasis(quasis) {
|
|
121
121
|
let first = true;
|
|
@@ -157,11 +157,11 @@ export function* fillGapsWith(expressions, iterable) {
|
|
|
157
157
|
|
|
158
158
|
const token = step.value;
|
|
159
159
|
|
|
160
|
-
if (token.type ===
|
|
160
|
+
if (token.type === ShiftTag) {
|
|
161
161
|
holding = true;
|
|
162
162
|
}
|
|
163
163
|
|
|
164
|
-
if (token.type ===
|
|
164
|
+
if (token.type === GapTag) {
|
|
165
165
|
if (holding) {
|
|
166
166
|
holding = false;
|
|
167
167
|
yield token;
|
package/lib/stream.js
CHANGED
|
@@ -9,12 +9,15 @@ import {
|
|
|
9
9
|
} from '@bablr/agast-helpers/stream';
|
|
10
10
|
import isString from 'iter-tools-es/methods/is-string';
|
|
11
11
|
import emptyStack from '@iter-tools/imm-stack';
|
|
12
|
+
import { DoctypeTag, OpenNodeTag, CloseNodeTag } from './symbols.js';
|
|
12
13
|
|
|
13
14
|
import { unresolveLanguage } from './grammar.js';
|
|
14
15
|
|
|
16
|
+
const { freeze } = Object;
|
|
17
|
+
|
|
15
18
|
// bad: wrecks tree by breaking weak linkages
|
|
16
|
-
function*
|
|
17
|
-
const co = new Coroutine(getStreamIterator(
|
|
19
|
+
function* __resolveTags(ctx, tags) {
|
|
20
|
+
const co = new Coroutine(getStreamIterator(tags));
|
|
18
21
|
let languages = emptyStack;
|
|
19
22
|
|
|
20
23
|
for (;;) {
|
|
@@ -26,60 +29,60 @@ function* __resolveTerminals(ctx, terminals) {
|
|
|
26
29
|
|
|
27
30
|
if (co.done) break;
|
|
28
31
|
|
|
29
|
-
const
|
|
32
|
+
const tag = co.value;
|
|
30
33
|
|
|
31
|
-
if (
|
|
32
|
-
languages = languages.push(ctx.languages.get(
|
|
34
|
+
if (tag.type === DoctypeTag) {
|
|
35
|
+
languages = languages.push(ctx.languages.get(tag.value.attributes['bablr-language']));
|
|
33
36
|
}
|
|
34
37
|
|
|
35
|
-
if (
|
|
38
|
+
if (tag.type === CloseNodeTag) {
|
|
36
39
|
languages = languages.pop();
|
|
37
40
|
}
|
|
38
41
|
|
|
39
|
-
if (
|
|
40
|
-
if (isString(
|
|
42
|
+
if (tag.type === OpenNodeTag) {
|
|
43
|
+
if (isString(tag.value.language)) {
|
|
41
44
|
const currentLanguage = languages.value;
|
|
42
|
-
const nodeLanguageURL =
|
|
45
|
+
const nodeLanguageURL = tag.value.language;
|
|
43
46
|
const nodeLanguage = ctx.languages.get(nodeLanguageURL);
|
|
44
47
|
|
|
45
48
|
languages = languages.push(nodeLanguage);
|
|
46
49
|
|
|
47
|
-
yield {
|
|
48
|
-
type:
|
|
49
|
-
value: {
|
|
50
|
-
...
|
|
50
|
+
yield freeze({
|
|
51
|
+
type: OpenNodeTag,
|
|
52
|
+
value: freeze({
|
|
53
|
+
...tag.value,
|
|
51
54
|
language: unresolveLanguage(ctx, currentLanguage, nodeLanguageURL),
|
|
52
|
-
},
|
|
53
|
-
};
|
|
55
|
+
}),
|
|
56
|
+
});
|
|
54
57
|
} else {
|
|
55
|
-
yield
|
|
58
|
+
yield tag;
|
|
56
59
|
}
|
|
57
60
|
} else {
|
|
58
|
-
yield
|
|
61
|
+
yield tag;
|
|
59
62
|
}
|
|
60
63
|
}
|
|
61
64
|
}
|
|
62
65
|
|
|
63
|
-
export const
|
|
64
|
-
return new StreamIterable(
|
|
66
|
+
export const resolveTags = (ctx, tags) => {
|
|
67
|
+
return new StreamIterable(__resolveTags(ctx, tags));
|
|
65
68
|
};
|
|
66
69
|
|
|
67
|
-
export const generatePrettyCSTMLStrategy = (
|
|
70
|
+
export const generatePrettyCSTMLStrategy = (tags, options = {}) => {
|
|
68
71
|
const { ctx } = options;
|
|
69
72
|
|
|
70
|
-
return generatePrettyCSTML(ctx ?
|
|
73
|
+
return generatePrettyCSTML(ctx ? resolveTags(ctx, tags) : tags, options);
|
|
71
74
|
};
|
|
72
75
|
|
|
73
|
-
export const printPrettyCSTML = (
|
|
74
|
-
return stringFromStream(generateStandardOutput(generatePrettyCSTMLStrategy(
|
|
76
|
+
export const printPrettyCSTML = (tags, options = {}) => {
|
|
77
|
+
return stringFromStream(generateStandardOutput(generatePrettyCSTMLStrategy(tags, options)));
|
|
75
78
|
};
|
|
76
79
|
|
|
77
|
-
export const generateCSTMLStrategy = (
|
|
80
|
+
export const generateCSTMLStrategy = (tags, options = {}) => {
|
|
78
81
|
const { ctx } = options;
|
|
79
82
|
|
|
80
|
-
return generateCSTML(ctx ?
|
|
83
|
+
return generateCSTML(ctx ? resolveTags(ctx, tags) : tags, options);
|
|
81
84
|
};
|
|
82
85
|
|
|
83
|
-
export const printCSTML = (
|
|
84
|
-
return stringFromStream(generateStandardOutput(generateCSTMLStrategy(
|
|
86
|
+
export const printCSTML = (tags, options = {}) => {
|
|
87
|
+
return stringFromStream(generateStandardOutput(generateCSTMLStrategy(tags, options)));
|
|
85
88
|
};
|
package/lib/symbols.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export
|
|
1
|
+
export * from '@bablr/agast-helpers/symbols';
|
package/lib/tree.js
CHANGED
|
@@ -3,6 +3,6 @@ import { streamFromTree } from '@bablr/agast-helpers/tree';
|
|
|
3
3
|
import { printPrettyCSTML as printPrettyCSTMLFromStream } from './stream.js';
|
|
4
4
|
|
|
5
5
|
export const printPrettyCSTML = (rootNode, options = {}) => {
|
|
6
|
-
// i need a context-aware streamFromTree here to build a stream with linked
|
|
6
|
+
// i need a context-aware streamFromTree here to build a stream with linked Tags...?
|
|
7
7
|
return printPrettyCSTMLFromStream(streamFromTree(rootNode), options);
|
|
8
8
|
};
|
package/lib/trivia.js
CHANGED
|
@@ -1,15 +1,12 @@
|
|
|
1
1
|
import { Coroutine } from '@bablr/coroutine';
|
|
2
2
|
import { reifyExpression } from '@bablr/agast-vm-helpers';
|
|
3
3
|
import { mapProductions } from './enhancers.js';
|
|
4
|
+
import { OpenNodeTag, CloseNodeTag, ReferenceTag } from './symbols.js';
|
|
4
5
|
|
|
5
6
|
const lookbehind = (context, s) => {
|
|
6
7
|
let token = s.result;
|
|
7
|
-
while (
|
|
8
|
-
token
|
|
9
|
-
['OpenNodeTag', 'CloseNodeTag', 'Reference'].includes(token.type) &&
|
|
10
|
-
(token.type !== 'OpenNodeTag' || !(token.value.flags.intrinsic && token.value.flags.token))
|
|
11
|
-
) {
|
|
12
|
-
const prevToken = context.getPreviousTerminal(token);
|
|
8
|
+
while (token && [OpenNodeTag, CloseNodeTag, ReferenceTag].includes(token.type)) {
|
|
9
|
+
const prevToken = context.getPreviousTag(token);
|
|
13
10
|
if (!prevToken) break;
|
|
14
11
|
token = prevToken;
|
|
15
12
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bablr/helpers",
|
|
3
3
|
"description": "Command helpers for use in writing BABLR grammars",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.20.0",
|
|
5
5
|
"author": "Conrad Buck<conartist6@gmail.com>",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"files": [
|
|
@@ -28,19 +28,19 @@
|
|
|
28
28
|
"clean": "macrome clean"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@bablr/language_enhancer-debug-log": "0.
|
|
32
|
-
"@bablr/strategy_enhancer-debug-log": "0.
|
|
33
|
-
"@bablr/agast-helpers": "0.
|
|
34
|
-
"@bablr/agast-vm-helpers": "0.
|
|
31
|
+
"@bablr/language_enhancer-debug-log": "^0.7.0",
|
|
32
|
+
"@bablr/strategy_enhancer-debug-log": "^0.6.0",
|
|
33
|
+
"@bablr/agast-helpers": "^0.5.0",
|
|
34
|
+
"@bablr/agast-vm-helpers": "^0.5.0",
|
|
35
35
|
"@bablr/coroutine": "0.1.0",
|
|
36
36
|
"@iter-tools/imm-stack": "1.1.0",
|
|
37
37
|
"iter-tools-es": "^7.5.3"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
|
-
"@bablr/boot": "0.
|
|
40
|
+
"@bablr/boot": "^0.6.0",
|
|
41
41
|
"@bablr/eslint-config-base": "github:bablr-lang/eslint-config-base#d834ccc52795d6c3b96ecc6c419960fceed221a6",
|
|
42
42
|
"@bablr/macrome": "0.1.3",
|
|
43
|
-
"@bablr/macrome-generator-bablr": "0.3.
|
|
43
|
+
"@bablr/macrome-generator-bablr": "0.3.2",
|
|
44
44
|
"enhanced-resolve": "^5.12.0",
|
|
45
45
|
"eslint": "^7.32.0",
|
|
46
46
|
"eslint-import-resolver-enhanced-resolve": "^1.0.5",
|