extra-parser 0.1.0 → 0.2.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
@@ -17,44 +17,52 @@ interface INode<T extends string> {
17
17
  type: T
18
18
  }
19
19
 
20
- interface ITokenPattern<T extends IToken<any>> {
21
- tokenType: T['type']
20
+ interface ITokenPatternMatch<T extends IToken<string>> {
21
+ consumed: number
22
+ token: T
23
+ }
22
24
 
23
- match: (text: string) => {
24
- consumed: number
25
- }
25
+ interface INodePatternMatch<T extends INode<string>> {
26
+ consumed: number
27
+ node: T
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,3 +1,4 @@
1
+ import { Falsy } from '@blackglory/prelude';
1
2
  export interface IToken<T extends string> {
2
3
  type: T;
3
4
  value: string;
@@ -5,16 +6,17 @@ export interface IToken<T extends string> {
5
6
  export interface INode<T extends string> {
6
7
  type: T;
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<T extends IToken<string>> {
10
+ consumed: number;
11
+ token: T;
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<T extends INode<string>> {
14
+ consumed: number;
15
+ node: T;
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.0",
4
4
  "description": "",
5
5
  "keywords": [],
6
6
  "files": [