extra-parser 0.2.5 → 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 CHANGED
@@ -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
- ): IterableIterator<Token>
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
- ): IterableIterator<Node>
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.
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>): IterableIterator<Node>;
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;AAG/C,QAAe,CAAC,CAAC,KAAK,CAKpB,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,OAAO,CAAC,eAAe,CAAC,CAAA;YACvC,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"}
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>): IterableIterator<Token>;
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;
@@ -1 +1 @@
1
- {"version":3,"file":"tokenize.js","sourceRoot":"","sources":["../src/tokenize.ts"],"names":[],"mappings":";;;AAAA,iDAA+C;AAG/C,QAAe,CAAC,CAAC,QAAQ,CAIvB,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,OAAO,CAAC,aAAa,CAAC,CAAA;YACrC,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"}
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: ReadonlyArray<Token>): INodePatternMatch<Node> | Falsy;
21
+ (tokens: ReadonlyArray<Token>): Awaitable<INodePatternMatch<Node> | Falsy>;
22
22
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "extra-parser",
3
- "version": "0.2.5",
3
+ "version": "0.3.0",
4
4
  "description": "",
5
5
  "keywords": [],
6
6
  "files": [