extra-parser 0.1.0 → 0.2.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 CHANGED
@@ -8,53 +8,61 @@ yarn add extra-parser
8
8
 
9
9
  ## API
10
10
  ```ts
11
- interface IToken<T extends string> {
12
- type: T
11
+ interface IToken<Type extends string> {
12
+ type: Type
13
13
  value: string
14
14
  }
15
15
 
16
- interface INode<T extends string> {
17
- type: T
16
+ interface INode<Type extends string> {
17
+ type: Type
18
18
  }
19
19
 
20
- interface ITokenPattern<T extends IToken<any>> {
21
- tokenType: T['type']
20
+ interface ITokenPatternMatch<Token extends IToken<string>> {
21
+ consumed: number
22
+ token: Token
23
+ }
22
24
 
23
- match: (text: string) => {
24
- consumed: number
25
- }
25
+ interface INodePatternMatch<Node extends INode<string>> {
26
+ consumed: number
27
+ node: Node
26
28
  }
27
29
 
28
- interface INodePattern<T extends INode<any>> {
29
- nodeType: T['type']
30
+ type TokenPattern<Token extends IToken<string>> =
31
+ (text: string) => ITokenPatternMatch<Token> | Falsy
30
32
 
31
- parse: (tokens: Array<IToken<any>>) => {
32
- consumed: number
33
- result?: Omit<T, 'type'>
34
- }
35
- }
33
+ type NodePattern<
34
+ Token extends IToken<string>
35
+ , Node extends INode<string>
36
+ > = (tokens: Array<Token>) => INodePatternMatch<Node> | Falsy
36
37
  ```
37
38
 
38
39
  ### tokenize
39
40
  ```ts
40
- function tokenize<T extends string>(
41
- patterns: Array<ITokenPattern<IToken<T>>>
42
- , text: string
43
- ): IterableIterator<IToken<T>>
41
+ function tokenize<
42
+ Token extends IToken<string>
43
+ , TokenPattern extends ITokenPattern<Token>
44
+ >(
45
+ text: string
46
+ , patterns: Array<TokenPattern>
47
+ ): IterableIterator<Token>
44
48
  ```
45
49
 
46
50
  ### parse
47
51
  ```ts
48
- function parse<T extends string, U extends string>(
49
- patterns: Array<INodePattern<INode<T>>>
50
- , tokens: Array<IToken<U>>
51
- ): IterableIterator<INode<T>>
52
+ function parse<
53
+ Token extends IToken<string>
54
+ , Node extends INode<string>
55
+ , NodePattern extends INodePattern<Token, Node>
56
+ >(
57
+ tokens: Array<Token>
58
+ , patterns: Array<NodePattern>
59
+ ): IterableIterator<Node>
52
60
  ```
53
61
 
54
62
  ### createTokenPatternFromRegExp
55
63
  ```ts
56
- function createTokenPatternFromRegExp<T extends string>(
57
- tokenType: T
64
+ function createTokenPatternFromRegExp<TokenType extends string>(
65
+ tokenType: TokenType
58
66
  , regExp: RegExp
59
- ): ITokenPattern<IToken<T>>
67
+ ): TokenPattern<IToken<TokenType>>
60
68
  ```
@@ -1,2 +1,2 @@
1
- import { ITokenPattern, IToken } from './types';
2
- export declare function createTokenPatternFromRegExp<T extends string>(tokenType: T, regExp: RegExp): ITokenPattern<IToken<T>>;
1
+ import { IToken, ITokenPattern } from './types';
2
+ export declare function createTokenPatternFromRegExp<TokenType extends string>(tokenType: TokenType, regExp: RegExp): ITokenPattern<IToken<TokenType>>;
@@ -4,20 +4,22 @@ exports.createTokenPatternFromRegExp = void 0;
4
4
  const types_1 = require("@blackglory/types");
5
5
  function createTokenPatternFromRegExp(tokenType, regExp) {
6
6
  const startsWithRegExp = convertToStartsWithRegExp(regExp);
7
- const pattern = {
8
- tokenType,
9
- match(text) {
10
- const result = startsWithRegExp.exec(text);
11
- if ((0, types_1.isntNull)(result)) {
12
- const [matchedText] = result;
13
- return { consumed: matchedText.length };
14
- }
15
- else {
16
- return { consumed: 0 };
17
- }
7
+ return (text) => {
8
+ const result = startsWithRegExp.exec(text);
9
+ if ((0, types_1.isntNull)(result)) {
10
+ const [matchedText] = result;
11
+ return {
12
+ consumed: matchedText.length,
13
+ token: {
14
+ type: tokenType,
15
+ value: matchedText
16
+ }
17
+ };
18
+ }
19
+ else {
20
+ return false;
18
21
  }
19
22
  };
20
- return pattern;
21
23
  }
22
24
  exports.createTokenPatternFromRegExp = createTokenPatternFromRegExp;
23
25
  function convertToStartsWithRegExp(re) {
@@ -1 +1 @@
1
- {"version":3,"file":"create-token-pattern-from-regexp.js","sourceRoot":"","sources":["../src/create-token-pattern-from-regexp.ts"],"names":[],"mappings":";;;AAAA,6CAA4C;AAG5C,SAAgB,4BAA4B,CAC1C,SAAY,EACZ,MAAc;IAEd,MAAM,gBAAgB,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAA;IAE1D,MAAM,OAAO,GAA6B;QACxC,SAAS;QACT,KAAK,CAAC,IAAI;YACR,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC1C,IAAI,IAAA,gBAAQ,EAAC,MAAM,CAAC,EAAE;gBACpB,MAAM,CAAC,WAAW,CAAC,GAAG,MAAM,CAAA;gBAC5B,OAAO,EAAE,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,CAAA;aACxC;iBAAM;gBACL,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAA;aACvB;QACH,CAAC;KACF,CAAA;IAED,OAAO,OAAO,CAAA;AAChB,CAAC;AApBD,oEAoBC;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;AAG5C,SAAgB,4BAA4B,CAC1C,SAAoB,EACpB,MAAc;IAEd,MAAM,gBAAgB,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAA;IAE1D,OAAO,CAAC,IAAY,EAAiD,EAAE;QACrE,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"}
package/lib/parse.d.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  import { IToken, INodePattern, INode } from './types';
2
- export declare function parse<T extends string, U extends string>(patterns: Array<INodePattern<INode<T>>>, tokens: Array<IToken<U>>): IterableIterator<INode<T>>;
2
+ export declare function parse<Token extends IToken<string>, Node extends INode<string>, NodePattern extends INodePattern<Token, Node>>(tokens: Array<Token>, patterns: Array<NodePattern>): IterableIterator<Node>;
package/lib/parse.js CHANGED
@@ -1,18 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parse = void 0;
4
- function* parse(patterns, tokens) {
4
+ const prelude_1 = require("@blackglory/prelude");
5
+ function* parse(tokens, patterns) {
5
6
  let i = 0;
6
7
  loop: while (i < tokens.length) {
7
8
  const remainingTokens = tokens.slice(i);
8
- for (const { nodeType, parse } of patterns) {
9
- const result = parse(remainingTokens);
10
- if (result.consumed > 0) {
11
- const node = {
12
- type: nodeType,
13
- ...result.result
14
- };
15
- yield node;
9
+ for (const pattern of patterns) {
10
+ const result = pattern(remainingTokens);
11
+ if ((0, prelude_1.isntFalsy)(result)) {
12
+ yield result.node;
16
13
  i += result.consumed;
17
14
  continue loop;
18
15
  }
package/lib/parse.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":";;;AAEA,QAAe,CAAC,CAAC,KAAK,CACpB,QAAuC,EACvC,MAAwB;IAExB,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,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,QAAQ,EAAE;YAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,eAAe,CAAC,CAAA;YACrC,IAAI,MAAM,CAAC,QAAQ,GAAG,CAAC,EAAE;gBACvB,MAAM,IAAI,GAAa;oBACrB,IAAI,EAAE,QAAQ;oBACd,GAAG,MAAM,CAAC,MAAM;iBACjB,CAAA;gBACD,MAAM,IAAI,CAAA;gBAEV,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAA;gBACpB,SAAS,IAAI,CAAA;aACd;SACF;QAED,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;KAC7D;AACH,CAAC;AAxBD,sBAwBC"}
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,mBAAmB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;KAC7D;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<T extends string>(patterns: Array<ITokenPattern<IToken<T>>>, text: string): IterableIterator<IToken<T>>;
2
+ export declare function tokenize<Token extends IToken<string>, TokenPattern extends ITokenPattern<Token>>(text: string, patterns: Array<TokenPattern>): IterableIterator<Token>;
package/lib/tokenize.js CHANGED
@@ -1,23 +1,20 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.tokenize = void 0;
4
- function* tokenize(patterns, text) {
4
+ const prelude_1 = require("@blackglory/prelude");
5
+ function* tokenize(text, patterns) {
5
6
  let i = 0;
6
7
  loop: while (i < text.length) {
7
8
  const remainingText = text.slice(i);
8
- for (const { tokenType, match } of patterns) {
9
- const result = match(remainingText);
10
- if (result.consumed > 0) {
11
- const token = {
12
- type: tokenType,
13
- value: remainingText.slice(0, result.consumed)
14
- };
15
- yield token;
9
+ for (const pattern of patterns) {
10
+ const result = pattern(remainingText);
11
+ if ((0, prelude_1.isntFalsy)(result)) {
12
+ yield result.token;
16
13
  i += result.consumed;
17
14
  continue loop;
18
15
  }
19
16
  }
20
- throw new Error(`Unknown text: ${remainingText}`);
17
+ throw new Error(`Unknown text: ${JSON.stringify(remainingText)}`);
21
18
  }
22
19
  }
23
20
  exports.tokenize = tokenize;
@@ -1 +1 @@
1
- {"version":3,"file":"tokenize.js","sourceRoot":"","sources":["../src/tokenize.ts"],"names":[],"mappings":";;;AAEA,QAAe,CAAC,CAAC,QAAQ,CACvB,QAAyC,EACzC,IAAY;IAEZ,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,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,QAAQ,EAAE;YAC3C,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,CAAA;YACnC,IAAI,MAAM,CAAC,QAAQ,GAAG,CAAC,EAAE;gBACvB,MAAM,KAAK,GAAc;oBACvB,IAAI,EAAE,SAAS;oBACf,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;iBAC/C,CAAA;gBACD,MAAM,KAAK,CAAA;gBAEX,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAA;gBACpB,SAAS,IAAI,CAAA;aACd;SACF;QAED,MAAM,IAAI,KAAK,CAAC,iBAAiB,aAAa,EAAE,CAAC,CAAA;KAClD;AACH,CAAC;AAxBD,4BAwBC"}
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"}
package/lib/types.d.ts CHANGED
@@ -1,20 +1,22 @@
1
- export interface IToken<T extends string> {
2
- type: T;
1
+ import { Falsy } from '@blackglory/prelude';
2
+ export interface IToken<Type extends string> {
3
+ type: Type;
3
4
  value: string;
4
5
  }
5
- export interface INode<T extends string> {
6
- type: T;
6
+ export interface INode<Type extends string> {
7
+ type: Type;
7
8
  }
8
- export interface ITokenPattern<T extends IToken<any>> {
9
- tokenType: T['type'];
10
- match: (text: string) => {
11
- consumed: number;
12
- };
9
+ export interface ITokenPatternMatch<Token extends IToken<string>> {
10
+ consumed: number;
11
+ token: Token;
13
12
  }
14
- export interface INodePattern<T extends INode<any>> {
15
- nodeType: T['type'];
16
- parse: (tokens: Array<IToken<any>>) => {
17
- consumed: number;
18
- result?: Omit<T, 'type'>;
19
- };
13
+ export interface INodePatternMatch<Node extends INode<string>> {
14
+ consumed: number;
15
+ node: Node;
16
+ }
17
+ export interface ITokenPattern<Token extends IToken<string>> {
18
+ (text: string): ITokenPatternMatch<Token> | Falsy;
19
+ }
20
+ export interface INodePattern<Token extends IToken<string>, Node extends INode<string>> {
21
+ (tokens: Array<Token>): INodePatternMatch<Node> | Falsy;
20
22
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "extra-parser",
3
- "version": "0.1.0",
3
+ "version": "0.2.1",
4
4
  "description": "",
5
5
  "keywords": [],
6
6
  "files": [