@witchcraft/expressit 0.2.2 → 0.3.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 +1 -2
- package/dist/Lexer.d.ts +99 -94
- package/dist/Lexer.d.ts.map +1 -1
- package/dist/Lexer.js +221 -574
- package/dist/Parser.d.ts +26 -26
- package/dist/Parser.d.ts.map +1 -1
- package/dist/Parser.js +106 -116
- package/dist/ast/builders/array.js +7 -8
- package/dist/ast/builders/condition.d.ts +1 -1
- package/dist/ast/builders/condition.d.ts.map +1 -1
- package/dist/ast/builders/condition.js +2 -1
- package/dist/ast/builders/delim.d.ts +2 -2
- package/dist/ast/builders/delim.d.ts.map +1 -1
- package/dist/ast/builders/error.d.ts +2 -2
- package/dist/ast/builders/error.d.ts.map +1 -1
- package/dist/ast/builders/expression.d.ts +2 -2
- package/dist/ast/builders/expression.d.ts.map +1 -1
- package/dist/ast/builders/expression.js +4 -8
- package/dist/ast/builders/group.d.ts +1 -1
- package/dist/ast/builders/group.d.ts.map +1 -1
- package/dist/ast/builders/group.js +8 -11
- package/dist/ast/builders/pos.d.ts +2 -2
- package/dist/ast/builders/pos.d.ts.map +1 -1
- package/dist/ast/builders/token.d.ts +2 -2
- package/dist/ast/builders/token.d.ts.map +1 -1
- package/dist/ast/builders/token.js +1 -1
- package/dist/ast/builders/type.d.ts +2 -2
- package/dist/ast/builders/type.d.ts.map +1 -1
- package/dist/ast/builders/variable.d.ts +3 -3
- package/dist/ast/builders/variable.d.ts.map +1 -1
- package/dist/ast/builders/variable.js +5 -6
- package/dist/ast/createConditionNode.d.ts +1 -1
- package/dist/ast/createConditionNode.d.ts.map +1 -1
- package/dist/ast/createConditionNode.js +1 -2
- package/dist/ast/createGroupNode.d.ts +1 -1
- package/dist/ast/createGroupNode.d.ts.map +1 -1
- package/dist/ast/createToken.d.ts +2 -2
- package/dist/ast/createToken.d.ts.map +1 -1
- package/dist/ast/createToken.js +2 -2
- package/dist/ast/error.d.ts +2 -2
- package/dist/ast/error.d.ts.map +1 -1
- package/dist/ast/error.js +1 -0
- package/dist/ast/handlers.d.ts +23 -23
- package/dist/ast/handlers.d.ts.map +1 -1
- package/dist/ast/handlers.js +23 -26
- package/dist/examples/ParserWithSqlSupport.d.ts +5 -5
- package/dist/examples/ParserWithSqlSupport.d.ts.map +1 -1
- package/dist/examples/ParserWithSqlSupport.js +22 -28
- package/dist/examples/ShortcutContextParser.js +2 -5
- package/dist/index.js +2 -2
- package/dist/internal/ExpressitError.d.ts +2 -2
- package/dist/internal/ExpressitError.d.ts.map +1 -1
- package/dist/internal/ExpressitError.js +7 -10
- package/dist/internal/checkParserOpts.js +21 -22
- package/dist/internal/escapeVariableOrPrefix.js +1 -1
- package/dist/internal/parseParserOptions.js +3 -4
- package/dist/package.json.js +2 -60
- package/dist/types/ast.d.ts +60 -58
- package/dist/types/ast.d.ts.map +1 -1
- package/dist/types/ast.js +26 -27
- package/dist/types/autocomplete.d.ts +23 -21
- package/dist/types/autocomplete.d.ts.map +1 -1
- package/dist/types/autocomplete.js +24 -21
- package/dist/types/errors.d.ts +12 -10
- package/dist/types/errors.d.ts.map +1 -1
- package/dist/types/errors.js +8 -7
- package/dist/types/index.js +2 -2
- package/dist/types/parser.d.ts +3 -3
- package/dist/types/parser.d.ts.map +1 -1
- package/dist/utils/extractTokens.js +4 -5
- package/dist/utils/generateParentsMap.js +7 -8
- package/dist/utils/getCursorInfo.js +5 -3
- package/dist/utils/getOppositeDelimiter.d.ts +2 -2
- package/dist/utils/getOppositeDelimiter.d.ts.map +1 -1
- package/dist/utils/getOppositeDelimiter.js +1 -1
- package/dist/utils/getSurroundingErrors.js +2 -3
- package/dist/utils/isBracket.js +1 -1
- package/dist/utils/isDelimiter.d.ts +2 -2
- package/dist/utils/isDelimiter.d.ts.map +1 -1
- package/dist/utils/isDelimiter.js +1 -1
- package/dist/utils/isNode.js +1 -1
- package/dist/utils/isParen.d.ts +2 -2
- package/dist/utils/isParen.d.ts.map +1 -1
- package/dist/utils/isParen.js +1 -1
- package/dist/utils/isQuote.d.ts +2 -2
- package/dist/utils/isQuote.d.ts.map +1 -1
- package/dist/utils/isQuote.js +1 -1
- package/dist/utils/isToken.js +1 -1
- package/dist/utils/prettyAst.js +10 -11
- package/package.json +19 -20
- package/src/Lexer.ts +100 -90
- package/src/Parser.ts +68 -68
- package/src/ast/builders/condition.ts +3 -3
- package/src/ast/builders/delim.ts +4 -4
- package/src/ast/builders/error.ts +3 -3
- package/src/ast/builders/expression.ts +4 -8
- package/src/ast/builders/group.ts +2 -4
- package/src/ast/builders/pos.ts +3 -3
- package/src/ast/builders/token.ts +3 -3
- package/src/ast/builders/type.ts +2 -2
- package/src/ast/builders/variable.ts +5 -5
- package/src/ast/createConditionNode.ts +2 -2
- package/src/ast/createGroupNode.ts +4 -4
- package/src/ast/createToken.ts +6 -6
- package/src/ast/error.ts +2 -2
- package/src/ast/handlers.ts +20 -20
- package/src/examples/ParserWithSqlSupport.ts +12 -6
- package/src/internal/ExpressitError.ts +6 -6
- package/src/internal/checkParserOpts.ts +13 -13
- package/src/internal/escapeVariableOrPrefix.ts +1 -1
- package/src/types/ast.ts +101 -96
- package/src/types/autocomplete.ts +26 -22
- package/src/types/errors.ts +18 -13
- package/src/types/parser.ts +3 -3
- package/src/utils/extractTokens.ts +1 -1
- package/src/utils/getCursorInfo.ts +2 -2
- package/src/utils/getOppositeDelimiter.ts +3 -3
- package/src/utils/getSurroundingErrors.ts +4 -4
- package/src/utils/isDelimiter.ts +3 -3
- package/src/utils/isParen.ts +2 -2
- package/src/utils/isQuote.ts +2 -2
- package/src/utils/prettyAst.ts +3 -3
package/src/Lexer.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import type { EnumLike } from "@alanscodelog/utils"
|
|
2
|
+
import { enumFromArray } from "@alanscodelog/utils/enumFromArray"
|
|
3
|
+
import { isBlank } from "@alanscodelog/utils/isBlank"
|
|
4
|
+
import { pushIfNotIn } from "@alanscodelog/utils/pushIfNotIn"
|
|
3
5
|
|
|
4
6
|
import { checkParserOpts } from "./internal/checkParserOpts.js"
|
|
5
7
|
import { parseParserOptions } from "./internal/parseParserOptions.js"
|
|
@@ -7,63 +9,68 @@ import type { FullParserOptions } from "./types/index.js"
|
|
|
7
9
|
|
|
8
10
|
const regexFlags = /^[a-zA-Z]+/
|
|
9
11
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
12
|
+
const MODE = enumFromArray([
|
|
13
|
+
"MAIN",
|
|
14
|
+
"MAYBE_QUOTE_ERROR",
|
|
15
|
+
"NOT_SINGLE",
|
|
16
|
+
"NOT_DOUBLE",
|
|
17
|
+
"NOT_BACKTICK",
|
|
18
|
+
"NOT_REGEX",
|
|
19
|
+
"REGEX_END",
|
|
20
|
+
"BRACKET_MAIN",
|
|
21
|
+
"BRACKET_MAYBE_QUOTE_ERROR",
|
|
22
|
+
"BRACKET_NOT_SINGLE",
|
|
23
|
+
"BRACKET_NOT_DOUBLE",
|
|
24
|
+
"BRACKET_NOT_BACKTICK",
|
|
25
|
+
"BRACKET_NOT_REGEX",
|
|
26
|
+
"BRACKET_REGEX_END",
|
|
27
|
+
])
|
|
28
|
+
|
|
25
29
|
const BRACKET_PREFIX = "BRACKET"
|
|
26
30
|
|
|
31
|
+
export const $T = enumFromArray([
|
|
32
|
+
"_",
|
|
33
|
+
"VALUE_UNQUOTED",
|
|
34
|
+
"VALUE_REGEX",
|
|
35
|
+
"VALUE_NOT_SINGLE",
|
|
36
|
+
"VALUE_NOT_DOUBLE",
|
|
37
|
+
"VALUE_NOT_BACKTICK",
|
|
38
|
+
"SYM_OR",
|
|
39
|
+
"SYM_AND",
|
|
40
|
+
"SYM_NOT",
|
|
41
|
+
"WORD_OR",
|
|
42
|
+
"WORD_AND",
|
|
43
|
+
"WORD_NOT",
|
|
44
|
+
"REGEX_START",
|
|
45
|
+
"REGEX_END",
|
|
46
|
+
"EXP_PROP_OP",
|
|
47
|
+
"CUSTOM_PROP_OP",
|
|
48
|
+
"PAREN_L",
|
|
49
|
+
"PAREN_R",
|
|
50
|
+
"BRACKET_L",
|
|
51
|
+
"BRACKET_R",
|
|
52
|
+
"QUOTE_SINGLE",
|
|
53
|
+
"QUOTE_DOUBLE",
|
|
54
|
+
"QUOTE_BACKTICK",
|
|
55
|
+
])
|
|
56
|
+
|
|
27
57
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
28
|
-
export
|
|
29
|
-
_ = "_", // whitespace,
|
|
30
|
-
VALUE_UNQUOTED = "VALUE_UNQUOTED",
|
|
31
|
-
VALUE_REGEX = "VALUE_REGEX",
|
|
32
|
-
VALUE_NOT_SINGLE = "VALUE_NOT_SINGLE",
|
|
33
|
-
VALUE_NOT_DOUBLE = "VALUE_NOT_DOUBLE",
|
|
34
|
-
VALUE_NOT_BACKTICK = "VALUE_NOT_BACKTICK",
|
|
35
|
-
SYM_OR = "SYM_OR",
|
|
36
|
-
SYM_AND = "SYM_AND",
|
|
37
|
-
SYM_NOT = "SYM_NOT",
|
|
38
|
-
WORD_OR = "WORD_OR",
|
|
39
|
-
WORD_AND = "WORD_AND",
|
|
40
|
-
WORD_NOT = "WORD_NOT",
|
|
41
|
-
REGEX_START = "REGEX_START",
|
|
42
|
-
REGEX_END = "REGEX_END",
|
|
43
|
-
EXP_PROP_OP = "EXP_PROP_OP",
|
|
44
|
-
CUSTOM_PROP_OP = "CUSTOM_PROP_OP",
|
|
45
|
-
PAREN_L = "PAREN_L",
|
|
46
|
-
PAREN_R = "PAREN_R",
|
|
47
|
-
BRACKET_L = "BRACKET_L",
|
|
48
|
-
BRACKET_R = "BRACKET_R",
|
|
49
|
-
QUOTE_SINGLE = "QUOTE_SINGLE",
|
|
50
|
-
QUOTE_DOUBLE = "QUOTE_DOUBLE",
|
|
51
|
-
QUOTE_BACKTICK = "QUOTE_BACKTICK",
|
|
52
|
-
}
|
|
58
|
+
export type $TType = EnumLike<typeof $T>
|
|
53
59
|
|
|
60
|
+
export const $C = enumFromArray([
|
|
61
|
+
"ANY",
|
|
62
|
+
"QUOTE_ANY",
|
|
63
|
+
"REGEX_ANY",
|
|
64
|
+
"VALUE_FOR_SINGLE",
|
|
65
|
+
"VALUE_FOR_DOUBLE",
|
|
66
|
+
"VALUE_FOR_BACKTICK",
|
|
67
|
+
"OPERATOR_OR",
|
|
68
|
+
"OPERATOR_AND",
|
|
69
|
+
"OPERATOR_NOT",
|
|
70
|
+
"VALUE",
|
|
71
|
+
])
|
|
54
72
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
55
|
-
export
|
|
56
|
-
ANY = "ANY",
|
|
57
|
-
QUOTE_ANY = "QUOTE_ANY",
|
|
58
|
-
REGEX_ANY = "REGEX_ANY",
|
|
59
|
-
VALUE_FOR_SINGLE = "VALUE_FOR_SINGLE",
|
|
60
|
-
VALUE_FOR_DOUBLE = "VALUE_FOR_DOUBLE",
|
|
61
|
-
VALUE_FOR_BACKTICK = "VALUE_FOR_BACKTICK",
|
|
62
|
-
OPERATOR_OR = "OPERATOR_OR",
|
|
63
|
-
OPERATOR_AND = "OPERATOR_AND",
|
|
64
|
-
OPERATOR_NOT = "OPERATOR_NOT",
|
|
65
|
-
VALUE = "VALUE",
|
|
66
|
-
}
|
|
73
|
+
export type $CType = EnumLike<typeof $C>
|
|
67
74
|
|
|
68
75
|
|
|
69
76
|
type SymbolInfo = {
|
|
@@ -80,40 +87,42 @@ type SymbolInfo = {
|
|
|
80
87
|
|
|
81
88
|
type TokenMatchFunc = (c: string, input: string, start: number, mode: string) => string | boolean
|
|
82
89
|
|
|
83
|
-
interface
|
|
90
|
+
interface LexerBaseToken<T extends $TType | $CType> {
|
|
84
91
|
type: T
|
|
85
92
|
skip?: boolean
|
|
86
93
|
}
|
|
87
|
-
|
|
88
|
-
|
|
94
|
+
|
|
95
|
+
export interface LexerRealToken<
|
|
96
|
+
T extends $TType = $TType,
|
|
89
97
|
TPush extends string | undefined = undefined,
|
|
90
98
|
// TCategories extends $C[] | undefined = undefined,
|
|
91
|
-
> extends
|
|
99
|
+
> extends LexerBaseToken<T> {
|
|
92
100
|
matches: TokenMatchFunc
|
|
93
101
|
push?: TPush | ((mode: string, tokens: Token[]) => TPush)
|
|
94
102
|
// categories?: TCategories
|
|
95
|
-
longerAlt?: $
|
|
103
|
+
longerAlt?: $TType
|
|
96
104
|
skip?: boolean
|
|
97
105
|
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
106
|
+
|
|
107
|
+
export interface LexerCategoryToken<
|
|
108
|
+
TC extends $CType,
|
|
109
|
+
TTokens extends LexerRealToken<$TType, any>[] = LexerRealToken<$TType, any>[],
|
|
110
|
+
> extends LexerBaseToken<TC> {
|
|
102
111
|
isCategory: true
|
|
103
112
|
entries: Partial<Record<TTokens[number]["type"], TTokens[number]>>
|
|
104
113
|
// entries: Partial<Record<TTokens[number]["type"], TTokens[number]>>
|
|
105
114
|
}
|
|
106
115
|
|
|
107
|
-
export type
|
|
108
|
-
?
|
|
109
|
-
: TC extends $
|
|
110
|
-
?
|
|
116
|
+
export type LexerToken<TC extends $CType | $TType> = TC extends $TType
|
|
117
|
+
? LexerRealToken<TC, any>
|
|
118
|
+
: TC extends $CType
|
|
119
|
+
? LexerCategoryToken<TC>
|
|
111
120
|
: never
|
|
112
121
|
|
|
113
|
-
function
|
|
122
|
+
function createLexerCategoryToken<T extends $CType, TTokens extends LexerRealToken<$TType, any>>(
|
|
114
123
|
type: T,
|
|
115
124
|
entries: (TTokens | undefined)[],
|
|
116
|
-
):
|
|
125
|
+
): LexerCategoryToken<T, TTokens[]> {
|
|
117
126
|
return {
|
|
118
127
|
type,
|
|
119
128
|
isCategory: true,
|
|
@@ -125,12 +134,12 @@ function createTokenCategoryType<T extends $C, TTokens extends RealTokenType<$T,
|
|
|
125
134
|
}
|
|
126
135
|
|
|
127
136
|
function createTokenType<
|
|
128
|
-
T extends $
|
|
137
|
+
T extends $TType,
|
|
129
138
|
TPush extends string | undefined = undefined,
|
|
130
139
|
>(
|
|
131
140
|
type: T,
|
|
132
|
-
opts: Omit<
|
|
133
|
-
):
|
|
141
|
+
opts: Omit<LexerRealToken<T, TPush>, "type">,
|
|
142
|
+
): LexerRealToken<T, TPush > {
|
|
134
143
|
return {
|
|
135
144
|
type,
|
|
136
145
|
...opts,
|
|
@@ -164,7 +173,7 @@ function matchSymbol(symbols: string[]): TokenMatchFunc {
|
|
|
164
173
|
}
|
|
165
174
|
}
|
|
166
175
|
|
|
167
|
-
export interface Token<T extends $
|
|
176
|
+
export interface Token<T extends $TType | $CType = $TType | $CType> {
|
|
168
177
|
type: T
|
|
169
178
|
value: string
|
|
170
179
|
startOffset: number
|
|
@@ -175,11 +184,11 @@ export interface Token<T extends $T | $C = $T | $C> {
|
|
|
175
184
|
export class Lexer {
|
|
176
185
|
symbols: SymbolInfo
|
|
177
186
|
|
|
178
|
-
$: {[key in $
|
|
187
|
+
$: {[key in $TType]: LexerRealToken<key, any> }
|
|
179
188
|
|
|
180
189
|
$categories: ReturnType<Lexer["createTokens"]>["$categories"]
|
|
181
190
|
|
|
182
|
-
branches: {[key in keyof typeof MODE]?:
|
|
191
|
+
branches: {[key in keyof typeof MODE]?: LexerToken<$TType>[] }
|
|
183
192
|
|
|
184
193
|
opts: FullParserOptions<any>
|
|
185
194
|
|
|
@@ -509,7 +518,7 @@ export class Lexer {
|
|
|
509
518
|
}),
|
|
510
519
|
}
|
|
511
520
|
const $categories = {
|
|
512
|
-
[$C.ANY]:
|
|
521
|
+
[$C.ANY]: createLexerCategoryToken($C.ANY, [
|
|
513
522
|
$[$T.REGEX_START],
|
|
514
523
|
$[$T.REGEX_END],
|
|
515
524
|
$[$T.QUOTE_SINGLE],
|
|
@@ -532,39 +541,39 @@ export class Lexer {
|
|
|
532
541
|
$[$T.BRACKET_L],
|
|
533
542
|
$[$T.BRACKET_R],
|
|
534
543
|
] as const),
|
|
535
|
-
[$C.VALUE]:
|
|
544
|
+
[$C.VALUE]: createLexerCategoryToken($C.VALUE, [
|
|
536
545
|
$[$T.VALUE_UNQUOTED],
|
|
537
546
|
$[$T.VALUE_NOT_SINGLE],
|
|
538
547
|
$[$T.VALUE_NOT_DOUBLE],
|
|
539
548
|
$[$T.VALUE_NOT_BACKTICK],
|
|
540
549
|
] as const),
|
|
541
|
-
[$C.VALUE_FOR_SINGLE]:
|
|
550
|
+
[$C.VALUE_FOR_SINGLE]: createLexerCategoryToken($C.VALUE_FOR_SINGLE, [
|
|
542
551
|
$[$T.VALUE_NOT_SINGLE],
|
|
543
552
|
] as const),
|
|
544
|
-
[$C.VALUE_FOR_DOUBLE]:
|
|
553
|
+
[$C.VALUE_FOR_DOUBLE]: createLexerCategoryToken($C.VALUE_FOR_DOUBLE, [
|
|
545
554
|
$[$T.VALUE_NOT_DOUBLE],
|
|
546
555
|
] as const),
|
|
547
|
-
[$C.VALUE_FOR_BACKTICK]:
|
|
556
|
+
[$C.VALUE_FOR_BACKTICK]: createLexerCategoryToken($C.VALUE_FOR_BACKTICK, [
|
|
548
557
|
$[$T.VALUE_NOT_BACKTICK],
|
|
549
558
|
] as const),
|
|
550
|
-
[$C.REGEX_ANY]:
|
|
559
|
+
[$C.REGEX_ANY]: createLexerCategoryToken($C.REGEX_ANY, [
|
|
551
560
|
$[$T.REGEX_START],
|
|
552
561
|
$[$T.REGEX_END],
|
|
553
562
|
] as const),
|
|
554
|
-
[$C.QUOTE_ANY]:
|
|
563
|
+
[$C.QUOTE_ANY]: createLexerCategoryToken($C.QUOTE_ANY, [
|
|
555
564
|
$[$T.QUOTE_SINGLE],
|
|
556
565
|
$[$T.QUOTE_DOUBLE],
|
|
557
566
|
$[$T.QUOTE_BACKTICK],
|
|
558
567
|
] as const),
|
|
559
|
-
[$C.OPERATOR_OR]:
|
|
568
|
+
[$C.OPERATOR_OR]: createLexerCategoryToken($C.OPERATOR_OR, [
|
|
560
569
|
$[$T.SYM_OR],
|
|
561
570
|
$[$T.WORD_OR],
|
|
562
571
|
] as const),
|
|
563
|
-
[$C.OPERATOR_AND]:
|
|
572
|
+
[$C.OPERATOR_AND]: createLexerCategoryToken($C.OPERATOR_AND, [
|
|
564
573
|
$[$T.SYM_AND],
|
|
565
574
|
$[$T.WORD_AND],
|
|
566
575
|
] as const),
|
|
567
|
-
[$C.OPERATOR_NOT]:
|
|
576
|
+
[$C.OPERATOR_NOT]: createLexerCategoryToken($C.OPERATOR_NOT, [
|
|
568
577
|
$[$T.SYM_NOT],
|
|
569
578
|
$[$T.WORD_NOT],
|
|
570
579
|
] as const),
|
|
@@ -572,7 +581,7 @@ export class Lexer {
|
|
|
572
581
|
return { $, $categories }
|
|
573
582
|
}
|
|
574
583
|
|
|
575
|
-
createModeBranches(): {[key in keyof typeof MODE]?:
|
|
584
|
+
createModeBranches(): {[key in keyof typeof MODE]?: LexerToken<$TType>[] } {
|
|
576
585
|
const opts = this.opts
|
|
577
586
|
const $ = this.$
|
|
578
587
|
const quotes = [
|
|
@@ -652,13 +661,13 @@ export class Lexer {
|
|
|
652
661
|
}
|
|
653
662
|
|
|
654
663
|
|
|
655
|
-
tokenize(input: string): Token<$
|
|
664
|
+
tokenize(input: string): Token<$TType>[] {
|
|
656
665
|
const branches = this.createModeBranches()
|
|
657
|
-
const tokens: Token<$
|
|
666
|
+
const tokens: Token<$TType>[] = []
|
|
658
667
|
let mode = MODE.MAIN
|
|
659
668
|
let index = 0
|
|
660
669
|
let c = input[index]
|
|
661
|
-
let branch = branches[mode] as any as
|
|
670
|
+
let branch = branches[mode] as any as LexerToken<$TType>[]
|
|
662
671
|
while (index < input.length) {
|
|
663
672
|
for (const t of branch) {
|
|
664
673
|
let match = t.matches(c, input, index, mode)
|
|
@@ -694,7 +703,8 @@ export class Lexer {
|
|
|
694
703
|
return tokens
|
|
695
704
|
}
|
|
696
705
|
}
|
|
697
|
-
|
|
706
|
+
|
|
707
|
+
function createToken<T extends $TType>(type: T, value: string, startOffset: number, endOffset: number): Token<T> {
|
|
698
708
|
return {
|
|
699
709
|
type,
|
|
700
710
|
value,
|