grammar-composer 0.3.0 → 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/LICENSE.md +1 -1
- package/README.md +3 -2
- package/dist/parser-generator/Grammar.d.ts +4 -4
- package/dist/parser-generator/Grammar.d.ts.map +1 -1
- package/dist/parser-generator/Grammar.js +51 -38
- package/dist/parser-generator/Grammar.js.map +1 -1
- package/dist/parser-generator/TopDownParser.d.ts.map +1 -1
- package/dist/parser-generator/TopDownParser.js +11 -13
- package/dist/parser-generator/TopDownParser.js.map +1 -1
- package/dist/tests/Test.js +15 -5
- package/dist/tests/Test.js.map +1 -1
- package/dist/tests/test-grammars/RegExpGrammar.d.ts +28 -21
- package/dist/tests/test-grammars/RegExpGrammar.d.ts.map +1 -1
- package/dist/tests/test-grammars/RegExpGrammar.js +94 -60
- package/dist/tests/test-grammars/RegExpGrammar.js.map +1 -1
- package/dist/tests/test-grammars/SimpleTestGrammar1.d.ts +5 -0
- package/dist/tests/test-grammars/SimpleTestGrammar1.d.ts.map +1 -0
- package/dist/tests/test-grammars/SimpleTestGrammar1.js +7 -0
- package/dist/tests/test-grammars/SimpleTestGrammar1.js.map +1 -0
- package/dist/utilities/Utilities.d.ts +7 -7
- package/dist/utilities/Utilities.d.ts.map +1 -1
- package/dist/utilities/Utilities.js.map +1 -1
- package/package.json +2 -2
- package/src/parser-generator/Grammar.ts +63 -45
- package/src/parser-generator/TopDownParser.ts +12 -18
- package/src/tests/Test.ts +21 -7
- package/src/tests/test-grammars/RegExpGrammar.ts +189 -97
- package/src/tests/test-grammars/SimpleTestGrammar1.ts +10 -0
- package/src/utilities/Utilities.ts +7 -7
|
@@ -2,58 +2,76 @@ import * as G from '../../exports/Exports.js';
|
|
|
2
2
|
import * as R from 'regexp-composer';
|
|
3
3
|
export class RegExpGrammar {
|
|
4
4
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
5
|
-
// High
|
|
5
|
+
// High-level productions
|
|
6
6
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
7
|
+
root = () => this.sequenceOrDisjunction;
|
|
7
8
|
disjunction = () => [
|
|
8
9
|
this.sequence,
|
|
9
|
-
G.
|
|
10
|
-
|
|
11
|
-
this.
|
|
10
|
+
G.oneOrMore([
|
|
11
|
+
'|',
|
|
12
|
+
this.sequence,
|
|
12
13
|
])
|
|
13
14
|
];
|
|
14
|
-
sequence = () => G.
|
|
15
|
-
|
|
15
|
+
sequence = () => G.cached(G.zeroOrMore(this.sequenceElement));
|
|
16
|
+
sequenceOrDisjunction = [
|
|
17
|
+
G.anyOf(this.disjunction, this.sequence)
|
|
18
|
+
];
|
|
16
19
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
17
|
-
//
|
|
20
|
+
// Quantifier expressions
|
|
18
21
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
G.possibly(
|
|
22
|
-
G.possibly(this.nongreedyQuantifier), // Nongreedy quantifier
|
|
22
|
+
starQuantifier = () => [
|
|
23
|
+
'*',
|
|
24
|
+
G.possibly(this.nongreedyQuantifier)
|
|
23
25
|
];
|
|
24
|
-
|
|
25
|
-
'
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
26
|
+
plusQuantifier = () => [
|
|
27
|
+
'+',
|
|
28
|
+
G.possibly(this.nongreedyQuantifier)
|
|
29
|
+
];
|
|
30
|
+
optionalQuantifier = () => [
|
|
31
|
+
'?',
|
|
32
|
+
G.possibly(this.nongreedyQuantifier)
|
|
33
|
+
];
|
|
34
|
+
exactCountQuantifier = () => [
|
|
35
|
+
G.pattern([
|
|
36
|
+
'{',
|
|
37
|
+
R.captureAs('count', R.oneOrMore(digit)),
|
|
38
|
+
'}',
|
|
39
|
+
]),
|
|
40
|
+
G.possibly(this.nongreedyQuantifier)
|
|
41
|
+
];
|
|
42
|
+
countRangeQuantifier = () => [
|
|
43
|
+
G.pattern([
|
|
44
|
+
'{',
|
|
45
|
+
R.captureAs('start', R.oneOrMore(digit)),
|
|
46
|
+
',',
|
|
47
|
+
R.possibly(R.captureAs('end', R.oneOrMore(digit))),
|
|
48
|
+
'}',
|
|
49
|
+
]),
|
|
50
|
+
G.possibly(this.nongreedyQuantifier)
|
|
51
|
+
];
|
|
52
|
+
nongreedyQuantifier = () => '?';
|
|
53
|
+
quantifier = () => G.anyOf(this.starQuantifier, this.plusQuantifier, this.optionalQuantifier, this.exactCountQuantifier, this.countRangeQuantifier);
|
|
36
54
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
37
55
|
// Group expressions
|
|
38
56
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
39
|
-
group = () => G.anyOf(this.uncapturedGroup, this.namedCaptureGroup, this.unnamedCaptureGroup);
|
|
40
57
|
uncapturedGroup = () => [
|
|
41
|
-
'(
|
|
42
|
-
this.
|
|
58
|
+
'(?:',
|
|
59
|
+
this.sequenceOrDisjunction,
|
|
43
60
|
')',
|
|
44
61
|
];
|
|
45
62
|
namedCaptureGroup = () => [
|
|
46
63
|
'(?<',
|
|
47
|
-
G.pattern(R.captureAs('name', R.oneOrMore(
|
|
64
|
+
G.pattern(R.captureAs('name', R.oneOrMore(identifierChar))),
|
|
48
65
|
'>',
|
|
49
|
-
this.
|
|
66
|
+
this.sequenceOrDisjunction,
|
|
50
67
|
')',
|
|
51
68
|
];
|
|
52
69
|
unnamedCaptureGroup = () => [
|
|
53
70
|
'(',
|
|
54
|
-
this.
|
|
71
|
+
this.sequenceOrDisjunction,
|
|
55
72
|
')',
|
|
56
73
|
];
|
|
74
|
+
group = G.anyOf(this.uncapturedGroup, this.namedCaptureGroup, this.unnamedCaptureGroup);
|
|
57
75
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
58
76
|
// Backreferences
|
|
59
77
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
@@ -63,7 +81,7 @@ export class RegExpGrammar {
|
|
|
63
81
|
]);
|
|
64
82
|
namedBackreference = () => G.pattern([
|
|
65
83
|
'\\k<',
|
|
66
|
-
R.captureAs('name',
|
|
84
|
+
R.captureAs('name', R.oneOrMore(identifierChar)),
|
|
67
85
|
'>',
|
|
68
86
|
]);
|
|
69
87
|
backReference = G.anyOf(this.unnamedBackreference, this.namedBackreference);
|
|
@@ -72,49 +90,52 @@ export class RegExpGrammar {
|
|
|
72
90
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
73
91
|
positiveLookahead = () => [
|
|
74
92
|
'(?=',
|
|
75
|
-
this.
|
|
93
|
+
this.sequenceOrDisjunction,
|
|
76
94
|
')',
|
|
77
95
|
];
|
|
78
96
|
negativeLookahead = () => [
|
|
79
97
|
'(?!',
|
|
80
|
-
this.
|
|
98
|
+
this.sequenceOrDisjunction,
|
|
81
99
|
')',
|
|
82
100
|
];
|
|
83
101
|
positiveLookbehind = () => [
|
|
84
102
|
'(?<=',
|
|
85
|
-
this.
|
|
103
|
+
this.sequenceOrDisjunction,
|
|
86
104
|
')',
|
|
87
105
|
];
|
|
88
106
|
negativeLookbehind = () => [
|
|
89
107
|
'(?<!',
|
|
90
|
-
this.
|
|
108
|
+
this.sequenceOrDisjunction,
|
|
91
109
|
')',
|
|
92
110
|
];
|
|
93
111
|
lookaround = G.anyOf(this.positiveLookahead, this.negativeLookahead, this.positiveLookbehind, this.negativeLookbehind);
|
|
94
112
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
95
113
|
// Single character expressions
|
|
96
114
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
97
|
-
singleCharExpression = () => G.anyOf(this.anyCharWildcard, this.charClass, this.unicodeProperty, this.notUnicodeProperty, this.charcodeOrEscapedChar, this.unreservedCharLiteral);
|
|
98
|
-
unreservedCharLiteral = () => G.pattern(R.notAnyOfChars('[', '.', '*', '+', '?', '^', '$', '{', '}', '(', ')', '|', ']', '\\'));
|
|
115
|
+
singleCharExpression = () => G.anyOf(this.anyCharWildcard, this.charClass, this.unicodeProperty, this.notUnicodeProperty, this.escapedCharacterClass, this.charcodeOrEscapedChar, this.unreservedCharLiteral);
|
|
116
|
+
unreservedCharLiteral = () => G.pattern(R.captureAs('char', R.notAnyOfChars('[', '.', '*', '+', '?', '^', '$', '{', '}', '(', ')', '|', ']', '\\')));
|
|
99
117
|
escapedCharLiteral = () => G.pattern([
|
|
100
118
|
'\\',
|
|
101
|
-
R.anyChar
|
|
119
|
+
R.captureAs('char', R.anyChar)
|
|
102
120
|
]);
|
|
103
121
|
hexCharcode = () => G.pattern([
|
|
104
122
|
'\\x',
|
|
105
|
-
hexDigit
|
|
106
|
-
hexDigit
|
|
123
|
+
R.captureAs('value', R.repeated(2, hexDigit))
|
|
107
124
|
]);
|
|
108
125
|
controlCharcode = () => G.pattern([
|
|
109
126
|
'\\c',
|
|
110
|
-
R.charRange('A', 'Z'),
|
|
127
|
+
R.captureAs('value', R.anyOf(R.charRange('A', 'Z'), R.charRange('a', 'z')))
|
|
111
128
|
]);
|
|
112
|
-
|
|
129
|
+
nullCharcode = () => G.pattern('\\0');
|
|
130
|
+
codepoint = () => G.anyOf(G.pattern([
|
|
113
131
|
'\\u',
|
|
114
132
|
'{',
|
|
115
|
-
R.captureAs('value', R.
|
|
133
|
+
R.captureAs('value', R.repeated([1, 6], hexDigit)),
|
|
116
134
|
'}',
|
|
117
|
-
])
|
|
135
|
+
]), G.pattern([
|
|
136
|
+
'\\u',
|
|
137
|
+
R.captureAs('value', R.repeated(4, hexDigit))
|
|
138
|
+
]));
|
|
118
139
|
codepointRange = () => G.pattern([
|
|
119
140
|
'\\u',
|
|
120
141
|
'{',
|
|
@@ -133,52 +154,65 @@ export class RegExpGrammar {
|
|
|
133
154
|
]);
|
|
134
155
|
unicodePropertyBodyPattern = [
|
|
135
156
|
'{',
|
|
136
|
-
R.captureAs('property', R.oneOrMore(
|
|
157
|
+
R.captureAs('property', R.oneOrMore(R.anyOf(letter, digit, '_', '-'))),
|
|
137
158
|
R.possibly([
|
|
138
159
|
'=',
|
|
139
|
-
R.captureAs('value', R.oneOrMore(
|
|
160
|
+
R.captureAs('value', R.oneOrMore(R.anyOf(letter, digit, '_', '-'))),
|
|
140
161
|
]),
|
|
141
162
|
'}',
|
|
142
163
|
];
|
|
143
|
-
charClassChar = () => G.pattern(R.notAnyOfChars(']'));
|
|
144
164
|
charClass = () => [
|
|
145
165
|
'[',
|
|
146
166
|
G.possibly(this.charClassNegator),
|
|
147
|
-
G.oneOrMore(G.anyOf(this.charRange, this.codepointRange, this.
|
|
167
|
+
G.oneOrMore(G.anyOf(this.charRange, this.codepointRange, this.unicodeProperty, this.notUnicodeProperty, this.escapedCharacterClass, this.charcodeOrEscapedChar, this.charClassLiteral)),
|
|
148
168
|
']',
|
|
149
169
|
];
|
|
150
|
-
charcodeOrEscapedChar = G.anyOf(this.codepoint, this.hexCharcode, this.controlCharcode, this.escapedCharLiteral);
|
|
151
|
-
|
|
170
|
+
charcodeOrEscapedChar = G.anyOf(this.codepoint, this.hexCharcode, this.controlCharcode, this.nullCharcode, this.escapedCharLiteral);
|
|
171
|
+
charClassLiteral = () => G.pattern(R.captureAs('char', R.notAnyOfChars(']')));
|
|
172
|
+
charRangeElement = G.anyOf(this.charcodeOrEscapedChar, this.charClassLiteral);
|
|
173
|
+
charRangeStart = () => this.charRangeElement;
|
|
174
|
+
charRangeEnd = () => this.charRangeElement;
|
|
152
175
|
charRange = () => [
|
|
153
|
-
this.
|
|
176
|
+
this.charRangeStart,
|
|
154
177
|
'-',
|
|
155
|
-
this.
|
|
178
|
+
this.charRangeEnd,
|
|
156
179
|
];
|
|
157
180
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
158
181
|
// Special symbols
|
|
159
182
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
160
|
-
starQuantifier = () => '*';
|
|
161
|
-
plusQuantifier = () => '+';
|
|
162
|
-
nongreedyQuantifier = () => '?';
|
|
163
183
|
charClassNegator = () => '^';
|
|
164
184
|
inputStartAnchor = () => '^';
|
|
165
185
|
inputEndAnchor = () => '$';
|
|
166
186
|
anyCharWildcard = () => '.';
|
|
167
|
-
disjunctionSeparator = () => '|';
|
|
168
187
|
anchor = G.anyOf(this.inputStartAnchor, this.inputEndAnchor);
|
|
169
|
-
escapedCharacterClass = () => G.pattern(R.anyOf(R.captureAs('whitespace',
|
|
188
|
+
escapedCharacterClass = () => G.pattern(R.anyOf(R.captureAs('whitespace', escapedChars.whitespace), R.captureAs('nonWhitespace', escapedChars.nonWhitespace), R.captureAs('digit', escapedChars.digit), R.captureAs('nonDigit', escapedChars.nonDigit), R.captureAs('word', escapedChars.word), R.captureAs('nonWord', escapedChars.nonWord), R.captureAs('wordBoundary', escapedChars.wordBoundary), R.captureAs('nonWordBoundary', escapedChars.nonWordBoundary), R.captureAs('formFeed', escapedChars.formFeed), R.captureAs('carriageReturn', escapedChars.carriageReturn), R.captureAs('lineFeed', escapedChars.lineFeed), R.captureAs('tab', escapedChars.tab), R.captureAs('verticalTab', escapedChars.verticalTab), R.captureAs('backwardSlash', escapedChars.backwardSlash)));
|
|
189
|
+
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
190
|
+
// Sequence elements (positioned here due to TypeScript class member ordering requirements)
|
|
191
|
+
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
192
|
+
quantifiableExpression = G.cached(G.anyOf(this.group, this.backReference, this.singleCharExpression));
|
|
193
|
+
quantifiedExpression = () => [
|
|
194
|
+
this.quantifiableExpression,
|
|
195
|
+
this.quantifier,
|
|
196
|
+
];
|
|
197
|
+
sequenceElement = G.anyOf(this.anchor, this.lookaround, this.quantifiedExpression, this.quantifiableExpression);
|
|
170
198
|
}
|
|
199
|
+
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
200
|
+
// Shared regular expressions
|
|
201
|
+
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
171
202
|
const digit = R.charRange('0', '9');
|
|
172
203
|
const letter = R.anyOf(R.charRange('a', 'z'), R.charRange('A', 'Z'));
|
|
173
|
-
const letterOrDigit = R.anyOf(letter, digit);
|
|
174
204
|
const hexDigit = R.anyOf(digit, R.charRange('a', 'f'), R.charRange('A', 'F'));
|
|
175
|
-
const
|
|
205
|
+
const identifierChar = R.anyOf(letter, digit, '_', '$');
|
|
206
|
+
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
207
|
+
// Escaped characters lookup
|
|
208
|
+
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
209
|
+
const escapedChars = {
|
|
176
210
|
whitespace: '\\s',
|
|
177
211
|
nonWhitespace: '\\S',
|
|
178
212
|
digit: '\\d',
|
|
179
213
|
nonDigit: '\\D',
|
|
180
|
-
word: '\\
|
|
181
|
-
nonWord: '\\
|
|
214
|
+
word: '\\w',
|
|
215
|
+
nonWord: '\\W',
|
|
182
216
|
wordBoundary: '\\b',
|
|
183
217
|
nonWordBoundary: '\\B',
|
|
184
218
|
formFeed: '\\f',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RegExpGrammar.js","sourceRoot":"","sources":["../../../src/tests/test-grammars/RegExpGrammar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,0BAA0B,CAAA;AAC7C,OAAO,KAAK,CAAC,MAAM,iBAAiB,CAAA;AAEpC,MAAM,OAAO,aAAa;IACzB,8FAA8F;IAC9F,yBAAyB;IACzB,8FAA8F;IAC9F,WAAW,GAAG,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,QAAQ;QAEb,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"RegExpGrammar.js","sourceRoot":"","sources":["../../../src/tests/test-grammars/RegExpGrammar.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SimpleTestGrammar1.d.ts","sourceRoot":"","sources":["../../../src/tests/test-grammars/SimpleTestGrammar1.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,0BAA0B,CAAA;AAE7C,qBAAa,kBAAkB;IAC9B,IAAI,mBAKH;CACD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SimpleTestGrammar1.js","sourceRoot":"","sources":["../../../src/tests/test-grammars/SimpleTestGrammar1.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,0BAA0B,CAAA;AAE7C,MAAM,OAAO,kBAAkB;IAC9B,IAAI,GAAG,GAAG,EAAE,CAAC;QACZ,CAAC,CAAC,KAAK,CACN,KAAK,EACL,SAAS,CACT;KACD,CAAA;CACD"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
export declare function roundToDigits(val: number, digits?: number): number;
|
|
2
|
-
export declare function isNumber(value:
|
|
3
|
-
export declare function isString(value:
|
|
4
|
-
export declare function isBigInt(value:
|
|
5
|
-
export declare function isObject(value:
|
|
6
|
-
export declare function isArray(value:
|
|
7
|
-
export declare function isBoolean(value:
|
|
8
|
-
export declare function isFunction(value:
|
|
2
|
+
export declare function isNumber(value: unknown): value is number;
|
|
3
|
+
export declare function isString(value: unknown): value is string;
|
|
4
|
+
export declare function isBigInt(value: unknown): value is bigint;
|
|
5
|
+
export declare function isObject(value: unknown): value is object;
|
|
6
|
+
export declare function isArray(value: unknown): value is unknown[];
|
|
7
|
+
export declare function isBoolean(value: unknown): value is boolean;
|
|
8
|
+
export declare function isFunction(value: unknown): value is Function;
|
|
9
9
|
//# sourceMappingURL=Utilities.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Utilities.d.ts","sourceRoot":"","sources":["../../src/utilities/Utilities.ts"],"names":[],"mappings":"AAAA,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,SAAI,UAIpD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"Utilities.d.ts","sourceRoot":"","sources":["../../src/utilities/Utilities.ts"],"names":[],"mappings":"AAAA,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,SAAI,UAIpD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAExD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAExD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAExD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAExD;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,OAAO,EAAE,CAE1D;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,OAAO,CAE1D;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAE5D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Utilities.js","sourceRoot":"","sources":["../../src/utilities/Utilities.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,MAAM,GAAG,CAAC;IACpD,MAAM,UAAU,GAAG,EAAE,IAAI,MAAM,CAAA;IAE/B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,UAAU,CAAC,GAAG,UAAU,CAAA;AACjD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"Utilities.js","sourceRoot":"","sources":["../../src/utilities/Utilities.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,MAAM,GAAG,CAAC;IACpD,MAAM,UAAU,GAAG,EAAE,IAAI,MAAM,CAAA;IAE/B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,UAAU,CAAC,GAAG,UAAU,CAAA;AACjD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAA;AACjC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAA;AACjC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAA;AACjC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAC1D,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAc;IACrC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAC5B,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAc;IACvC,OAAO,OAAO,KAAK,KAAK,SAAS,CAAA;AAClC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAc;IACxC,OAAO,OAAO,KAAK,KAAK,UAAU,CAAA;AACnC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "grammar-composer",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.4.0",
|
|
4
|
+
"description": "Creates and generates parsers from composable grammar definitions. Includes advanced features like lexer-free parsing, selective packrat memoization and static analysis.",
|
|
5
5
|
"author": "Rotem Dan",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"keywords": [
|
|
@@ -34,15 +34,20 @@ export function buildGrammar<T extends { [key: string]: any }>(obj: T | (new ()
|
|
|
34
34
|
optionalNonterminalLookup.set(objectProperty, newOptionalNonterminal)
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
let
|
|
38
|
-
const
|
|
37
|
+
let cacheIdCounter = 0
|
|
38
|
+
const getNewCacheId = () => {
|
|
39
|
+
const newCacheId = cacheIdCounter
|
|
40
|
+
cacheIdCounter += 1
|
|
41
|
+
|
|
42
|
+
return newCacheId
|
|
43
|
+
}
|
|
39
44
|
|
|
40
45
|
for (const [func, nonterminal] of nonterminalLookup) {
|
|
41
46
|
const preparedContent = prepareGrammarElement(
|
|
42
47
|
nonterminal.content,
|
|
43
48
|
nonterminalLookup,
|
|
44
49
|
optionalNonterminalLookup,
|
|
45
|
-
|
|
50
|
+
getNewCacheId)
|
|
46
51
|
|
|
47
52
|
nonterminal.content = preparedContent
|
|
48
53
|
|
|
@@ -68,7 +73,7 @@ export function buildGrammar<T extends { [key: string]: any }>(obj: T | (new ()
|
|
|
68
73
|
return new Grammar<T>(
|
|
69
74
|
nonterminals,
|
|
70
75
|
startProductionName,
|
|
71
|
-
|
|
76
|
+
cacheIdCounter
|
|
72
77
|
)
|
|
73
78
|
}
|
|
74
79
|
|
|
@@ -76,41 +81,44 @@ function prepareGrammarElement(
|
|
|
76
81
|
rootElement: GrammarElement,
|
|
77
82
|
nonterminalLookup: Map<Function, Nonterminal>,
|
|
78
83
|
optionalNonterminalLookup: Map<Function, Nonterminal>,
|
|
79
|
-
|
|
84
|
+
getNewCacheId: () => number
|
|
80
85
|
): GrammarElement {
|
|
81
86
|
function prepare(element: GrammarElement): GrammarElement {
|
|
87
|
+
const setCacheIdIfNeeded = (element: GrammarElement) => {
|
|
88
|
+
if (element.cached === true) {
|
|
89
|
+
element.cacheId = getNewCacheId()
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return element
|
|
93
|
+
}
|
|
94
|
+
|
|
82
95
|
switch (element.type) {
|
|
83
96
|
case 'StringTerminal':
|
|
84
97
|
case 'Nonterminal': {
|
|
85
|
-
|
|
86
|
-
element
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
return element
|
|
98
|
+
return setCacheIdIfNeeded({
|
|
99
|
+
...element
|
|
100
|
+
})
|
|
90
101
|
}
|
|
91
102
|
|
|
92
103
|
case 'PatternTerminal': {
|
|
93
|
-
return {
|
|
104
|
+
return setCacheIdIfNeeded({
|
|
94
105
|
...element,
|
|
95
|
-
|
|
96
|
-
}
|
|
106
|
+
})
|
|
97
107
|
}
|
|
98
108
|
|
|
99
109
|
case 'Repetition': {
|
|
100
|
-
return {
|
|
110
|
+
return setCacheIdIfNeeded({
|
|
101
111
|
...element,
|
|
102
112
|
content: prepare(element.content),
|
|
103
|
-
|
|
104
|
-
}
|
|
113
|
+
})
|
|
105
114
|
}
|
|
106
115
|
|
|
107
116
|
case 'Sequence':
|
|
108
117
|
case 'Choice': {
|
|
109
|
-
return {
|
|
118
|
+
return setCacheIdIfNeeded({
|
|
110
119
|
...element,
|
|
111
120
|
members: element.members.map(element => prepare(element)),
|
|
112
|
-
|
|
113
|
-
}
|
|
121
|
+
})
|
|
114
122
|
}
|
|
115
123
|
|
|
116
124
|
case 'NonterminalReference': {
|
|
@@ -128,23 +136,16 @@ function prepareGrammarElement(
|
|
|
128
136
|
throw new Error(`Couldn't resolve function reference in grammar element: ${JSON.stringify(element)}`)
|
|
129
137
|
}
|
|
130
138
|
|
|
131
|
-
if (element.cached
|
|
132
|
-
|
|
139
|
+
if (element.cached === true) {
|
|
140
|
+
return {
|
|
141
|
+
...nonterminal,
|
|
133
142
|
|
|
134
|
-
|
|
135
|
-
|
|
143
|
+
cached: true,
|
|
144
|
+
cacheId: getNewCacheId(),
|
|
136
145
|
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
return clonedNonterminal
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
if (nonterminal.uniqueId === undefined) {
|
|
144
|
-
nonterminal.uniqueId = getUniqueId()
|
|
146
|
+
} else {
|
|
147
|
+
return nonterminal
|
|
145
148
|
}
|
|
146
|
-
|
|
147
|
-
return nonterminal
|
|
148
149
|
}
|
|
149
150
|
}
|
|
150
151
|
}
|
|
@@ -407,7 +408,8 @@ export function zeroOrMore(content: Production): Repetition {
|
|
|
407
408
|
return {
|
|
408
409
|
type: 'Repetition',
|
|
409
410
|
content: productionToGrammarElement(content),
|
|
410
|
-
optional: true
|
|
411
|
+
optional: true,
|
|
412
|
+
cached: false,
|
|
411
413
|
}
|
|
412
414
|
}
|
|
413
415
|
|
|
@@ -415,7 +417,8 @@ export function oneOrMore(content: Production): Repetition {
|
|
|
415
417
|
return {
|
|
416
418
|
type: 'Repetition',
|
|
417
419
|
content: productionToGrammarElement(content),
|
|
418
|
-
optional: false
|
|
420
|
+
optional: false,
|
|
421
|
+
cached: false,
|
|
419
422
|
}
|
|
420
423
|
}
|
|
421
424
|
|
|
@@ -430,7 +433,8 @@ export function anyOf(...members: Production[]): Choice {
|
|
|
430
433
|
type: 'Choice',
|
|
431
434
|
members: normalizedMembers,
|
|
432
435
|
optional: false,
|
|
433
|
-
exhaustive: false
|
|
436
|
+
exhaustive: false,
|
|
437
|
+
cached: false,
|
|
434
438
|
}
|
|
435
439
|
}
|
|
436
440
|
|
|
@@ -445,7 +449,9 @@ export function bestOf(...members: Production[]): Choice {
|
|
|
445
449
|
type: 'Choice',
|
|
446
450
|
members: normalizedMembers,
|
|
447
451
|
optional: false,
|
|
448
|
-
exhaustive: true
|
|
452
|
+
exhaustive: true,
|
|
453
|
+
|
|
454
|
+
cached: false,
|
|
449
455
|
}
|
|
450
456
|
}
|
|
451
457
|
|
|
@@ -468,6 +474,8 @@ export function pattern(pattern: Pattern): PatternTerminal {
|
|
|
468
474
|
pattern,
|
|
469
475
|
regExp,
|
|
470
476
|
optional,
|
|
477
|
+
|
|
478
|
+
cached: false,
|
|
471
479
|
}
|
|
472
480
|
}
|
|
473
481
|
|
|
@@ -490,7 +498,9 @@ function stringTerminal(content: string): StringTerminal {
|
|
|
490
498
|
return {
|
|
491
499
|
type: 'StringTerminal',
|
|
492
500
|
content,
|
|
493
|
-
optional: false
|
|
501
|
+
optional: false,
|
|
502
|
+
|
|
503
|
+
cached: false,
|
|
494
504
|
}
|
|
495
505
|
}
|
|
496
506
|
|
|
@@ -504,6 +514,8 @@ function nonterminal(name: string, content: GrammarElement): Nonterminal {
|
|
|
504
514
|
name,
|
|
505
515
|
content,
|
|
506
516
|
optional: false,
|
|
517
|
+
|
|
518
|
+
cached: false,
|
|
507
519
|
}
|
|
508
520
|
}
|
|
509
521
|
|
|
@@ -511,7 +523,9 @@ function sequence(members: GrammarElement[]): Sequence {
|
|
|
511
523
|
return {
|
|
512
524
|
type: 'Sequence',
|
|
513
525
|
members,
|
|
514
|
-
optional: false
|
|
526
|
+
optional: false,
|
|
527
|
+
|
|
528
|
+
cached: false,
|
|
515
529
|
}
|
|
516
530
|
}
|
|
517
531
|
|
|
@@ -519,7 +533,9 @@ function unresolvedReference(reference: Function): NonterminalReference {
|
|
|
519
533
|
return {
|
|
520
534
|
type: 'NonterminalReference',
|
|
521
535
|
reference,
|
|
522
|
-
optional: false
|
|
536
|
+
optional: false,
|
|
537
|
+
|
|
538
|
+
cached: false,
|
|
523
539
|
}
|
|
524
540
|
}
|
|
525
541
|
|
|
@@ -543,12 +559,13 @@ function productionToGrammarElement(production: Production): GrammarElement {
|
|
|
543
559
|
export class Grammar<T> {
|
|
544
560
|
readonly productions: Record<keyof T, any>
|
|
545
561
|
readonly startProductionName: keyof T
|
|
546
|
-
readonly maxElementId: number
|
|
547
562
|
|
|
548
|
-
|
|
563
|
+
readonly maxCacheId: number
|
|
564
|
+
|
|
565
|
+
constructor(productions: Record<keyof T, any>, startProductionName: keyof T, maxCacheId: number) {
|
|
549
566
|
this.startProductionName = startProductionName
|
|
550
567
|
this.productions = productions
|
|
551
|
-
this.
|
|
568
|
+
this.maxCacheId = maxCacheId
|
|
552
569
|
}
|
|
553
570
|
|
|
554
571
|
parse(text: string) {
|
|
@@ -574,8 +591,9 @@ export type GrammarElement =
|
|
|
574
591
|
interface GrammarElementBase {
|
|
575
592
|
type: string
|
|
576
593
|
optional: boolean
|
|
577
|
-
|
|
578
|
-
cached
|
|
594
|
+
|
|
595
|
+
cached: boolean
|
|
596
|
+
cacheId?: number
|
|
579
597
|
}
|
|
580
598
|
|
|
581
599
|
export type Terminal = StringTerminal | PatternTerminal
|