@witchcraft/expressit 0.0.2 → 0.1.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/README.md +6 -4
- package/dist/Lexer.d.ts +146 -0
- package/dist/Lexer.d.ts.map +1 -0
- package/dist/Lexer.js +960 -0
- package/dist/Parser.d.ts +140 -0
- package/dist/Parser.d.ts.map +1 -0
- package/dist/Parser.js +668 -0
- package/dist/ast/builders/token.js +1 -1
- package/dist/ast/handlers.d.ts +3 -3
- package/dist/ast/handlers.d.ts.map +1 -1
- package/dist/ast/index.d.ts.map +1 -1
- package/dist/examples/index.d.ts +2 -0
- package/dist/examples/index.d.ts.map +1 -0
- package/dist/examples/index.js +4 -0
- package/dist/examples/shortcutContextParser.d.ts +2 -1
- package/dist/examples/shortcutContextParser.d.ts.map +1 -1
- package/dist/examples/shortcutContextParser.js +9 -5
- package/dist/helpers/errors.d.ts.map +1 -1
- package/dist/helpers/errors.js +3 -1
- package/dist/helpers/index.d.ts.map +1 -1
- package/dist/helpers/parser/checkParserOpts.d.ts.map +1 -1
- package/dist/helpers/parser/checkParserOpts.js +3 -2
- package/dist/helpers/parser/extractPosition.d.ts +2 -6
- package/dist/helpers/parser/extractPosition.d.ts.map +1 -1
- package/dist/helpers/parser/extractPosition.js +3 -3
- package/dist/helpers/parser/getUnclosedRightParenCount.d.ts +2 -3
- package/dist/helpers/parser/getUnclosedRightParenCount.d.ts.map +1 -1
- package/dist/helpers/parser/getUnclosedRightParenCount.js +4 -4
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -5
- package/dist/methods/autocomplete.d.ts.map +1 -1
- package/dist/methods/autocomplete.js +1 -1
- package/dist/methods/autoreplace.js +1 -1
- package/dist/methods/autosuggest.js +1 -1
- package/dist/methods/evaluate.d.ts.map +1 -1
- package/dist/methods/evaluate.js +3 -1
- package/dist/methods/getIndexes.d.ts.map +1 -1
- package/dist/methods/getIndexes.js +2 -1
- package/dist/methods/normalize.d.ts +0 -2
- package/dist/methods/normalize.d.ts.map +1 -1
- package/dist/methods/normalize.js +2 -3
- package/dist/methods/validate.d.ts.map +1 -1
- package/dist/methods/validate.js +3 -1
- package/dist/package.json.js +44 -37
- package/dist/types/ast.d.ts +2 -8
- package/dist/types/ast.d.ts.map +1 -1
- package/dist/types/errors.d.ts +5 -17
- package/dist/types/errors.d.ts.map +1 -1
- package/dist/types/errors.js +0 -1
- package/dist/types/parser.d.ts +6 -2
- package/dist/types/parser.d.ts.map +1 -1
- package/dist/utils/extractTokens.js +1 -1
- package/dist/utils/getCursorInfo.d.ts +2 -2
- package/dist/utils/getCursorInfo.d.ts.map +1 -1
- package/dist/utils/getCursorInfo.js +3 -2
- package/dist/utils/getOppositeDelimiter.d.ts.map +1 -1
- package/dist/utils/getOppositeDelimiter.js +1 -1
- package/dist/utils/prettyAst.d.ts.map +1 -1
- package/dist/utils/prettyAst.js +15 -9
- package/package.json +42 -37
- package/src/Lexer.ts +704 -0
- package/src/Parser.ts +972 -0
- package/src/ast/builders/array.ts +2 -2
- package/src/ast/builders/condition.ts +1 -1
- package/src/ast/builders/expression.ts +1 -1
- package/src/ast/builders/group.ts +1 -1
- package/src/ast/builders/index.ts +1 -1
- package/src/ast/builders/pos.ts +1 -1
- package/src/ast/builders/token.ts +2 -2
- package/src/ast/builders/type.ts +1 -1
- package/src/ast/builders/variable.ts +1 -1
- package/src/ast/classes/ConditionNode.ts +1 -1
- package/src/ast/classes/ErrorToken.ts +1 -1
- package/src/ast/classes/ValidToken.ts +2 -2
- package/src/ast/classes/index.ts +1 -1
- package/src/ast/handlers.ts +6 -6
- package/src/ast/index.ts +2 -2
- package/src/examples/index.ts +3 -0
- package/src/examples/shortcutContextParser.ts +11 -6
- package/src/helpers/errors.ts +5 -3
- package/src/helpers/general/defaultConditionNormalizer.ts +1 -1
- package/src/helpers/general/index.ts +1 -1
- package/src/helpers/index.ts +3 -2
- package/src/helpers/parser/checkParserOpts.ts +13 -12
- package/src/helpers/parser/extractPosition.ts +4 -8
- package/src/helpers/parser/getUnclosedRightParenCount.ts +6 -6
- package/src/helpers/parser/index.ts +1 -1
- package/src/helpers/parser/parseParserOptions.ts +1 -1
- package/src/index.ts +2 -2
- package/src/methods/autocomplete.ts +5 -5
- package/src/methods/autoreplace.ts +2 -2
- package/src/methods/autosuggest.ts +3 -3
- package/src/methods/evaluate.ts +4 -2
- package/src/methods/getIndexes.ts +2 -1
- package/src/methods/normalize.ts +3 -4
- package/src/methods/validate.ts +4 -2
- package/src/types/ast.ts +2 -9
- package/src/types/errors.ts +12 -22
- package/src/types/parser.ts +6 -4
- package/src/utils/extractTokens.ts +1 -1
- package/src/utils/getCursorInfo.ts +6 -4
- package/src/utils/getOppositeDelimiter.ts +5 -2
- package/src/utils/prettyAst.ts +5 -3
- package/dist/examples/advancedValueComparer.d.ts +0 -3
- package/dist/examples/advancedValueComparer.d.ts.map +0 -1
- package/dist/examples/advancedValueComparer.js +0 -28
- package/dist/grammar/ParserBase.d.ts +0 -51
- package/dist/grammar/ParserBase.d.ts.map +0 -1
- package/dist/grammar/ParserBase.js +0 -516
- package/dist/grammar/createTokens.d.ts +0 -56
- package/dist/grammar/createTokens.d.ts.map +0 -1
- package/dist/grammar/createTokens.js +0 -843
- package/dist/grammar/index.d.ts +0 -3
- package/dist/grammar/index.d.ts.map +0 -1
- package/dist/grammar/index.js +0 -6
- package/dist/parser.d.ts +0 -58
- package/dist/parser.d.ts.map +0 -1
- package/dist/parser.js +0 -136
- package/src/examples/advancedValueComparer.ts +0 -31
- package/src/grammar/ParserBase.ts +0 -715
- package/src/grammar/createTokens.ts +0 -512
- package/src/grammar/index.ts +0 -4
- package/src/parser.ts +0 -183
|
@@ -1,715 +0,0 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/naming-convention */
|
|
2
|
-
|
|
3
|
-
import { isArray, unreachable } from "@alanscodelog/utils"
|
|
4
|
-
import { EmbeddedActionsParser, EOF, type IToken, tokenMatcher } from "chevrotain"
|
|
5
|
-
|
|
6
|
-
import type { createTokens } from "./createTokens.js"
|
|
7
|
-
|
|
8
|
-
import { pos } from "../ast/builders/pos.js"
|
|
9
|
-
import { ArrayNode } from "../ast/classes/ArrayNode.js"
|
|
10
|
-
import { ConditionNode } from "../ast/classes/ConditionNode.js"
|
|
11
|
-
import { ErrorToken } from "../ast/classes/ErrorToken.js"
|
|
12
|
-
import type { ExpressionNode } from "../ast/classes/ExpressionNode.js"
|
|
13
|
-
import type { GroupNode } from "../ast/classes/GroupNode.js"
|
|
14
|
-
import type { ValidToken } from "../ast/classes/ValidToken.js"
|
|
15
|
-
import { VariableNode } from "../ast/classes/VariableNode.js"
|
|
16
|
-
import * as handle from "../ast/handlers.js"
|
|
17
|
-
import { extractPosition } from "../helpers/parser/extractPosition.js"
|
|
18
|
-
import { Parser } from "../parser.js"
|
|
19
|
-
import { type AnyToken, type ParserResults, type Position, TOKEN_TYPE, type TokenQuoteTypes } from "../types/ast.js"
|
|
20
|
-
import type { FullParserOptions } from "../types/parser.js"
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
function processToken<TDefined extends boolean = boolean>(token: IToken, shift: number): [TDefined extends true ? string : string | undefined, Position] {
|
|
24
|
-
let val: string | undefined = token.image
|
|
25
|
-
if (token.isInsertedInRecovery) val = undefined
|
|
26
|
-
return [val as any, extractPosition(token, shift)]
|
|
27
|
-
}
|
|
28
|
-
export class ParserBase<T extends {} = {}> extends EmbeddedActionsParser {
|
|
29
|
-
rawInput!: string
|
|
30
|
-
|
|
31
|
-
private subParser?: Parser
|
|
32
|
-
|
|
33
|
-
private subParser2?: Parser
|
|
34
|
-
|
|
35
|
-
constructor(opts: FullParserOptions<T>, t: ReturnType<typeof createTokens>["tokens"], { customOpAlsoNegation, expandedSepAlsoCustom }: ReturnType<typeof createTokens>["info"]) {
|
|
36
|
-
super(t, {
|
|
37
|
-
recoveryEnabled: true,
|
|
38
|
-
// skipValidations: true
|
|
39
|
-
})
|
|
40
|
-
|
|
41
|
-
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
42
|
-
const $ = this
|
|
43
|
-
|
|
44
|
-
$.RULE("main", () => {
|
|
45
|
-
const res = $.SUBRULE($.boolOr)
|
|
46
|
-
$.CONSUME(EOF)
|
|
47
|
-
|
|
48
|
-
return $.ACTION(() => {
|
|
49
|
-
if (res === undefined) {
|
|
50
|
-
const error = handle.token.value(undefined, { start: 0, end: 0 })
|
|
51
|
-
return error
|
|
52
|
-
}
|
|
53
|
-
return res
|
|
54
|
-
})
|
|
55
|
-
})
|
|
56
|
-
$.RULE("boolOr", () => {
|
|
57
|
-
const pairs: any[][] = []
|
|
58
|
-
|
|
59
|
-
const DEF = (): void => {
|
|
60
|
-
const exp = $.SUBRULE2($.boolAnd)
|
|
61
|
-
const extras: any[] = []
|
|
62
|
-
|
|
63
|
-
let next = $.LA(1)
|
|
64
|
-
$.OPTION1({
|
|
65
|
-
GATE: () => opts.onMissingBooleanOperator === "or" &&
|
|
66
|
-
(
|
|
67
|
-
tokenMatcher(next, t.VALUE) ||
|
|
68
|
-
tokenMatcher(next, t.QUOTE_ANY) ||
|
|
69
|
-
tokenMatcher(next, t.PAREN_L) ||
|
|
70
|
-
tokenMatcher(next, t.EXP_PROP_OP) ||
|
|
71
|
-
tokenMatcher(next, t.REGEX_START) ||
|
|
72
|
-
tokenMatcher(next, t.CUSTOM_PROP_OP)
|
|
73
|
-
),
|
|
74
|
-
DEF: () => {
|
|
75
|
-
let dummyOp
|
|
76
|
-
const cond = $.SUBRULE3($.condition)
|
|
77
|
-
$.ACTION(() => {
|
|
78
|
-
// the operator is missing between the previous token and this exp
|
|
79
|
-
const prev = $.LA(-1)
|
|
80
|
-
const start = prev.endOffset! + 1
|
|
81
|
-
dummyOp = handle.operator.or("", pos({ start }, { fill: true }))
|
|
82
|
-
})
|
|
83
|
-
|
|
84
|
-
extras.push([dummyOp, cond])
|
|
85
|
-
},
|
|
86
|
-
})
|
|
87
|
-
|
|
88
|
-
next = $.LA(1)
|
|
89
|
-
pairs.push([exp, tokenMatcher(next, t.OPERATOR_OR) ? handle.operator.or(...processToken<true>(next, $.shift)) : undefined])
|
|
90
|
-
for (const extra of extras) {
|
|
91
|
-
pairs[pairs.length - 1].splice(1, 1, extra[0])
|
|
92
|
-
pairs.push([extra[1]])
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
$.MANY_SEP({ SEP: t.OPERATOR_OR, DEF })
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
$.OPTION({
|
|
100
|
-
// many sep sometimes fails to recover when it technically could
|
|
101
|
-
GATE: () => pairs.length === 0 && tokenMatcher($.LA(1), t.OPERATOR_OR),
|
|
102
|
-
DEF: () => {
|
|
103
|
-
$.MANY(() => {
|
|
104
|
-
const next = $.CONSUME(t.OPERATOR_OR)
|
|
105
|
-
pairs.push([undefined, handle.operator.or(...processToken<true>(next, $.shift))])
|
|
106
|
-
while (tokenMatcher($.LA(1), t.VALUE) || tokenMatcher($.LA(1), t.QUOTE_ANY) || tokenMatcher($.LA(1), t.PAREN_L)) {
|
|
107
|
-
pairs.push([$.SUBRULE3($.condition)])
|
|
108
|
-
}
|
|
109
|
-
})
|
|
110
|
-
},
|
|
111
|
-
})
|
|
112
|
-
|
|
113
|
-
return $.ACTION(() => {
|
|
114
|
-
let res = pairs[pairs.length - 1][0]
|
|
115
|
-
for (let i = pairs.length - 1; i > 0; i--) {
|
|
116
|
-
const before = pairs[i - 1]
|
|
117
|
-
if (res === undefined && before === undefined) return undefined
|
|
118
|
-
res = handle.expression(before[0], before[1], res)
|
|
119
|
-
}
|
|
120
|
-
return res
|
|
121
|
-
})
|
|
122
|
-
})
|
|
123
|
-
$.RULE("boolAnd", () => {
|
|
124
|
-
const pairs: any[][] = []
|
|
125
|
-
|
|
126
|
-
const DEF = (): void => {
|
|
127
|
-
const exp = $.SUBRULE2($.condition)
|
|
128
|
-
const extras: any[][] = []
|
|
129
|
-
|
|
130
|
-
let next = $.LA(1)
|
|
131
|
-
$.OPTION1({
|
|
132
|
-
GATE: () => ["error", "and"].includes(opts.onMissingBooleanOperator) &&
|
|
133
|
-
(
|
|
134
|
-
tokenMatcher(next, t.VALUE) ||
|
|
135
|
-
tokenMatcher(next, t.QUOTE_ANY) ||
|
|
136
|
-
tokenMatcher(next, t.PAREN_L) ||
|
|
137
|
-
tokenMatcher(next, t.EXP_PROP_OP) ||
|
|
138
|
-
tokenMatcher(next, t.REGEX_START) ||
|
|
139
|
-
tokenMatcher(next, t.CUSTOM_PROP_OP)
|
|
140
|
-
),
|
|
141
|
-
DEF: () => {
|
|
142
|
-
$.MANY2(() => {
|
|
143
|
-
let dummyOp
|
|
144
|
-
const cond = $.SUBRULE3($.condition)
|
|
145
|
-
$.ACTION(() => {
|
|
146
|
-
if (opts.onMissingBooleanOperator === "and") {
|
|
147
|
-
// the operator is missing between the previous token and this exp
|
|
148
|
-
const prev = $.LA(-1)
|
|
149
|
-
const start = prev.endOffset! + 1
|
|
150
|
-
dummyOp = handle.operator.and("", pos({ start }, { fill: true }))
|
|
151
|
-
}
|
|
152
|
-
})
|
|
153
|
-
|
|
154
|
-
extras.push([dummyOp, cond])
|
|
155
|
-
})
|
|
156
|
-
},
|
|
157
|
-
})
|
|
158
|
-
|
|
159
|
-
next = $.LA(1)
|
|
160
|
-
pairs.push([exp, tokenMatcher(next, t.OPERATOR_AND) ? handle.operator.and(...processToken<true>(next, $.shift)) : undefined])
|
|
161
|
-
for (const extra of extras) {
|
|
162
|
-
pairs[pairs.length - 1].splice(1, 1, extra[0])
|
|
163
|
-
pairs.push([extra[1]])
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
$.MANY_SEP({ SEP: t.OPERATOR_AND, DEF })
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
$.OPTION({
|
|
171
|
-
GATE: () => pairs.length === 0 && tokenMatcher($.LA(1), t.OPERATOR_AND),
|
|
172
|
-
DEF: () => {
|
|
173
|
-
$.MANY(() => {
|
|
174
|
-
const next = $.CONSUME(t.OPERATOR_AND)
|
|
175
|
-
pairs.push([undefined, handle.operator.and(...processToken<true>(next, $.shift))])
|
|
176
|
-
while (tokenMatcher($.LA(1), t.VALUE) || tokenMatcher($.LA(1), t.QUOTE_ANY) || tokenMatcher($.LA(1), t.PAREN_L)) {
|
|
177
|
-
pairs.push([$.SUBRULE3($.condition)])
|
|
178
|
-
}
|
|
179
|
-
})
|
|
180
|
-
},
|
|
181
|
-
})
|
|
182
|
-
|
|
183
|
-
return $.ACTION(() => {
|
|
184
|
-
if (pairs.length === 0) return undefined // handle situations like `a ||` where b is missing
|
|
185
|
-
let res = pairs[pairs.length - 1][0]
|
|
186
|
-
for (let i = pairs.length - 1; i > 0; i--) {
|
|
187
|
-
const before = pairs[i - 1]
|
|
188
|
-
res = handle.expression(before[0], before[1], res)
|
|
189
|
-
}
|
|
190
|
-
return res
|
|
191
|
-
})
|
|
192
|
-
})
|
|
193
|
-
|
|
194
|
-
$.RULE("condition", () => {
|
|
195
|
-
const not = $.OPTION(() => $.SUBRULE($.not))
|
|
196
|
-
|
|
197
|
-
const property = $.OPTION2({
|
|
198
|
-
GATE: () => (
|
|
199
|
-
tokenMatcher($.LA(1), t.EXP_PROP_OP) ||
|
|
200
|
-
tokenMatcher($.LA(1), t.CUSTOM_PROP_OP) ||
|
|
201
|
-
tokenMatcher($.LA(2), t.EXP_PROP_OP) ||
|
|
202
|
-
tokenMatcher($.LA(2), t.CUSTOM_PROP_OP) ||
|
|
203
|
-
(
|
|
204
|
-
customOpAlsoNegation &&
|
|
205
|
-
(
|
|
206
|
-
tokenMatcher($.LA(2), t.SYM_NOT) ||
|
|
207
|
-
(tokenMatcher($.LA(0), t.SYM_NOT) && tokenMatcher($.LA(1), t.SYM_NOT))
|
|
208
|
-
)
|
|
209
|
-
)
|
|
210
|
-
),
|
|
211
|
-
DEF: () => $.SUBRULE($.property),
|
|
212
|
-
}) as ReturnType<typeof $["property"]> | undefined
|
|
213
|
-
const propVal = $.ACTION(() => property?.prop?.value === undefined
|
|
214
|
-
? undefined
|
|
215
|
-
: property.prop.value instanceof ErrorToken
|
|
216
|
-
? ""
|
|
217
|
-
: property.prop.value.value)
|
|
218
|
-
|
|
219
|
-
const propOpVal = $.ACTION(() => property?.rest.propertyOperator === undefined
|
|
220
|
-
? undefined
|
|
221
|
-
: property.rest.propertyOperator instanceof ErrorToken
|
|
222
|
-
? ""
|
|
223
|
-
: property.rest.propertyOperator.value)
|
|
224
|
-
|
|
225
|
-
const isExpanded = $.ACTION(() => (property?.rest.sepL ?? property?.rest.sepR) !== undefined)
|
|
226
|
-
const convertRegexValues = $.ACTION(() =>
|
|
227
|
-
typeof opts.regexValues === "function" && !opts.regexValues(propVal, propOpVal, isExpanded))
|
|
228
|
-
|
|
229
|
-
const convertArrayValues = $.ACTION(() =>
|
|
230
|
-
typeof opts.arrayValues === "function" && !opts.arrayValues(propVal, propOpVal, isExpanded))
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
let value: ReturnType<typeof $["plainGroup"]> |
|
|
234
|
-
ReturnType<typeof $["plainBracketGroup"]> |
|
|
235
|
-
ReturnType<typeof $["variable"]> |
|
|
236
|
-
undefined = $.OR2([
|
|
237
|
-
{
|
|
238
|
-
GATE: () => opts.prefixableGroups && property === undefined &&
|
|
239
|
-
$.LA(1).tokenType !== t.PAREN_L && // moves to parsing group below
|
|
240
|
-
(
|
|
241
|
-
(
|
|
242
|
-
tokenMatcher($.LA(1), t.VALUE) &&
|
|
243
|
-
(
|
|
244
|
-
tokenMatcher($.LA(2), t.PAREN_L) || // a(
|
|
245
|
-
(tokenMatcher($.LA(2), t.QUOTE_ANY) && tokenMatcher($.LA(3), t.PAREN_L)) // a"(
|
|
246
|
-
)
|
|
247
|
-
) ||
|
|
248
|
-
(
|
|
249
|
-
tokenMatcher($.LA(1), t.QUOTE_ANY) &&
|
|
250
|
-
(
|
|
251
|
-
tokenMatcher($.LA(2), t.PAREN_L) || // "(
|
|
252
|
-
(tokenMatcher($.LA(2), t.VALUE) &&
|
|
253
|
-
(
|
|
254
|
-
tokenMatcher($.LA(3), t.PAREN_L) || // "a(
|
|
255
|
-
(tokenMatcher($.LA(3), t.QUOTE_ANY) && tokenMatcher($.LA(4), t.PAREN_L)) // "a"(
|
|
256
|
-
)
|
|
257
|
-
)
|
|
258
|
-
)
|
|
259
|
-
)
|
|
260
|
-
|
|
261
|
-
)
|
|
262
|
-
,
|
|
263
|
-
ALT: () => $.SUBRULE<any, any>($.variable, { ARGS: [{ unprefixed: true }]}), // un-prefixed
|
|
264
|
-
},
|
|
265
|
-
{
|
|
266
|
-
GATE: () => $.LA(1).tokenType !== t.PAREN_L,
|
|
267
|
-
ALT: () => $.SUBRULE2($.variable),
|
|
268
|
-
},
|
|
269
|
-
{
|
|
270
|
-
GATE: () => $.LA(1).tokenType === t.PAREN_L,
|
|
271
|
-
ALT: () => $.SUBRULE2<any, any>($.plainGroup, { ARGS: [{ onlyValues: property !== undefined, convertRegexValues, convertArrayValues }]}),
|
|
272
|
-
},
|
|
273
|
-
{
|
|
274
|
-
GATE: () => $.LA(1).tokenType === t.BRACKET_L,
|
|
275
|
-
ALT: () => $.SUBRULE2<any, any>($.plainBracketGroup, { ARGS: [{ convertArrayValues }]}),
|
|
276
|
-
},
|
|
277
|
-
{
|
|
278
|
-
GATE: () => not !== undefined || property !== undefined || $.LA(1).tokenType === EOF,
|
|
279
|
-
ALT: () => undefined,
|
|
280
|
-
},
|
|
281
|
-
])
|
|
282
|
-
|
|
283
|
-
let group = $.OPTION3({
|
|
284
|
-
GATE: () => !(value instanceof ArrayNode) && !isArray(value) && (!value || opts.prefixableGroups) && $.LA(1).tokenType === t.PAREN_L, // is not already plain group
|
|
285
|
-
DEF: () => $.SUBRULE3<any, any>($.plainGroup, { ARGS: [{ onlyValues: property !== undefined, convertRegexValues, convertArrayValues }]}),
|
|
286
|
-
})
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
return $.ACTION(() => {
|
|
290
|
-
if (isArray(value)) {
|
|
291
|
-
group = value
|
|
292
|
-
value = undefined
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
if (convertRegexValues && value instanceof VariableNode && value.quote?.left.type === TOKEN_TYPE.REGEX) {
|
|
296
|
-
value = handle.variable(undefined, undefined, handle.token.value(
|
|
297
|
-
(value.quote?.left?.value ?? "") + (value.value.value ?? "") + (value.quote?.right?.value ?? ""),
|
|
298
|
-
pos(value)
|
|
299
|
-
), undefined) as ReturnType<this["variable"]>
|
|
300
|
-
}
|
|
301
|
-
if (group) {
|
|
302
|
-
if (property) {
|
|
303
|
-
// @ts-expect-error group is spreadable
|
|
304
|
-
return handle.condition(not, property?.prop, property?.rest, handle.group(undefined, undefined, ...group))
|
|
305
|
-
}
|
|
306
|
-
if (value) {
|
|
307
|
-
// @ts-expect-error group is spreadable
|
|
308
|
-
return handle.group(undefined, handle.condition(not, undefined, undefined, value), ...group)
|
|
309
|
-
}
|
|
310
|
-
// @ts-expect-error group is spreadable
|
|
311
|
-
return handle.group(not, value, ...group)
|
|
312
|
-
}
|
|
313
|
-
if ([not, property, value].every(_ => _ === undefined)) return undefined
|
|
314
|
-
return handle.condition(not, property?.prop, property?.rest, value)
|
|
315
|
-
})
|
|
316
|
-
})
|
|
317
|
-
|
|
318
|
-
$.RULE("property", () => {
|
|
319
|
-
const prop: any = $.OPTION3(() => $.SUBRULE<any, any>($.variable, { ARGS: [{ unprefixed: true }]}))
|
|
320
|
-
|
|
321
|
-
const rest = $.OR([
|
|
322
|
-
{
|
|
323
|
-
ALT: () => {
|
|
324
|
-
let sepL: any = $.CONSUME(t.EXP_PROP_OP)
|
|
325
|
-
sepL &&= handle.token.sep(...processToken(sepL, $.shift))
|
|
326
|
-
|
|
327
|
-
let op: any = $.OPTION4(() => $.CONSUME2(t.VALUE_UNQUOTED))
|
|
328
|
-
op &&= handle.token.value(...processToken(op, $.shift))
|
|
329
|
-
|
|
330
|
-
let sepR: any = $.OPTION5(() => $.CONSUME2(t.EXP_PROP_OP))
|
|
331
|
-
sepR &&= handle.token.sep(...processToken(sepR, $.shift))
|
|
332
|
-
if (expandedSepAlsoCustom && op === undefined && sepR === undefined) {
|
|
333
|
-
op = sepL
|
|
334
|
-
op.type = TOKEN_TYPE.OP_CUSTOM
|
|
335
|
-
sepL = undefined
|
|
336
|
-
}
|
|
337
|
-
return { sepL, sepR, propertyOperator: op }
|
|
338
|
-
},
|
|
339
|
-
},
|
|
340
|
-
{
|
|
341
|
-
ALT: () => {
|
|
342
|
-
let op: any = $.CONSUME(t.CUSTOM_PROP_OP)
|
|
343
|
-
if (!op.isInsertedInRecovery) op = handle.token.custom(...processToken(op, $.shift))
|
|
344
|
-
return { propertyOperator: op }
|
|
345
|
-
},
|
|
346
|
-
},
|
|
347
|
-
{
|
|
348
|
-
GATE: () => customOpAlsoNegation,
|
|
349
|
-
ALT: () => {
|
|
350
|
-
let op: any = $.CONSUME2(t.SYM_NOT)
|
|
351
|
-
if (!op.isInsertedInRecovery) op = handle.token.custom(...processToken(op, $.shift))
|
|
352
|
-
return { propertyOperator: op }
|
|
353
|
-
},
|
|
354
|
-
},
|
|
355
|
-
])
|
|
356
|
-
|
|
357
|
-
return { prop, rest }
|
|
358
|
-
})
|
|
359
|
-
$.RULE("plainGroup", (
|
|
360
|
-
{ onlyValues = false, convertRegexValues = false, convertArrayValues = false }:
|
|
361
|
-
{ onlyValues?: boolean, convertRegexValues?: boolean, convertArrayValues?: boolean } = {}) => {
|
|
362
|
-
const parenL = $.SUBRULE1($.parenL)
|
|
363
|
-
let parenLeftCount = 0
|
|
364
|
-
let start: undefined | number
|
|
365
|
-
let end: undefined | number
|
|
366
|
-
const condition = $.OPTION1({
|
|
367
|
-
GATE: () => !onlyValues,
|
|
368
|
-
DEF: () => $.SUBRULE1($.boolOr),
|
|
369
|
-
})
|
|
370
|
-
|
|
371
|
-
// bypasses self analysis (which goes into an infinite loop for some reason...)
|
|
372
|
-
// see subParser hack below for why
|
|
373
|
-
if (onlyValues && $.LA(1).tokenType !== EOF) {
|
|
374
|
-
while (
|
|
375
|
-
!tokenMatcher($.LA(1), EOF) &&
|
|
376
|
-
(!tokenMatcher($.LA(1), t.PAREN_R) || parenLeftCount !== 0)
|
|
377
|
-
) {
|
|
378
|
-
const token = $.CONSUME(t.ANY)
|
|
379
|
-
|
|
380
|
-
start ??= extractPosition(token, this.shift).start
|
|
381
|
-
if (tokenMatcher(token, t.PAREN_L)) {
|
|
382
|
-
parenLeftCount++
|
|
383
|
-
}
|
|
384
|
-
if (tokenMatcher(token, t.PAREN_R)) {
|
|
385
|
-
parenLeftCount--
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
if (start !== undefined) {
|
|
391
|
-
end ??= extractPosition($.LA(0), this.shift).end
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
const parenR = $.OPTION2(() => $.SUBRULE1($.parenR))
|
|
395
|
-
return $.ACTION(() => {
|
|
396
|
-
if (start !== undefined) {
|
|
397
|
-
/**
|
|
398
|
-
* This is a bit of a hack to ignore forbidden expressions in groups when used as values (it would make no sense to do something like `prop:op(prop:op(...)))` or `prop:op:(prefix(...))`).
|
|
399
|
-
*
|
|
400
|
-
* Doing this from the tokenizer is very complicated because it would require keeping track of a lot of state since we need to know when a group follows something that even looks like a property/operator.
|
|
401
|
-
*
|
|
402
|
-
* This way we just consume all input until the correct next matching paren (or EOF) and re-parse it with a restricted version of the parser.
|
|
403
|
-
*
|
|
404
|
-
* Performance wise this should not be a problem since at most we add the time of one initialization per Parser/ParserBase class instance and only on demand. After that the parser is re-used when needed for any future parse calls. Additionally it only needs to be called once for the outer group used in a property value (i.e. `prop:OP:((()))` will only cause a single "sub parse").
|
|
405
|
-
*/
|
|
406
|
-
const subInput = this.rawInput.slice(start, end)
|
|
407
|
-
|
|
408
|
-
if (this.subParser === undefined) {
|
|
409
|
-
this.subParser = new Parser({
|
|
410
|
-
...opts,
|
|
411
|
-
customPropertyOperators: [],
|
|
412
|
-
expandedPropertySeparator: undefined,
|
|
413
|
-
regexValues: convertRegexValues,
|
|
414
|
-
arrayValues: convertArrayValues,
|
|
415
|
-
})
|
|
416
|
-
}
|
|
417
|
-
// @ts-expect-error extra param
|
|
418
|
-
const parsed = this.subParser.parse(" ".repeat(start) + subInput, { unsealed: true })
|
|
419
|
-
return [parenL, parsed, parenR]
|
|
420
|
-
}
|
|
421
|
-
// return parsed
|
|
422
|
-
return [parenL, condition, parenR]
|
|
423
|
-
})
|
|
424
|
-
})
|
|
425
|
-
$.RULE("plainBracketGroup", (
|
|
426
|
-
{ convertArrayValues = false }:
|
|
427
|
-
{ convertArrayValues?: boolean } = {}
|
|
428
|
-
) => {
|
|
429
|
-
const bracketL = $.SUBRULE1($.bracketL)
|
|
430
|
-
const start = bracketL.start
|
|
431
|
-
const values: any[] = []
|
|
432
|
-
$.MANY({
|
|
433
|
-
GATE: () => !convertArrayValues,
|
|
434
|
-
DEF: () => values.push($.SUBRULE<any, any>($.variable, { ARGS: [{ unprefixed: false, bracketVal: true }]})),
|
|
435
|
-
})
|
|
436
|
-
// bypasses self analysis (which goes into an infinite loop for some reason...)
|
|
437
|
-
// see subParser hack below for why
|
|
438
|
-
if (convertArrayValues && $.LA(1).tokenType !== EOF) {
|
|
439
|
-
while (
|
|
440
|
-
!tokenMatcher($.LA(1), EOF) &&
|
|
441
|
-
!tokenMatcher($.LA(1), t.BRACKET_R)
|
|
442
|
-
) {
|
|
443
|
-
$.CONSUME(t.ANY)
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
|
-
const bracketR = $.OPTION2(() => $.SUBRULE1($.bracketR))
|
|
447
|
-
const end = bracketR?.end
|
|
448
|
-
|
|
449
|
-
return $.ACTION(() => {
|
|
450
|
-
if (!convertArrayValues) return handle.array(bracketL, values, bracketR)
|
|
451
|
-
/**
|
|
452
|
-
* Similar problem as with regex values above.
|
|
453
|
-
*/
|
|
454
|
-
const subInput = this.rawInput.slice(start, end)
|
|
455
|
-
|
|
456
|
-
if (this.subParser2 === undefined) {
|
|
457
|
-
this.subParser2 = new Parser({
|
|
458
|
-
...opts,
|
|
459
|
-
customPropertyOperators: [],
|
|
460
|
-
expandedPropertySeparator: undefined,
|
|
461
|
-
arrayValues: false,
|
|
462
|
-
})
|
|
463
|
-
}
|
|
464
|
-
// @ts-expect-error extra param
|
|
465
|
-
const parsed = this.subParser2.parse(" ".repeat(start) + subInput, { unsealed: true })
|
|
466
|
-
|
|
467
|
-
if (parsed instanceof ConditionNode) {
|
|
468
|
-
return parsed.value
|
|
469
|
-
}
|
|
470
|
-
return parsed
|
|
471
|
-
})
|
|
472
|
-
})
|
|
473
|
-
|
|
474
|
-
$.RULE("not", () => {
|
|
475
|
-
const op = $.CONSUME(t.OPERATOR_NOT)
|
|
476
|
-
return $.ACTION(() => handle.operator.not(...processToken<true>(op, $.shift)))
|
|
477
|
-
})
|
|
478
|
-
|
|
479
|
-
$.RULE("variable", (
|
|
480
|
-
{ unprefixed = false, bracketVal = false }:
|
|
481
|
-
{ unprefixed?: boolean, bracketVal?: boolean } = {}
|
|
482
|
-
) => {
|
|
483
|
-
let prefix: any = $.OPTION({
|
|
484
|
-
GATE: () => !unprefixed && opts.prefixableStrings !== undefined &&
|
|
485
|
-
tokenMatcher($.LA(2), t.QUOTE_ANY) &&
|
|
486
|
-
tokenMatcher($.LA(4), $.LA(2).tokenType) &&
|
|
487
|
-
opts.prefixableStrings.includes($.LA(1).image),
|
|
488
|
-
DEF: () => $.SUBRULE7<any, any>($.valueUnquoted, { ARGS: [{ bracketVal, onlyToken: true }]}),
|
|
489
|
-
})
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
prefix &&= handle.token.value(...processToken(prefix, $.shift))
|
|
493
|
-
|
|
494
|
-
const ARGS = [{ bracketVal }]
|
|
495
|
-
const val = $.OR([
|
|
496
|
-
{
|
|
497
|
-
ALT: () => {
|
|
498
|
-
const quoteL = $.SUBRULE($.quoteDouble)
|
|
499
|
-
const value = $.OPTION1(() => $.OR1([
|
|
500
|
-
{ ALT: () => $.SUBRULE<any, any>($.valueUnquoted, { ARGS }) },
|
|
501
|
-
{ ALT: () => $.SUBRULE($.valueNotDouble) },
|
|
502
|
-
]))
|
|
503
|
-
const quoteR = $.SUBRULE2($.quoteDouble)
|
|
504
|
-
return $.ACTION(() => handle.variable(prefix, quoteL, value, quoteR))
|
|
505
|
-
},
|
|
506
|
-
},
|
|
507
|
-
{
|
|
508
|
-
ALT: () => {
|
|
509
|
-
const quoteL = $.SUBRULE($.quoteSingle)
|
|
510
|
-
const value = $.OPTION2(() => $.OR2([
|
|
511
|
-
{ ALT: () => $.SUBRULE2<any, any>($.valueUnquoted, { ARGS }) },
|
|
512
|
-
{ ALT: () => $.SUBRULE($.valueNotSingle) },
|
|
513
|
-
]))
|
|
514
|
-
const quoteR = $.SUBRULE2($.quoteSingle)
|
|
515
|
-
return $.ACTION(() => handle.variable(prefix, quoteL, value, quoteR))
|
|
516
|
-
},
|
|
517
|
-
},
|
|
518
|
-
{
|
|
519
|
-
ALT: () => {
|
|
520
|
-
const quoteL = $.SUBRULE($.quoteBacktick)
|
|
521
|
-
const value = $.OPTION3(() => $.OR3([
|
|
522
|
-
{ ALT: () => $.SUBRULE3<any, any>($.valueUnquoted, { ARGS }) },
|
|
523
|
-
{ ALT: () => $.SUBRULE($.valueNotBacktick) },
|
|
524
|
-
]))
|
|
525
|
-
const quoteR = $.SUBRULE2($.quoteBacktick)
|
|
526
|
-
return $.ACTION(() => handle.variable(prefix, quoteL, value, quoteR))
|
|
527
|
-
},
|
|
528
|
-
},
|
|
529
|
-
{
|
|
530
|
-
ALT: () => {
|
|
531
|
-
const quoteL = $.SUBRULE($.regexAny) as ValidToken<TOKEN_TYPE.REGEX> // the start can never match flags
|
|
532
|
-
// unlike other values, regexes will swallow all input if incorrect
|
|
533
|
-
const value = $.OPTION4(() => $.SUBRULE5($.valueRegex))
|
|
534
|
-
const quoteR = $.OPTION5(() => $.SUBRULE5($.regexAny))
|
|
535
|
-
return $.ACTION(() => {
|
|
536
|
-
const args = isArray(quoteR) ? quoteR : [quoteR] as [typeof quoteR]
|
|
537
|
-
return handle.variable(undefined, quoteL, value, args[0], args[1])
|
|
538
|
-
})
|
|
539
|
-
},
|
|
540
|
-
},
|
|
541
|
-
{ // error
|
|
542
|
-
ALT: () => {
|
|
543
|
-
const value = $.SUBRULE4<any, any>($.valueUnquoted, { ARGS })
|
|
544
|
-
const quoteR = $.SUBRULE4($.valueDelimAny)
|
|
545
|
-
return $.ACTION(() => handle.variable(undefined, undefined, value, quoteR))
|
|
546
|
-
},
|
|
547
|
-
},
|
|
548
|
-
{ // error
|
|
549
|
-
ALT: () => {
|
|
550
|
-
const quoteL = $.SUBRULE5($.valueDelimAny)
|
|
551
|
-
const value = $.OPTION6(() => $.SUBRULE5<any, any>($.valueUnquoted, { ARGS }))
|
|
552
|
-
return $.ACTION(() => handle.variable(undefined, quoteL, value, undefined))
|
|
553
|
-
},
|
|
554
|
-
},
|
|
555
|
-
{
|
|
556
|
-
ALT: () => {
|
|
557
|
-
const value = $.SUBRULE6<any, any>($.valueUnquoted, { ARGS })
|
|
558
|
-
return $.ACTION(() => handle.variable(undefined, undefined, value, undefined))
|
|
559
|
-
},
|
|
560
|
-
},
|
|
561
|
-
])
|
|
562
|
-
return val
|
|
563
|
-
})
|
|
564
|
-
|
|
565
|
-
$.RULE("valueDelimAny", () => {
|
|
566
|
-
const value = $.CONSUME(t.QUOTE_ANY)
|
|
567
|
-
return $.ACTION(() => {
|
|
568
|
-
const type = value.image === `"`
|
|
569
|
-
? "double"
|
|
570
|
-
: value.image === "'"
|
|
571
|
-
? "single"
|
|
572
|
-
: value.image === "\\"
|
|
573
|
-
? "regex"
|
|
574
|
-
: value.image === "`"
|
|
575
|
-
? "tick"
|
|
576
|
-
: unreachable()
|
|
577
|
-
return handle.delimiter[type](...processToken(value, $.shift))
|
|
578
|
-
})
|
|
579
|
-
})
|
|
580
|
-
$.RULE("regexAny", () => {
|
|
581
|
-
const value = $.CONSUME(t.REGEX_ANY)
|
|
582
|
-
return $.ACTION(() => {
|
|
583
|
-
if (value.image.length > 1) {
|
|
584
|
-
// cheat a bit to extract the flags
|
|
585
|
-
const delim = {
|
|
586
|
-
image: "/",
|
|
587
|
-
startOffset: value.startOffset,
|
|
588
|
-
endOffset: value.startOffset,
|
|
589
|
-
}
|
|
590
|
-
const flags = {
|
|
591
|
-
image: value.image.slice(1),
|
|
592
|
-
startOffset: value.startOffset + 1,
|
|
593
|
-
endOffset: value.endOffset,
|
|
594
|
-
}
|
|
595
|
-
return [
|
|
596
|
-
handle.delimiter.regex(...processToken(delim as IToken, $.shift)),
|
|
597
|
-
handle.token.value(...processToken(flags as IToken, $.shift)),
|
|
598
|
-
]
|
|
599
|
-
}
|
|
600
|
-
return handle.delimiter.regex(...processToken(value, $.shift))
|
|
601
|
-
})
|
|
602
|
-
})
|
|
603
|
-
$.RULE("valueRegex", () => {
|
|
604
|
-
const value = $.CONSUME(t.VALUE_REGEX)
|
|
605
|
-
return $.ACTION(() => handle.token.value(...processToken(value, $.shift)))
|
|
606
|
-
})
|
|
607
|
-
$.RULE("quoteSingle", () => {
|
|
608
|
-
const value = $.CONSUME(t.QUOTE_SINGLE)
|
|
609
|
-
return $.ACTION(() => handle.delimiter.single(...processToken(value, $.shift)))
|
|
610
|
-
})
|
|
611
|
-
$.RULE("quoteDouble", () => {
|
|
612
|
-
const value = $.CONSUME(t.QUOTE_DOUBLE)
|
|
613
|
-
return $.ACTION(() => handle.delimiter.double(...processToken(value, $.shift)))
|
|
614
|
-
})
|
|
615
|
-
$.RULE("quoteBacktick", () => {
|
|
616
|
-
const value = $.CONSUME(t.QUOTE_BACKTICK)
|
|
617
|
-
return $.ACTION(() => handle.delimiter.tick(...processToken(value, $.shift)))
|
|
618
|
-
})
|
|
619
|
-
$.RULE("valueNotSingle", () => {
|
|
620
|
-
const value = $.CONSUME(t.VALUE_FOR_SINGLE)
|
|
621
|
-
return $.ACTION(() => handle.token.value(...processToken(value, $.shift)))
|
|
622
|
-
})
|
|
623
|
-
$.RULE("valueNotDouble", () => {
|
|
624
|
-
const value = $.CONSUME(t.VALUE_FOR_DOUBLE)
|
|
625
|
-
return $.ACTION(() => handle.token.value(...processToken(value, $.shift)))
|
|
626
|
-
})
|
|
627
|
-
$.RULE("valueNotBacktick", () => {
|
|
628
|
-
const value = $.CONSUME(t.VALUE_FOR_BACKTICK)
|
|
629
|
-
return $.ACTION(() => handle.token.value(...processToken(value, $.shift)))
|
|
630
|
-
})
|
|
631
|
-
$.RULE("valueUnquoted", (
|
|
632
|
-
{ bracketVal = false, onlyToken = false }:
|
|
633
|
-
{ bracketVal?: boolean, onlyToken?: boolean } = {}
|
|
634
|
-
) => {
|
|
635
|
-
const value: any = $.OR([
|
|
636
|
-
{
|
|
637
|
-
GATE: () => !bracketVal,
|
|
638
|
-
ALT: () => $.CONSUME(t.VALUE_UNQUOTED),
|
|
639
|
-
},
|
|
640
|
-
{
|
|
641
|
-
GATE: () => bracketVal,
|
|
642
|
-
ALT: () => $.CONSUME(t.BRACKET_VALUE_UNQUOTED),
|
|
643
|
-
},
|
|
644
|
-
])
|
|
645
|
-
return $.ACTION(() => onlyToken ? value : handle.token.value(...processToken(value, $.shift)))
|
|
646
|
-
})
|
|
647
|
-
$.RULE("parenL", () => {
|
|
648
|
-
const value = $.CONSUME(t.PAREN_L)
|
|
649
|
-
|
|
650
|
-
return $.ACTION(() => {
|
|
651
|
-
// magic, see parse
|
|
652
|
-
const loc = extractPosition(value, $.shift)
|
|
653
|
-
return $.shift === 0 || loc.start > 0
|
|
654
|
-
? handle.delimiter.parenL(value.isInsertedInRecovery ? undefined : value.image, loc)
|
|
655
|
-
: undefined
|
|
656
|
-
})
|
|
657
|
-
})
|
|
658
|
-
$.RULE("parenR", () => {
|
|
659
|
-
const value: any = $.CONSUME(t.PAREN_R)
|
|
660
|
-
return $.ACTION(() => handle.delimiter.parenR(...processToken(value, $.shift)))
|
|
661
|
-
})
|
|
662
|
-
$.RULE("bracketL", () => {
|
|
663
|
-
const value = $.CONSUME(t.BRACKET_L)
|
|
664
|
-
|
|
665
|
-
return $.ACTION(() => {
|
|
666
|
-
// magic, see parse
|
|
667
|
-
const loc = extractPosition(value, $.shift)
|
|
668
|
-
return $.shift === 0 || loc.start > 0
|
|
669
|
-
? handle.delimiter.bracketL(value.isInsertedInRecovery ? undefined : value.image, loc)
|
|
670
|
-
: undefined
|
|
671
|
-
})
|
|
672
|
-
})
|
|
673
|
-
$.RULE("bracketR", () => {
|
|
674
|
-
const value: any = $.CONSUME(t.BRACKET_R)
|
|
675
|
-
return $.ACTION(() => handle.delimiter.bracketR(...processToken(value, $.shift)))
|
|
676
|
-
})
|
|
677
|
-
this.performSelfAnalysis()
|
|
678
|
-
}
|
|
679
|
-
}
|
|
680
|
-
export interface ParserBase {
|
|
681
|
-
shift: number
|
|
682
|
-
main: () => ParserResults
|
|
683
|
-
anySym: () => IToken
|
|
684
|
-
boolOr: () => ExpressionNode
|
|
685
|
-
boolAnd: () => ExpressionNode
|
|
686
|
-
condition: () => ConditionNode | GroupNode
|
|
687
|
-
// the arguments to add a property to a condition node
|
|
688
|
-
property: () => {
|
|
689
|
-
prop?: VariableNode
|
|
690
|
-
rest: {
|
|
691
|
-
sepL?: ValidToken<TOKEN_TYPE.OP_EXPANDED_SEP>
|
|
692
|
-
sepR?: ValidToken<TOKEN_TYPE.OP_EXPANDED_SEP>
|
|
693
|
-
propertyOperator?: ConditionNode["propertyOperator"]
|
|
694
|
-
}
|
|
695
|
-
}
|
|
696
|
-
// not an actual group node but the arguments to create one
|
|
697
|
-
plainGroup: () => [ValidToken<TOKEN_TYPE.PARENL>, GroupNode["expression"], ValidToken<TOKEN_TYPE.PARENR> | undefined]
|
|
698
|
-
plainBracketGroup: () => ArrayNode
|
|
699
|
-
not: () => ValidToken<TOKEN_TYPE.NOT> // is always valid since it's optional
|
|
700
|
-
variable: () => VariableNode
|
|
701
|
-
valueDelimAny: () => AnyToken<TokenQuoteTypes>
|
|
702
|
-
quoteSingle: () => AnyToken<TOKEN_TYPE.SINGLEQUOTE>
|
|
703
|
-
quoteDouble: () => AnyToken<TOKEN_TYPE.DOUBLEQUOTE>
|
|
704
|
-
quoteBacktick: () => AnyToken<TOKEN_TYPE.BACKTICK>
|
|
705
|
-
regexAny: () => AnyToken<TOKEN_TYPE.REGEX> | [AnyToken<TOKEN_TYPE.REGEX>, ValidToken<TOKEN_TYPE.VALUE>]
|
|
706
|
-
valueNotSingle: () => AnyToken<TOKEN_TYPE.VALUE>
|
|
707
|
-
valueNotDouble: () => AnyToken<TOKEN_TYPE.VALUE>
|
|
708
|
-
valueNotBacktick: () => AnyToken<TOKEN_TYPE.VALUE>
|
|
709
|
-
valueUnquoted: () => AnyToken<TOKEN_TYPE.VALUE>
|
|
710
|
-
valueRegex: () => AnyToken<TOKEN_TYPE.VALUE>
|
|
711
|
-
parenL: () => ValidToken<TOKEN_TYPE.PARENL> // always valid, see getUnclosedRightParenCount for magic
|
|
712
|
-
parenR: () => ValidToken<TOKEN_TYPE.PARENR> | undefined
|
|
713
|
-
bracketL: () => ValidToken<TOKEN_TYPE.BRACKETL> // always valid, see getUnclosedRightParenCount for magic
|
|
714
|
-
bracketR: () => ValidToken<TOKEN_TYPE.BRACKETR> | undefined
|
|
715
|
-
}
|