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 CHANGED
@@ -8,13 +8,13 @@ yarn add extra-parser
8
8
 
9
9
  ## API
10
10
  ```ts
11
- interface IToken<Type extends string> {
12
- type: Type
11
+ interface IToken<TokenType extends string> {
12
+ tokenType: TokenType
13
13
  value: string
14
14
  }
15
15
 
16
- interface INode<Type extends string> {
17
- type: Type
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
- ): 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.
@@ -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['type'], regExp: RegExp): ITokenPattern<IToken<Token['type']>>;
3
+ export declare function createTokenPatternFromRegExp<Token extends IToken<string>>(tokenType: Token['tokenType'], regExp: RegExp): ITokenPattern<IToken<Token['tokenType']>>;
@@ -11,7 +11,7 @@ function createTokenPatternFromRegExp(tokenType, regExp) {
11
11
  return {
12
12
  consumed: matchedText.length,
13
13
  token: {
14
- type: tokenType,
14
+ tokenType: tokenType,
15
15
  value: matchedText
16
16
  }
17
17
  };
@@ -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,IAAI,EAAE,SAAS;oBACf,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"}
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>): 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,10 +1,10 @@
1
- import { Falsy } from '@blackglory/prelude';
2
- export interface IToken<Type extends string> {
3
- type: Type;
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<Type extends string> {
7
- type: Type;
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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "extra-parser",
3
- "version": "0.2.5",
3
+ "version": "0.4.0",
4
4
  "description": "",
5
5
  "keywords": [],
6
6
  "files": [