@jbrowse/jexl 4.0.1 → 5.0.1
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/README.md +163 -20
- package/dist/Expression.d.ts +16 -0
- package/dist/Expression.js +28 -4
- package/dist/Expression.js.map +1 -1
- package/dist/Jexl.d.ts +20 -8
- package/dist/Jexl.js +34 -15
- package/dist/Jexl.js.map +1 -1
- package/dist/Lexer.d.ts +4 -3
- package/dist/Lexer.js +29 -21
- package/dist/Lexer.js.map +1 -1
- package/dist/analyze.d.ts +84 -0
- package/dist/analyze.js +259 -0
- package/dist/analyze.js.map +1 -0
- package/dist/check.d.ts +109 -0
- package/dist/check.js +1267 -0
- package/dist/check.js.map +1 -0
- package/dist/collections.d.ts +3 -0
- package/dist/collections.js +140 -0
- package/dist/collections.js.map +1 -0
- package/dist/conditions.d.ts +62 -0
- package/dist/conditions.js +207 -0
- package/dist/conditions.js.map +1 -0
- package/dist/errors.d.ts +5 -0
- package/dist/errors.js +18 -0
- package/dist/errors.js.map +1 -0
- package/dist/evaluator/compile.d.ts +10 -7
- package/dist/evaluator/compile.js +292 -99
- package/dist/evaluator/compile.js.map +1 -1
- package/dist/grammar.d.ts +22 -9
- package/dist/grammar.js +83 -55
- package/dist/grammar.js.map +1 -1
- package/dist/index.d.ts +9 -0
- package/dist/index.js +16 -1
- package/dist/index.js.map +1 -1
- package/dist/operators.d.ts +34 -0
- package/dist/operators.js +131 -0
- package/dist/operators.js.map +1 -0
- package/dist/parser/Parser.d.ts +48 -91
- package/dist/parser/Parser.js +347 -221
- package/dist/parser/Parser.js.map +1 -1
- package/dist/types.d.ts +11 -5
- package/esm/Expression.d.ts +16 -0
- package/esm/Expression.js +28 -4
- package/esm/Expression.js.map +1 -1
- package/esm/Jexl.d.ts +20 -8
- package/esm/Jexl.js +34 -15
- package/esm/Jexl.js.map +1 -1
- package/esm/Lexer.d.ts +4 -3
- package/esm/Lexer.js +29 -21
- package/esm/Lexer.js.map +1 -1
- package/esm/analyze.d.ts +84 -0
- package/esm/analyze.js +256 -0
- package/esm/analyze.js.map +1 -0
- package/esm/check.d.ts +109 -0
- package/esm/check.js +1260 -0
- package/esm/check.js.map +1 -0
- package/esm/collections.d.ts +3 -0
- package/esm/collections.js +137 -0
- package/esm/collections.js.map +1 -0
- package/esm/conditions.d.ts +62 -0
- package/esm/conditions.js +200 -0
- package/esm/conditions.js.map +1 -0
- package/esm/errors.d.ts +5 -0
- package/esm/errors.js +14 -0
- package/esm/errors.js.map +1 -0
- package/esm/evaluator/compile.d.ts +10 -7
- package/esm/evaluator/compile.js +292 -99
- package/esm/evaluator/compile.js.map +1 -1
- package/esm/grammar.d.ts +22 -9
- package/esm/grammar.js +79 -53
- package/esm/grammar.js.map +1 -1
- package/esm/index.d.ts +9 -0
- package/esm/index.js +4 -0
- package/esm/index.js.map +1 -1
- package/esm/operators.d.ts +34 -0
- package/esm/operators.js +123 -0
- package/esm/operators.js.map +1 -0
- package/esm/parser/Parser.d.ts +48 -91
- package/esm/parser/Parser.js +349 -192
- package/esm/parser/Parser.js.map +1 -1
- package/esm/types.d.ts +11 -5
- package/package.json +1 -1
- package/src/Expression.ts +34 -4
- package/src/Jexl.ts +52 -16
- package/src/Lexer.ts +32 -21
- package/src/analyze.ts +378 -0
- package/src/check.ts +1682 -0
- package/src/collections.ts +148 -0
- package/src/conditions.ts +262 -0
- package/src/errors.ts +15 -0
- package/src/evaluator/compile.ts +351 -102
- package/src/grammar.ts +137 -55
- package/src/index.ts +15 -0
- package/src/operators.ts +151 -0
- package/src/parser/Parser.ts +389 -199
- package/src/types.ts +13 -3
- package/dist/parser/handlers.d.ts +0 -115
- package/dist/parser/handlers.js +0 -352
- package/dist/parser/handlers.js.map +0 -1
- package/dist/parser/states.d.ts +0 -47
- package/dist/parser/states.js +0 -176
- package/dist/parser/states.js.map +0 -1
- package/esm/parser/handlers.d.ts +0 -115
- package/esm/parser/handlers.js +0 -328
- package/esm/parser/handlers.js.map +0 -1
- package/esm/parser/states.d.ts +0 -47
- package/esm/parser/states.js +0 -140
- package/esm/parser/states.js.map +0 -1
- package/src/parser/handlers.ts +0 -372
- package/src/parser/states.ts +0 -159
package/esm/parser/Parser.js
CHANGED
|
@@ -2,231 +2,388 @@
|
|
|
2
2
|
* Jexl
|
|
3
3
|
* Copyright 2020 Tom Shawver
|
|
4
4
|
*/
|
|
5
|
-
import
|
|
6
|
-
|
|
5
|
+
import { JexlSyntaxError } from "../errors.js";
|
|
6
|
+
const logical = new Set(['&&', '||']);
|
|
7
|
+
const omittedAlternateBefore = new Set([
|
|
8
|
+
'closeParen',
|
|
9
|
+
'closeBracket',
|
|
10
|
+
'closeCurl',
|
|
11
|
+
'comma',
|
|
12
|
+
'semicolon'
|
|
13
|
+
]);
|
|
14
|
+
export { JexlSyntaxError } from "../errors.js";
|
|
7
15
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* gives them
|
|
12
|
-
|
|
13
|
-
const tokenHandlers = {
|
|
14
|
-
binaryOp: handlers.binaryOp,
|
|
15
|
-
dot: handlers.dot,
|
|
16
|
-
identifier: handlers.identifier,
|
|
17
|
-
literal: handlers.literal,
|
|
18
|
-
semicolon: handlers.semicolon,
|
|
19
|
-
templateString: handlers.templateString,
|
|
20
|
-
unaryOp: handlers.unaryOp
|
|
21
|
-
};
|
|
22
|
-
/**
|
|
23
|
-
* The Parser is a state machine that converts tokens from the {@link Lexer}
|
|
24
|
-
* into an Abstract Syntax Tree (AST), capable of being evaluated in any
|
|
25
|
-
* context by {@link compileAst}. The Parser expects that all tokens
|
|
26
|
-
* provided to it are legal and typed properly according to the grammar, but
|
|
27
|
-
* accepts that the tokens may still be in an invalid order or in some other
|
|
28
|
-
* unparsable configuration that requires it to throw an Error.
|
|
29
|
-
* @param {{}} grammar The grammar object to use to parse Jexl strings
|
|
30
|
-
* @param {string} [prefix] A string prefix to prepend to the expression string
|
|
31
|
-
* for error messaging purposes. This is useful for when a new Parser is
|
|
32
|
-
* instantiated to parse an subexpression, as the parent Parser's
|
|
33
|
-
* expression string thus far can be passed for a more user-friendly
|
|
34
|
-
* error message.
|
|
35
|
-
* @param {{}} [stopMap] A mapping of token types to any truthy value. When the
|
|
36
|
-
* token type is encountered, the parser will return the mapped value
|
|
37
|
-
* instead of boolean false.
|
|
16
|
+
* Converts the tokens from the {@link Lexer} into an Abstract Syntax Tree, for
|
|
17
|
+
* {@link compileAst} to lower to closures. A Pratt parser: each level of the
|
|
18
|
+
* grammar is a method, from `_sequence` (loosest) down to `_primary`, and
|
|
19
|
+
* binary operators are climbed by the precedence the grammar gives them, so
|
|
20
|
+
* operators a host registers slot in without the parser knowing them.
|
|
38
21
|
*/
|
|
39
22
|
class Parser {
|
|
40
23
|
_grammar;
|
|
41
24
|
_lexer;
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
constructor(grammar, lexer, prefix, stopMap) {
|
|
25
|
+
_tokens = [];
|
|
26
|
+
_pos = 0;
|
|
27
|
+
_offset;
|
|
28
|
+
_grouped;
|
|
29
|
+
_lambdaDepth = 0;
|
|
30
|
+
/**
|
|
31
|
+
* @param offset where the tokens start in the source, so that an error
|
|
32
|
+
* inside a template interpolation reports its place in the whole
|
|
33
|
+
*/
|
|
34
|
+
constructor(grammar, lexer, offset = 0) {
|
|
53
35
|
this._grammar = grammar;
|
|
54
36
|
this._lexer = lexer;
|
|
55
|
-
this.
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
37
|
+
this._offset = offset;
|
|
38
|
+
}
|
|
39
|
+
parse(source) {
|
|
40
|
+
const start = this._offset;
|
|
41
|
+
this._offset += source.length - source.trimStart().length;
|
|
42
|
+
try {
|
|
43
|
+
this.addTokens(this._lexer.tokenize(source));
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
if (error instanceof JexlSyntaxError) {
|
|
47
|
+
error.offset += start;
|
|
48
|
+
}
|
|
49
|
+
throw error;
|
|
50
|
+
}
|
|
51
|
+
return this.complete();
|
|
52
|
+
}
|
|
53
|
+
addTokens(tokens) {
|
|
54
|
+
this._tokens = this._tokens.concat(tokens);
|
|
59
55
|
}
|
|
60
56
|
/**
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
* @param {{type: <string>}} token A token object, as provided by the
|
|
64
|
-
* {@link Lexer#tokenize} function.
|
|
65
|
-
* @throws {Error} if a token is added when the Parser has been marked as
|
|
66
|
-
* complete by {@link #complete}, or if an unexpected token type is added.
|
|
67
|
-
* @returns {boolean|*} the stopState value if this parser encountered a token
|
|
68
|
-
* in the stopState mapb false if tokens can continue.
|
|
57
|
+
* @returns the expression tree, or null for an expression with no tokens
|
|
58
|
+
* @throws {JexlSyntaxError} if the tokens do not form exactly one expression
|
|
69
59
|
*/
|
|
70
|
-
|
|
71
|
-
if (this.
|
|
72
|
-
|
|
73
|
-
}
|
|
74
|
-
const
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
}
|
|
60
|
+
complete() {
|
|
61
|
+
if (this._tokens.length === 0) {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
const ast = this._sequence();
|
|
65
|
+
if (this._pos < this._tokens.length) {
|
|
66
|
+
throw this._unexpected(this._pos);
|
|
67
|
+
}
|
|
68
|
+
return ast;
|
|
69
|
+
}
|
|
70
|
+
_sequence() {
|
|
71
|
+
const first = this._assignment();
|
|
72
|
+
if (this._peek()?.type !== 'semicolon') {
|
|
73
|
+
return first;
|
|
74
|
+
}
|
|
75
|
+
const expressions = [first];
|
|
76
|
+
while (this._eat('semicolon')) {
|
|
77
|
+
const next = this._peek();
|
|
78
|
+
if (!next || next.type === 'closeParen') {
|
|
79
|
+
break;
|
|
91
80
|
}
|
|
81
|
+
expressions.push(this._assignment());
|
|
82
|
+
}
|
|
83
|
+
return { type: 'SequenceExpression', expressions };
|
|
84
|
+
}
|
|
85
|
+
_assignment() {
|
|
86
|
+
if (this._atLambda()) {
|
|
87
|
+
return this._lambda();
|
|
88
|
+
}
|
|
89
|
+
const left = this._ternary();
|
|
90
|
+
const token = this._peek();
|
|
91
|
+
if (token?.type !== 'binaryOp' || token.value !== '=') {
|
|
92
|
+
return left;
|
|
92
93
|
}
|
|
93
|
-
|
|
94
|
-
|
|
94
|
+
if (left.type !== 'Identifier' || left.from) {
|
|
95
|
+
throw this._error('Left side of assignment must be a variable name', this._pos);
|
|
95
96
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
97
|
+
if (this._lambdaDepth > 0) {
|
|
98
|
+
throw this._error('Assignment is not supported in a lambda', this._pos);
|
|
99
|
+
}
|
|
100
|
+
this._pos++;
|
|
101
|
+
return {
|
|
102
|
+
type: 'AssignmentExpression',
|
|
103
|
+
operator: '=',
|
|
104
|
+
left,
|
|
105
|
+
right: this._assignment()
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
_atLambda() {
|
|
109
|
+
let i = this._pos;
|
|
110
|
+
if (this._tokens[i]?.type === 'identifier') {
|
|
111
|
+
return this._tokens[i + 1]?.type === 'arrow';
|
|
112
|
+
}
|
|
113
|
+
if (this._tokens[i]?.type !== 'openParen') {
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
i++;
|
|
117
|
+
while (this._tokens[i]?.type === 'identifier') {
|
|
118
|
+
i++;
|
|
119
|
+
if (this._tokens[i]?.type !== 'comma') {
|
|
120
|
+
break;
|
|
104
121
|
}
|
|
122
|
+
i++;
|
|
105
123
|
}
|
|
106
|
-
|
|
107
|
-
|
|
124
|
+
return (this._tokens[i]?.type === 'closeParen' &&
|
|
125
|
+
this._tokens[i + 1]?.type === 'arrow');
|
|
126
|
+
}
|
|
127
|
+
/** Parses the lambda {@link _atLambda} found, whose shape it has checked. */
|
|
128
|
+
_lambda() {
|
|
129
|
+
const params = [];
|
|
130
|
+
if (this._eat('openParen')) {
|
|
131
|
+
while (!this._eat('closeParen')) {
|
|
132
|
+
params.push(this._next().value);
|
|
133
|
+
this._eat('comma');
|
|
134
|
+
}
|
|
108
135
|
}
|
|
109
136
|
else {
|
|
110
|
-
|
|
137
|
+
params.push(this._next().value);
|
|
138
|
+
}
|
|
139
|
+
if (new Set(params).size < params.length) {
|
|
140
|
+
throw this._error('Duplicate lambda parameter name', this._pos);
|
|
111
141
|
}
|
|
112
|
-
|
|
142
|
+
this._pos++;
|
|
143
|
+
this._lambdaDepth++;
|
|
144
|
+
const body = this._assignment();
|
|
145
|
+
this._lambdaDepth--;
|
|
146
|
+
return { type: 'Lambda', params, body };
|
|
113
147
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
* the {@link Lexer#tokenize} function.
|
|
119
|
-
*/
|
|
120
|
-
addTokens(tokens) {
|
|
121
|
-
for (const token of tokens) {
|
|
122
|
-
this.addToken(token);
|
|
148
|
+
_ternary() {
|
|
149
|
+
const test = this._binary(-Infinity);
|
|
150
|
+
if (!this._eat('question')) {
|
|
151
|
+
return test;
|
|
123
152
|
}
|
|
153
|
+
const node = { type: 'ConditionalExpression', test };
|
|
154
|
+
if (!this._eat('colon')) {
|
|
155
|
+
node.consequent = this._assignment();
|
|
156
|
+
this._expect('colon');
|
|
157
|
+
}
|
|
158
|
+
const next = this._peek();
|
|
159
|
+
if (next && !omittedAlternateBefore.has(next.type)) {
|
|
160
|
+
node.alternate = this._assignment();
|
|
161
|
+
}
|
|
162
|
+
return node;
|
|
124
163
|
}
|
|
125
164
|
/**
|
|
126
|
-
*
|
|
127
|
-
*
|
|
128
|
-
*
|
|
129
|
-
* the parser before complete was called
|
|
130
|
-
* @throws {Error} if the parser is not in a state where it's legal to end
|
|
131
|
-
* the expression, indicating that the expression is incomplete
|
|
165
|
+
* Parses operands joined by binary operators that bind tighter than `floor`.
|
|
166
|
+
* One exactly at `floor` binds only when it continues a right-associative
|
|
167
|
+
* chain, which is how `a ^ b ^ c` groups from the right.
|
|
132
168
|
*/
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
};
|
|
153
|
-
|
|
154
|
-
return sequence;
|
|
155
|
-
}
|
|
156
|
-
this._state = 'complete';
|
|
157
|
-
return this._cursor ? this._tree : null;
|
|
169
|
+
_binary(floor, rightAssociative = false) {
|
|
170
|
+
let left = this._unary();
|
|
171
|
+
for (;;) {
|
|
172
|
+
const token = this._peek();
|
|
173
|
+
if (token?.type !== 'binaryOp' || token.value === '=') {
|
|
174
|
+
return left;
|
|
175
|
+
}
|
|
176
|
+
const operator = token.value;
|
|
177
|
+
const op = this._grammar.elements[operator];
|
|
178
|
+
if (op.type !== 'binaryOp' ||
|
|
179
|
+
op.precedence < floor ||
|
|
180
|
+
(op.precedence === floor && !(rightAssociative && op.rightAssociative))) {
|
|
181
|
+
return left;
|
|
182
|
+
}
|
|
183
|
+
const at = this._pos++;
|
|
184
|
+
const right = this._binary(op.precedence, op.rightAssociative);
|
|
185
|
+
if (this._mixesNullish(operator, left, right)) {
|
|
186
|
+
throw this._error('Parenthesize ?? when mixing it with && or ||', at);
|
|
187
|
+
}
|
|
188
|
+
left = { type: 'BinaryExpression', operator, left, right };
|
|
189
|
+
}
|
|
158
190
|
}
|
|
159
|
-
/**
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
this._subParser = undefined;
|
|
191
|
+
/** `a ?? b || c` has no grouping a reader can guess; JS refuses it too. */
|
|
192
|
+
_mixesNullish(operator, ...operands) {
|
|
193
|
+
return operands.some((operand) => operand.type === 'BinaryExpression' &&
|
|
194
|
+
!this._grouped?.has(operand) &&
|
|
195
|
+
(operator === '??'
|
|
196
|
+
? logical.has(operand.operator)
|
|
197
|
+
: logical.has(operator) && operand.operator === '??'));
|
|
167
198
|
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
* @param {{type: <string>}} node A node to be added to the AST
|
|
173
|
-
* @private
|
|
174
|
-
*/
|
|
175
|
-
_placeAtCursor(node) {
|
|
176
|
-
if (!this._cursor) {
|
|
177
|
-
this._tree = node;
|
|
199
|
+
_unary() {
|
|
200
|
+
const token = this._peek();
|
|
201
|
+
if (token?.type !== 'unaryOp') {
|
|
202
|
+
return this._postfix(this._primary());
|
|
178
203
|
}
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
204
|
+
this._pos++;
|
|
205
|
+
const operator = token.value;
|
|
206
|
+
const op = this._grammar.elements[operator];
|
|
207
|
+
return {
|
|
208
|
+
type: 'UnaryExpression',
|
|
209
|
+
operator,
|
|
210
|
+
right: this._binary(op?.type === 'unaryOp' ? op.precedence : Infinity)
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
_postfix(subject) {
|
|
214
|
+
let node = subject;
|
|
215
|
+
for (;;) {
|
|
216
|
+
switch (this._peek()?.type) {
|
|
217
|
+
case 'dot': {
|
|
218
|
+
this._pos++;
|
|
219
|
+
node = {
|
|
220
|
+
type: 'Identifier',
|
|
221
|
+
value: this._expect('identifier').value,
|
|
222
|
+
from: node
|
|
223
|
+
};
|
|
224
|
+
break;
|
|
225
|
+
}
|
|
226
|
+
case 'openBracket': {
|
|
227
|
+
this._pos++;
|
|
228
|
+
const expr = this._assignment();
|
|
229
|
+
this._expect('closeBracket');
|
|
230
|
+
node = { type: 'FilterExpression', expr, subject: node };
|
|
231
|
+
break;
|
|
232
|
+
}
|
|
233
|
+
case 'openParen': {
|
|
234
|
+
if (node.type !== 'Identifier' ||
|
|
235
|
+
this._tokens[this._pos - 1].type !== 'identifier') {
|
|
236
|
+
throw this._error('Functions must be called by name', this._pos);
|
|
237
|
+
}
|
|
238
|
+
this._pos++;
|
|
239
|
+
const { from, value } = node;
|
|
240
|
+
const args = this._list('closeParen');
|
|
241
|
+
node = {
|
|
242
|
+
type: 'FunctionCall',
|
|
243
|
+
name: value,
|
|
244
|
+
args: from ? [from, ...args] : args
|
|
245
|
+
};
|
|
246
|
+
break;
|
|
247
|
+
}
|
|
248
|
+
default: {
|
|
249
|
+
return node;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
182
252
|
}
|
|
183
|
-
this._cursor = node;
|
|
184
253
|
}
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
254
|
+
_primary() {
|
|
255
|
+
const token = this._next();
|
|
256
|
+
switch (token.type) {
|
|
257
|
+
case 'literal': {
|
|
258
|
+
return {
|
|
259
|
+
type: 'Literal',
|
|
260
|
+
value: token.value
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
case 'identifier': {
|
|
264
|
+
return { type: 'Identifier', value: token.value };
|
|
265
|
+
}
|
|
266
|
+
case 'templateString': {
|
|
267
|
+
return this._template(token.value, this._pos - 1);
|
|
268
|
+
}
|
|
269
|
+
case 'openParen': {
|
|
270
|
+
const node = this._sequence();
|
|
271
|
+
this._expect('closeParen');
|
|
272
|
+
this._grouped ??= new WeakSet();
|
|
273
|
+
this._grouped.add(node);
|
|
274
|
+
return node;
|
|
275
|
+
}
|
|
276
|
+
case 'openBracket': {
|
|
277
|
+
return { type: 'ArrayLiteral', value: this._list('closeBracket') };
|
|
278
|
+
}
|
|
279
|
+
case 'openCurl': {
|
|
280
|
+
return this._object();
|
|
281
|
+
}
|
|
282
|
+
case 'dot': {
|
|
283
|
+
throw this._error('Relative paths are not supported', this._pos - 1);
|
|
284
|
+
}
|
|
285
|
+
default: {
|
|
286
|
+
throw this._unexpected(this._pos - 1);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
196
289
|
}
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
290
|
+
_list(close) {
|
|
291
|
+
const items = [];
|
|
292
|
+
while (!this._eat(close)) {
|
|
293
|
+
items.push(this._assignment());
|
|
294
|
+
if (!this._eat('comma')) {
|
|
295
|
+
this._expect(close);
|
|
296
|
+
break;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
return items;
|
|
300
|
+
}
|
|
301
|
+
_object() {
|
|
302
|
+
const node = { type: 'ObjectLiteral', value: {} };
|
|
303
|
+
while (!this._eat('closeCurl')) {
|
|
304
|
+
const key = this._next();
|
|
305
|
+
if (key.type !== 'identifier' && key.type !== 'literal') {
|
|
306
|
+
throw this._unexpected(this._pos - 1);
|
|
307
|
+
}
|
|
308
|
+
this._expect('colon');
|
|
309
|
+
// defined rather than assigned, so that "__proto__" is an ordinary key
|
|
310
|
+
Object.defineProperty(node.value, String(key.value), {
|
|
311
|
+
value: this._assignment(),
|
|
312
|
+
writable: true,
|
|
313
|
+
enumerable: true,
|
|
314
|
+
configurable: true
|
|
315
|
+
});
|
|
316
|
+
if (!this._eat('comma')) {
|
|
317
|
+
this._expect('closeCurl');
|
|
318
|
+
break;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
return node;
|
|
322
|
+
}
|
|
323
|
+
_template(tokenParts, index) {
|
|
324
|
+
let offset = this._offsetOf(index) + '`'.length;
|
|
325
|
+
const parts = tokenParts.map((part) => {
|
|
326
|
+
if (part.type === 'static') {
|
|
327
|
+
offset += part.value.length;
|
|
328
|
+
return {
|
|
329
|
+
type: 'static',
|
|
330
|
+
value: this._lexer._unescapeTemplateString(part.value)
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
const start = offset + '${'.length;
|
|
334
|
+
offset = start + part.value.length + '}'.length;
|
|
335
|
+
const sub = new Parser(this._grammar, this._lexer, start);
|
|
336
|
+
sub._lambdaDepth = this._lambdaDepth;
|
|
337
|
+
const value = sub.parse(part.value);
|
|
338
|
+
if (!value) {
|
|
339
|
+
throw new JexlSyntaxError('Empty interpolation in template string', start);
|
|
340
|
+
}
|
|
341
|
+
return { type: 'expression', value };
|
|
210
342
|
});
|
|
343
|
+
return { type: 'TemplateLiteral', parts };
|
|
211
344
|
}
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
345
|
+
_peek() {
|
|
346
|
+
return this._tokens[this._pos];
|
|
347
|
+
}
|
|
348
|
+
_next() {
|
|
349
|
+
const token = this._tokens[this._pos];
|
|
350
|
+
if (!token) {
|
|
351
|
+
throw this._error('Unexpected end of expression', this._pos);
|
|
352
|
+
}
|
|
353
|
+
this._pos++;
|
|
354
|
+
return token;
|
|
355
|
+
}
|
|
356
|
+
_eat(type) {
|
|
357
|
+
if (this._tokens[this._pos]?.type !== type) {
|
|
358
|
+
return false;
|
|
224
359
|
}
|
|
225
|
-
|
|
226
|
-
|
|
360
|
+
this._pos++;
|
|
361
|
+
return true;
|
|
362
|
+
}
|
|
363
|
+
_expect(type) {
|
|
364
|
+
const token = this._next();
|
|
365
|
+
if (token.type !== type) {
|
|
366
|
+
throw this._unexpected(this._pos - 1);
|
|
367
|
+
}
|
|
368
|
+
return token;
|
|
369
|
+
}
|
|
370
|
+
_unexpected(index) {
|
|
371
|
+
const { raw, type } = this._tokens[index];
|
|
372
|
+
return this._error(`Token ${raw} (${type}) unexpected in expression`, index);
|
|
373
|
+
}
|
|
374
|
+
_error(message, index) {
|
|
375
|
+
const source = this._tokens
|
|
376
|
+
.slice(0, index + 1)
|
|
377
|
+
.map((token) => token.raw)
|
|
378
|
+
.join('');
|
|
379
|
+
return new JexlSyntaxError(`${message}: ${source}`, this._offsetOf(index));
|
|
380
|
+
}
|
|
381
|
+
_offsetOf(index) {
|
|
382
|
+
let offset = this._offset;
|
|
383
|
+
for (let i = 0; i < index; i++) {
|
|
384
|
+
offset += this._tokens[i].raw.length;
|
|
227
385
|
}
|
|
228
|
-
|
|
229
|
-
return this._subParser;
|
|
386
|
+
return offset;
|
|
230
387
|
}
|
|
231
388
|
}
|
|
232
389
|
export default Parser;
|
package/esm/parser/Parser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Parser.js","sourceRoot":"","sources":["../../src/parser/Parser.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Parser.js","sourceRoot":"","sources":["../../src/parser/Parser.ts"],"names":[],"mappings":"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"}
|