extra-parser 0.2.4 → 0.3.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 +21 -7
- package/lib/parse.d.ts +1 -1
- package/lib/parse.js +2 -2
- package/lib/parse.js.map +1 -1
- package/lib/tokenize.d.ts +1 -1
- package/lib/tokenize.js +2 -2
- package/lib/tokenize.js.map +1 -1
- package/lib/types.d.ts +3 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -27,13 +27,16 @@ interface INodePatternMatch<Node extends INode<string>> {
|
|
|
27
27
|
node: Node
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
(text: string)
|
|
30
|
+
interface ITokenPattern<Token extends IToken<string>> {
|
|
31
|
+
(text: string): Awaitable<ITokenPatternMatch<Token> | Falsy>
|
|
32
|
+
}
|
|
32
33
|
|
|
33
|
-
|
|
34
|
+
interface INodePattern<
|
|
34
35
|
Token extends IToken<string>
|
|
35
36
|
, Node extends INode<string>
|
|
36
|
-
>
|
|
37
|
+
> {
|
|
38
|
+
(tokens: ReadonlyArray<Token>): Awaitable<INodePatternMatch<Node> | Falsy>
|
|
39
|
+
}
|
|
37
40
|
```
|
|
38
41
|
|
|
39
42
|
### tokenize
|
|
@@ -44,7 +47,7 @@ function tokenize<
|
|
|
44
47
|
>(
|
|
45
48
|
text: string
|
|
46
49
|
, patterns: Array<TokenPattern>
|
|
47
|
-
):
|
|
50
|
+
): AsyncIterableIterator<Token>
|
|
48
51
|
```
|
|
49
52
|
|
|
50
53
|
### parse
|
|
@@ -52,11 +55,11 @@ function tokenize<
|
|
|
52
55
|
function parse<
|
|
53
56
|
Token extends IToken<string>
|
|
54
57
|
, Node extends INode<string>
|
|
55
|
-
, NodePattern extends INodePattern<Token, Node> = INodePattern<Token, Node>
|
|
58
|
+
, NodePattern extends INodePattern<Token, Node> = INodePattern<Token, Node>
|
|
56
59
|
>(
|
|
57
60
|
tokens: Array<Token>
|
|
58
61
|
, patterns: Array<NodePattern>
|
|
59
|
-
):
|
|
62
|
+
): AsyncIterableIterator<Node>
|
|
60
63
|
```
|
|
61
64
|
|
|
62
65
|
### createTokenPatternFromRegExp
|
|
@@ -70,3 +73,14 @@ function createTokenPatternFromRegExp<Token extends IToken<string>>(
|
|
|
70
73
|
, regExp: RegExp
|
|
71
74
|
): ITokenPattern<IToken<Token['type']>>
|
|
72
75
|
```
|
|
76
|
+
|
|
77
|
+
## FAQ
|
|
78
|
+
### Why are functions asynchronous?
|
|
79
|
+
Some parsers make heavy use of recursion,
|
|
80
|
+
and most JavaScript engines do not support tail-call optimization,
|
|
81
|
+
which leads to the possibility of stack overflow in programs.
|
|
82
|
+
|
|
83
|
+
Asynchronous functions are an escape route:
|
|
84
|
+
developers can change recursive functions to asynchronous recursive functions
|
|
85
|
+
to get their programs out of stack overflow problems
|
|
86
|
+
without significantly reducing readability.
|
package/lib/parse.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { IToken, INodePattern, INode } from './types';
|
|
2
|
-
export declare function parse<Token extends IToken<string>, Node extends INode<string>, NodePattern extends INodePattern<Token, Node> = INodePattern<Token, Node>>(tokens: Array<Token>, patterns: Array<NodePattern>):
|
|
2
|
+
export declare function parse<Token extends IToken<string>, Node extends INode<string>, NodePattern extends INodePattern<Token, Node> = INodePattern<Token, Node>>(tokens: Array<Token>, patterns: Array<NodePattern>): AsyncIterableIterator<Node>;
|
package/lib/parse.js
CHANGED
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.parse = void 0;
|
|
4
4
|
const prelude_1 = require("@blackglory/prelude");
|
|
5
|
-
function* parse(tokens, patterns) {
|
|
5
|
+
async function* parse(tokens, patterns) {
|
|
6
6
|
let i = 0;
|
|
7
7
|
loop: while (i < tokens.length) {
|
|
8
8
|
const remainingTokens = tokens.slice(i);
|
|
9
9
|
for (const pattern of patterns) {
|
|
10
|
-
const result = pattern(remainingTokens);
|
|
10
|
+
const result = await pattern(remainingTokens);
|
|
11
11
|
if ((0, prelude_1.isntFalsy)(result)) {
|
|
12
12
|
yield result.node;
|
|
13
13
|
i += result.consumed;
|
package/lib/parse.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":";;;AAAA,iDAA+C;
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":";;;AAAA,iDAA+C;AAGxC,KAAK,SAAS,CAAC,CAAC,KAAK,CAK1B,MAAoB,EACpB,QAA4B;IAE5B,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,IAAI,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE;QAC9B,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAEvC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;YAC9B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,CAAA;YAC7C,IAAI,IAAA,mBAAS,EAAC,MAAM,CAAC,EAAE;gBACrB,MAAM,MAAM,CAAC,IAAI,CAAA;gBACjB,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAA;gBACpB,SAAS,IAAI,CAAA;aACd;SACF;QAED,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,CAAC,CAAA;KAC1E;AACH,CAAC;AAvBD,sBAuBC"}
|
package/lib/tokenize.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { ITokenPattern, IToken } from './types';
|
|
2
|
-
export declare function tokenize<Token extends IToken<string>, TokenPattern extends ITokenPattern<Token> = ITokenPattern<Token>>(text: string, patterns: Array<TokenPattern>):
|
|
2
|
+
export declare function tokenize<Token extends IToken<string>, TokenPattern extends ITokenPattern<Token> = ITokenPattern<Token>>(text: string, patterns: Array<TokenPattern>): AsyncIterableIterator<Token>;
|
package/lib/tokenize.js
CHANGED
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.tokenize = void 0;
|
|
4
4
|
const prelude_1 = require("@blackglory/prelude");
|
|
5
|
-
function* tokenize(text, patterns) {
|
|
5
|
+
async function* tokenize(text, patterns) {
|
|
6
6
|
let i = 0;
|
|
7
7
|
loop: while (i < text.length) {
|
|
8
8
|
const remainingText = text.slice(i);
|
|
9
9
|
for (const pattern of patterns) {
|
|
10
|
-
const result = pattern(remainingText);
|
|
10
|
+
const result = await pattern(remainingText);
|
|
11
11
|
if ((0, prelude_1.isntFalsy)(result)) {
|
|
12
12
|
yield result.token;
|
|
13
13
|
i += result.consumed;
|
package/lib/tokenize.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenize.js","sourceRoot":"","sources":["../src/tokenize.ts"],"names":[],"mappings":";;;AAAA,iDAA+C;
|
|
1
|
+
{"version":3,"file":"tokenize.js","sourceRoot":"","sources":["../src/tokenize.ts"],"names":[],"mappings":";;;AAAA,iDAA+C;AAGxC,KAAK,SAAS,CAAC,CAAC,QAAQ,CAI7B,IAAY,EACZ,QAA6B;IAE7B,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,IAAI,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE;QAC5B,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAEnC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;YAC9B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,CAAA;YAC3C,IAAI,IAAA,mBAAS,EAAC,MAAM,CAAC,EAAE;gBACrB,MAAM,MAAM,CAAC,KAAK,CAAA;gBAClB,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAA;gBACpB,SAAS,IAAI,CAAA;aACd;SACF;QAED,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;KAClE;AACH,CAAC;AAtBD,4BAsBC"}
|
package/lib/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Falsy } from '@blackglory/prelude';
|
|
1
|
+
import { Falsy, Awaitable } from '@blackglory/prelude';
|
|
2
2
|
export interface IToken<Type extends string> {
|
|
3
3
|
type: Type;
|
|
4
4
|
value: string;
|
|
@@ -15,8 +15,8 @@ export interface INodePatternMatch<Node extends INode<string>> {
|
|
|
15
15
|
node: Node;
|
|
16
16
|
}
|
|
17
17
|
export interface ITokenPattern<Token extends IToken<string>> {
|
|
18
|
-
(text: string): ITokenPatternMatch<Token> | Falsy
|
|
18
|
+
(text: string): Awaitable<ITokenPatternMatch<Token> | Falsy>;
|
|
19
19
|
}
|
|
20
20
|
export interface INodePattern<Token extends IToken<string>, Node extends INode<string>> {
|
|
21
|
-
(tokens:
|
|
21
|
+
(tokens: ReadonlyArray<Token>): Awaitable<INodePatternMatch<Node> | Falsy>;
|
|
22
22
|
}
|