extra-parser 0.2.5 → 0.4.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 +20 -9
- package/lib/create-token-pattern-from-regexp.d.ts +1 -1
- package/lib/create-token-pattern-from-regexp.js +1 -1
- package/lib/create-token-pattern-from-regexp.js.map +1 -1
- 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 +7 -7
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -8,13 +8,13 @@ yarn add extra-parser
|
|
|
8
8
|
|
|
9
9
|
## API
|
|
10
10
|
```ts
|
|
11
|
-
interface IToken<
|
|
12
|
-
|
|
11
|
+
interface IToken<TokenType extends string> {
|
|
12
|
+
tokenType: TokenType
|
|
13
13
|
value: string
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
interface INode<
|
|
17
|
-
|
|
16
|
+
interface INode<NodeType extends string> {
|
|
17
|
+
nodeType: NodeType
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
interface ITokenPatternMatch<Token extends IToken<string>> {
|
|
@@ -28,14 +28,14 @@ interface INodePatternMatch<Node extends INode<string>> {
|
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
interface ITokenPattern<Token extends IToken<string>> {
|
|
31
|
-
(text: string): ITokenPatternMatch<Token> | Falsy
|
|
31
|
+
(text: string): Awaitable<ITokenPatternMatch<Token> | Falsy>
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
interface INodePattern<
|
|
35
35
|
Token extends IToken<string>
|
|
36
36
|
, Node extends INode<string>
|
|
37
37
|
> {
|
|
38
|
-
(tokens: ReadonlyArray<Token>): INodePatternMatch<Node> | Falsy
|
|
38
|
+
(tokens: ReadonlyArray<Token>): Awaitable<INodePatternMatch<Node> | Falsy>
|
|
39
39
|
}
|
|
40
40
|
```
|
|
41
41
|
|
|
@@ -47,7 +47,7 @@ function tokenize<
|
|
|
47
47
|
>(
|
|
48
48
|
text: string
|
|
49
49
|
, patterns: Array<TokenPattern>
|
|
50
|
-
):
|
|
50
|
+
): AsyncIterableIterator<Token>
|
|
51
51
|
```
|
|
52
52
|
|
|
53
53
|
### parse
|
|
@@ -55,11 +55,11 @@ function tokenize<
|
|
|
55
55
|
function parse<
|
|
56
56
|
Token extends IToken<string>
|
|
57
57
|
, Node extends INode<string>
|
|
58
|
-
, NodePattern extends INodePattern<Token, Node> = INodePattern<Token, Node>
|
|
58
|
+
, NodePattern extends INodePattern<Token, Node> = INodePattern<Token, Node>
|
|
59
59
|
>(
|
|
60
60
|
tokens: Array<Token>
|
|
61
61
|
, patterns: Array<NodePattern>
|
|
62
|
-
):
|
|
62
|
+
): AsyncIterableIterator<Node>
|
|
63
63
|
```
|
|
64
64
|
|
|
65
65
|
### createTokenPatternFromRegExp
|
|
@@ -73,3 +73,14 @@ function createTokenPatternFromRegExp<Token extends IToken<string>>(
|
|
|
73
73
|
, regExp: RegExp
|
|
74
74
|
): ITokenPattern<IToken<Token['type']>>
|
|
75
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.
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { IToken, ITokenPattern } from './types';
|
|
2
2
|
export declare function createTokenPatternFromRegExp<TokenType extends string>(tokenType: TokenType, regExp: RegExp): ITokenPattern<IToken<TokenType>>;
|
|
3
|
-
export declare function createTokenPatternFromRegExp<Token extends IToken<string>>(tokenType: Token['
|
|
3
|
+
export declare function createTokenPatternFromRegExp<Token extends IToken<string>>(tokenType: Token['tokenType'], regExp: RegExp): ITokenPattern<IToken<Token['tokenType']>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-token-pattern-from-regexp.js","sourceRoot":"","sources":["../src/create-token-pattern-from-regexp.ts"],"names":[],"mappings":";;;AACA,6CAA4C;AAW5C,SAAgB,4BAA4B,CAC1C,SAAiB,EACjB,MAAc;IAEd,MAAM,gBAAgB,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAA;IAE1D,OAAO,CAAC,IAAY,EAA8C,EAAE;QAClE,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC1C,IAAI,IAAA,gBAAQ,EAAC,MAAM,CAAC,EAAE;YACpB,MAAM,CAAC,WAAW,CAAC,GAAG,MAAM,CAAA;YAC5B,OAAO;gBACL,QAAQ,EAAE,WAAW,CAAC,MAAM;gBAC5B,KAAK,EAAE;oBACL,
|
|
1
|
+
{"version":3,"file":"create-token-pattern-from-regexp.js","sourceRoot":"","sources":["../src/create-token-pattern-from-regexp.ts"],"names":[],"mappings":";;;AACA,6CAA4C;AAW5C,SAAgB,4BAA4B,CAC1C,SAAiB,EACjB,MAAc;IAEd,MAAM,gBAAgB,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAA;IAE1D,OAAO,CAAC,IAAY,EAA8C,EAAE;QAClE,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC1C,IAAI,IAAA,gBAAQ,EAAC,MAAM,CAAC,EAAE;YACpB,MAAM,CAAC,WAAW,CAAC,GAAG,MAAM,CAAA;YAC5B,OAAO;gBACL,QAAQ,EAAE,WAAW,CAAC,MAAM;gBAC5B,KAAK,EAAE;oBACL,SAAS,EAAE,SAAS;oBACpB,KAAK,EAAE,WAAW;iBACnB;aACF,CAAA;SACF;aAAM;YACL,OAAO,KAAK,CAAA;SACb;IACH,CAAC,CAAA;AACH,CAAC;AArBD,oEAqBC;AAED,SAAS,yBAAyB,CAAC,EAAU;IAC3C,OAAO,IAAI,MAAM,CACf,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,EACvD,EAAE,CAAC,KAAK,CACT,CAAA;AACH,CAAC"}
|
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,10 +1,10 @@
|
|
|
1
|
-
import { Falsy } from '@blackglory/prelude';
|
|
2
|
-
export interface IToken<
|
|
3
|
-
|
|
1
|
+
import { Falsy, Awaitable } from '@blackglory/prelude';
|
|
2
|
+
export interface IToken<TokenType extends string> {
|
|
3
|
+
tokenType: TokenType;
|
|
4
4
|
value: string;
|
|
5
5
|
}
|
|
6
|
-
export interface INode<
|
|
7
|
-
|
|
6
|
+
export interface INode<NodeType extends string> {
|
|
7
|
+
nodeType: NodeType;
|
|
8
8
|
}
|
|
9
9
|
export interface ITokenPatternMatch<Token extends IToken<string>> {
|
|
10
10
|
consumed: number;
|
|
@@ -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: ReadonlyArray<Token>): INodePatternMatch<Node> | Falsy
|
|
21
|
+
(tokens: ReadonlyArray<Token>): Awaitable<INodePatternMatch<Node> | Falsy>;
|
|
22
22
|
}
|