grammar-composer 0.2.4 → 0.3.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/LICENSE.md +1 -1
- package/README.md +4 -3
- package/dist/exports/Exports.d.ts +2 -0
- package/dist/exports/Exports.d.ts.map +1 -0
- package/dist/exports/Exports.js +2 -0
- package/dist/exports/Exports.js.map +1 -0
- package/dist/{GrammarComposer.d.ts → parser-generator/Grammar.d.ts} +2 -1
- package/dist/parser-generator/Grammar.d.ts.map +1 -0
- package/dist/{GrammarComposer.js → parser-generator/Grammar.js} +84 -27
- package/dist/parser-generator/Grammar.js.map +1 -0
- package/dist/{TopDownParser.d.ts → parser-generator/TopDownParser.d.ts} +3 -2
- package/dist/parser-generator/TopDownParser.d.ts.map +1 -0
- package/dist/{TopDownParser.js → parser-generator/TopDownParser.js} +13 -8
- package/dist/parser-generator/TopDownParser.js.map +1 -0
- package/dist/tests/Test.d.ts +2 -0
- package/dist/tests/Test.d.ts.map +1 -0
- package/dist/{Test.js → tests/Test.js} +6 -6
- package/dist/tests/Test.js.map +1 -0
- package/dist/{test-data → tests/test-data}/TestData.d.ts +1 -0
- package/dist/tests/test-data/TestData.d.ts.map +1 -0
- package/dist/tests/test-data/TestData.js.map +1 -0
- package/dist/{test-grammars → tests/test-grammars}/JsonGrammar.d.ts +2 -1
- package/dist/tests/test-grammars/JsonGrammar.d.ts.map +1 -0
- package/dist/{test-grammars → tests/test-grammars}/JsonGrammar.js +1 -1
- package/dist/tests/test-grammars/JsonGrammar.js.map +1 -0
- package/dist/{test-grammars → tests/test-grammars}/RegExpGrammar.d.ts +4 -2
- package/dist/tests/test-grammars/RegExpGrammar.d.ts.map +1 -0
- package/dist/{test-grammars → tests/test-grammars}/RegExpGrammar.js +26 -19
- package/dist/tests/test-grammars/RegExpGrammar.js.map +1 -0
- package/dist/{test-grammars → tests/test-grammars}/XmlGrammar.d.ts +2 -1
- package/dist/tests/test-grammars/XmlGrammar.d.ts.map +1 -0
- package/dist/{test-grammars → tests/test-grammars}/XmlGrammar.js +1 -1
- package/dist/tests/test-grammars/XmlGrammar.js.map +1 -0
- package/dist/utilities/Timer.d.ts +1 -0
- package/dist/utilities/Timer.d.ts.map +1 -0
- package/dist/utilities/Timer.js +1 -1
- package/dist/utilities/{utilities.d.ts → Utilities.d.ts} +1 -0
- package/dist/utilities/Utilities.d.ts.map +1 -0
- package/package.json +5 -5
- package/src/exports/Exports.ts +1 -0
- package/src/{GrammarComposer.ts → parser-generator/Grammar.ts} +94 -30
- package/src/{TopDownParser.ts → parser-generator/TopDownParser.ts} +15 -12
- package/src/{Test.ts → tests/Test.ts} +6 -6
- package/src/{test-grammars → tests/test-grammars}/JsonGrammar.ts +1 -1
- package/src/{test-grammars → tests/test-grammars}/RegExpGrammar.ts +34 -20
- package/src/{test-grammars → tests/test-grammars}/XmlGrammar.ts +1 -1
- package/src/utilities/Timer.ts +1 -1
- package/tsconfig.json +53 -103
- package/dist/Exports.d.ts +0 -1
- package/dist/Exports.js +0 -2
- package/dist/Exports.js.map +0 -1
- package/dist/Grammar.d.ts +0 -62
- package/dist/Grammar.js +0 -376
- package/dist/Grammar.js.map +0 -1
- package/dist/GrammarComposer.js.map +0 -1
- package/dist/Grammars/JsonGrammar.d.ts +0 -16
- package/dist/Grammars/JsonGrammar.js +0 -74
- package/dist/Grammars/JsonGrammar.js.map +0 -1
- package/dist/Grammars/XmlGrammar.d.ts +0 -13
- package/dist/Grammars/XmlGrammar.js +0 -74
- package/dist/Grammars/XmlGrammar.js.map +0 -1
- package/dist/ParserTest.d.ts +0 -1
- package/dist/ParserTest.js +0 -37
- package/dist/ParserTest.js.map +0 -1
- package/dist/Test.d.ts +0 -1
- package/dist/Test.js.map +0 -1
- package/dist/TestData.d.ts +0 -5
- package/dist/TestData.js +0 -466
- package/dist/TestData.js.map +0 -1
- package/dist/TopDownParser.js.map +0 -1
- package/dist/data/TestData.d.ts +0 -5
- package/dist/data/TestData.js +0 -466
- package/dist/data/TestData.js.map +0 -1
- package/dist/test-data/TestData.js.map +0 -1
- package/dist/test-grammars/JsonGrammar.js.map +0 -1
- package/dist/test-grammars/RegExpGrammar.js.map +0 -1
- package/dist/test-grammars/XmlGrammar.js.map +0 -1
- /package/dist/{test-data → tests/test-data}/TestData.js +0 -0
- /package/dist/utilities/{utilities.js → Utilities.js} +0 -0
- /package/dist/utilities/{utilities.js.map → Utilities.js.map} +0 -0
- /package/src/{test-data → tests/test-data}/TestData.ts +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import * as G from '
|
|
1
|
+
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
7
|
disjunction = () => [
|
|
8
8
|
this.sequence,
|
|
@@ -11,7 +11,7 @@ export class RegExpGrammar {
|
|
|
11
11
|
this.disjunction,
|
|
12
12
|
])
|
|
13
13
|
];
|
|
14
|
-
sequence = () => G.
|
|
14
|
+
sequence = () => G.zeroOrMore(this.element);
|
|
15
15
|
element = () => G.anyOf(this.anchor, this.lookaround, this.possiblyQuantifiedExpression);
|
|
16
16
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
17
17
|
// Quantifed expressions
|
|
@@ -38,13 +38,13 @@ export class RegExpGrammar {
|
|
|
38
38
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
39
39
|
group = () => G.anyOf(this.uncapturedGroup, this.namedCaptureGroup, this.unnamedCaptureGroup);
|
|
40
40
|
uncapturedGroup = () => [
|
|
41
|
-
'(
|
|
41
|
+
'(?:',
|
|
42
42
|
this.disjunction,
|
|
43
43
|
')',
|
|
44
44
|
];
|
|
45
45
|
namedCaptureGroup = () => [
|
|
46
46
|
'(?<',
|
|
47
|
-
G.pattern(R.captureAs('name', R.oneOrMore(
|
|
47
|
+
G.pattern(R.captureAs('name', R.oneOrMore(identifierChar))),
|
|
48
48
|
'>',
|
|
49
49
|
this.disjunction,
|
|
50
50
|
')',
|
|
@@ -63,7 +63,7 @@ export class RegExpGrammar {
|
|
|
63
63
|
]);
|
|
64
64
|
namedBackreference = () => G.pattern([
|
|
65
65
|
'\\k<',
|
|
66
|
-
R.captureAs('name',
|
|
66
|
+
R.captureAs('name', R.oneOrMore(identifierChar)),
|
|
67
67
|
'>',
|
|
68
68
|
]);
|
|
69
69
|
backReference = G.anyOf(this.unnamedBackreference, this.namedBackreference);
|
|
@@ -94,7 +94,7 @@ export class RegExpGrammar {
|
|
|
94
94
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
95
95
|
// Single character expressions
|
|
96
96
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
97
|
-
singleCharExpression = () => G.anyOf(this.anyCharWildcard, this.charClass, this.unicodeProperty, this.notUnicodeProperty, this.charcodeOrEscapedChar, this.unreservedCharLiteral);
|
|
97
|
+
singleCharExpression = () => G.anyOf(this.anyCharWildcard, this.charClass, this.unicodeProperty, this.notUnicodeProperty, this.escapedCharacterClass, this.charcodeOrEscapedChar, this.unreservedCharLiteral);
|
|
98
98
|
unreservedCharLiteral = () => G.pattern(R.notAnyOfChars('[', '.', '*', '+', '?', '^', '$', '{', '}', '(', ')', '|', ']', '\\'));
|
|
99
99
|
escapedCharLiteral = () => G.pattern([
|
|
100
100
|
'\\',
|
|
@@ -107,14 +107,21 @@ export class RegExpGrammar {
|
|
|
107
107
|
]);
|
|
108
108
|
controlCharcode = () => G.pattern([
|
|
109
109
|
'\\c',
|
|
110
|
-
R.charRange('A', 'Z'),
|
|
110
|
+
R.anyOf(R.charRange('A', 'Z'), R.charRange('a', 'z')),
|
|
111
111
|
]);
|
|
112
|
-
|
|
112
|
+
nullCharcode = () => G.pattern('\\0');
|
|
113
|
+
codepoint = () => G.anyOf(G.pattern([
|
|
113
114
|
'\\u',
|
|
114
115
|
'{',
|
|
115
|
-
R.captureAs('value', R.
|
|
116
|
+
R.captureAs('value', R.repeated([1, 6], hexDigit)),
|
|
116
117
|
'}',
|
|
117
|
-
])
|
|
118
|
+
]), G.pattern([
|
|
119
|
+
'\\u',
|
|
120
|
+
hexDigit,
|
|
121
|
+
hexDigit,
|
|
122
|
+
hexDigit,
|
|
123
|
+
hexDigit
|
|
124
|
+
]));
|
|
118
125
|
codepointRange = () => G.pattern([
|
|
119
126
|
'\\u',
|
|
120
127
|
'{',
|
|
@@ -133,10 +140,10 @@ export class RegExpGrammar {
|
|
|
133
140
|
]);
|
|
134
141
|
unicodePropertyBodyPattern = [
|
|
135
142
|
'{',
|
|
136
|
-
R.captureAs('property', R.oneOrMore(
|
|
143
|
+
R.captureAs('property', R.oneOrMore(R.anyOf(letter, digit, '_', '-'))),
|
|
137
144
|
R.possibly([
|
|
138
145
|
'=',
|
|
139
|
-
R.captureAs('value', R.oneOrMore(
|
|
146
|
+
R.captureAs('value', R.oneOrMore(R.anyOf(letter, digit, '_', '-'))),
|
|
140
147
|
]),
|
|
141
148
|
'}',
|
|
142
149
|
];
|
|
@@ -144,11 +151,11 @@ export class RegExpGrammar {
|
|
|
144
151
|
charClass = () => [
|
|
145
152
|
'[',
|
|
146
153
|
G.possibly(this.charClassNegator),
|
|
147
|
-
G.oneOrMore(G.anyOf(this.charRange, this.codepointRange, this.
|
|
154
|
+
G.oneOrMore(G.anyOf(this.charRange, this.codepointRange, this.unicodeProperty, this.notUnicodeProperty, this.escapedCharacterClass, this.charcodeOrEscapedChar, this.charClassChar)),
|
|
148
155
|
']',
|
|
149
156
|
];
|
|
150
157
|
charcodeOrEscapedChar = G.anyOf(this.codepoint, this.hexCharcode, this.controlCharcode, this.escapedCharLiteral);
|
|
151
|
-
charRangeElement = G.anyOf(this.charcodeOrEscapedChar, G.pattern(R.
|
|
158
|
+
charRangeElement = G.anyOf(this.charcodeOrEscapedChar, G.pattern(R.notAnyOfChars(']')));
|
|
152
159
|
charRange = () => [
|
|
153
160
|
this.charRangeElement,
|
|
154
161
|
'-',
|
|
@@ -166,19 +173,19 @@ export class RegExpGrammar {
|
|
|
166
173
|
anyCharWildcard = () => '.';
|
|
167
174
|
disjunctionSeparator = () => '|';
|
|
168
175
|
anchor = G.anyOf(this.inputStartAnchor, this.inputEndAnchor);
|
|
169
|
-
escapedCharacterClass = () => G.pattern(R.anyOf(R.captureAs('whitespace', escapedCharString.whitespace), R.captureAs('nonWhitespace', escapedCharString.nonWhitespace), R.captureAs('digit', escapedCharString.digit), R.captureAs('nonDigit', escapedCharString.nonDigit), R.captureAs('wordBoundary', escapedCharString.wordBoundary), R.captureAs('nonWordBoundary', escapedCharString.nonWordBoundary), R.captureAs('formFeed', escapedCharString.formFeed), R.captureAs('carriageReturn', escapedCharString.carriageReturn), R.captureAs('lineFeed', escapedCharString.lineFeed), R.captureAs('tab', escapedCharString.tab), R.captureAs('verticalTab', escapedCharString.verticalTab), R.captureAs('backwardSlash', escapedCharString.backwardSlash)));
|
|
176
|
+
escapedCharacterClass = () => G.pattern(R.anyOf(R.captureAs('whitespace', escapedCharString.whitespace), R.captureAs('nonWhitespace', escapedCharString.nonWhitespace), R.captureAs('digit', escapedCharString.digit), R.captureAs('nonDigit', escapedCharString.nonDigit), R.captureAs('word', escapedCharString.word), R.captureAs('nonWord', escapedCharString.nonWord), R.captureAs('wordBoundary', escapedCharString.wordBoundary), R.captureAs('nonWordBoundary', escapedCharString.nonWordBoundary), R.captureAs('formFeed', escapedCharString.formFeed), R.captureAs('carriageReturn', escapedCharString.carriageReturn), R.captureAs('lineFeed', escapedCharString.lineFeed), R.captureAs('tab', escapedCharString.tab), R.captureAs('verticalTab', escapedCharString.verticalTab), R.captureAs('backwardSlash', escapedCharString.backwardSlash)));
|
|
170
177
|
}
|
|
171
178
|
const digit = R.charRange('0', '9');
|
|
172
179
|
const letter = R.anyOf(R.charRange('a', 'z'), R.charRange('A', 'Z'));
|
|
173
|
-
const letterOrDigit = R.anyOf(letter, digit);
|
|
174
180
|
const hexDigit = R.anyOf(digit, R.charRange('a', 'f'), R.charRange('A', 'F'));
|
|
181
|
+
const identifierChar = R.anyOf(letter, digit, '_', '$');
|
|
175
182
|
const escapedCharString = {
|
|
176
183
|
whitespace: '\\s',
|
|
177
184
|
nonWhitespace: '\\S',
|
|
178
185
|
digit: '\\d',
|
|
179
186
|
nonDigit: '\\D',
|
|
180
|
-
word: '\\
|
|
181
|
-
nonWord: '\\
|
|
187
|
+
word: '\\w',
|
|
188
|
+
nonWord: '\\W',
|
|
182
189
|
wordBoundary: '\\b',
|
|
183
190
|
nonWordBoundary: '\\B',
|
|
184
191
|
formFeed: '\\f',
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RegExpGrammar.js","sourceRoot":"","sources":["../../../src/tests/test-grammars/RegExpGrammar.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as G from
|
|
1
|
+
import * as G from '../../exports/Exports.js';
|
|
2
2
|
export declare class XmlGrammar {
|
|
3
3
|
document: () => G.Repetition[];
|
|
4
4
|
textFragment: G.PatternTerminal;
|
|
@@ -12,3 +12,4 @@ export declare class XmlGrammar {
|
|
|
12
12
|
declarationTagAttribute: G.PatternTerminal;
|
|
13
13
|
comment: G.PatternTerminal;
|
|
14
14
|
}
|
|
15
|
+
//# sourceMappingURL=XmlGrammar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"XmlGrammar.d.ts","sourceRoot":"","sources":["../../../src/tests/test-grammars/XmlGrammar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,0BAA0B,CAAA;AAG7C,qBAAa,UAAU;IACtB,QAAQ,uBAUP;IAED,YAAY,oBAEV;IAEF,UAAU,6CAMT;IAED,eAAe,oBAUb;IAEF,MAAM,oBAMJ;IAEF,SAAS,oBAkBP;IAEF,UAAU,oBAYR;IAEF,cAAc,6CAMb;IAED,qBAAqB,oBAQnB;IAEF,uBAAuB,oBAYrB;IAEF,OAAO,oBAQL;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"XmlGrammar.js","sourceRoot":"","sources":["../../../src/tests/test-grammars/XmlGrammar.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Timer.d.ts","sourceRoot":"","sources":["../../src/utilities/Timer.ts"],"names":[],"mappings":"AAKA,qBAAa,KAAK;IACjB,SAAS,SAAI;IAEb,cAEC;IAED,OAAO,SAEN;IAED,IAAI,WAAW,IAAI,MAAM,CAGxB;IAED,IAAI,kBAAkB,IAAI,MAAM,CAG/B;IAED,wBAAwB,IAAI,MAAM,CAKjC;IAED,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,SAAI,GAAG,MAAM,CAYtD;IAED,MAAM,KAAK,WAAW,IAAI,MAAM,CAM/B;IAED,MAAM,KAAK,oBAAoB,IAAI,MAAM,CAExC;IAED,OAAO,CAAC,MAAM,CAAC,6BAA6B;IAkC5C,OAAO,CAAC,MAAM,CAAC,aAAa,CAAc;CAC1C"}
|
package/dist/utilities/Timer.js
CHANGED
|
@@ -6,3 +6,4 @@ export declare function isObject(value: any): value is object;
|
|
|
6
6
|
export declare function isArray(value: any): value is any[];
|
|
7
7
|
export declare function isBoolean(value: any): value is boolean;
|
|
8
8
|
export declare function isFunction(value: any): value is Function;
|
|
9
|
+
//# sourceMappingURL=Utilities.d.ts.map
|
|
@@ -0,0 +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,GAAG,GAAG,KAAK,IAAI,MAAM,CAEpD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,MAAM,CAEpD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,MAAM,CAEpD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,MAAM,CAEpD;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,GAAG,EAAE,CAElD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,OAAO,CAEtD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,QAAQ,CAExD"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "grammar-composer",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "Defines 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",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"bugs": {
|
|
20
20
|
"url": "https://github.com/rotemdan/grammar-composer/issues"
|
|
21
21
|
},
|
|
22
|
-
"main": "./dist/
|
|
22
|
+
"main": "./dist/exports/Exports.js",
|
|
23
23
|
"type": "module",
|
|
24
24
|
"files": [
|
|
25
25
|
"dist",
|
|
@@ -29,12 +29,12 @@
|
|
|
29
29
|
"README.md"
|
|
30
30
|
],
|
|
31
31
|
"scripts": {
|
|
32
|
-
"test": "node dist/Test.js"
|
|
32
|
+
"test": "node dist/tests/Test.js"
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"regexp-composer": "~0.
|
|
35
|
+
"regexp-composer": "~0.4.0"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
|
-
"@types/node": "~
|
|
38
|
+
"@types/node": "~26.2.0"
|
|
39
39
|
}
|
|
40
40
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../parser-generator/Grammar.js'
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Pattern, buildRegExp, inputStart, isPatternOptional } from 'regexp-composer'
|
|
2
|
-
import { isArray, isBoolean, isFunction, isString } from
|
|
2
|
+
import { isArray, isBoolean, isFunction, isString } from '../utilities/Utilities.js'
|
|
3
3
|
|
|
4
4
|
import { parse } from './TopDownParser.js'
|
|
5
5
|
|
|
@@ -24,7 +24,7 @@ export function buildGrammar<T extends { [key: string]: any }>(obj: T | (new ()
|
|
|
24
24
|
continue
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
const productionContent = objectProperty()
|
|
27
|
+
const productionContent = objectProperty.call(obj)
|
|
28
28
|
const normalizedProduction = productionToGrammarElement(productionContent)
|
|
29
29
|
|
|
30
30
|
const newNonterminal = nonterminal(key, normalizedProduction)
|
|
@@ -69,7 +69,7 @@ export function buildGrammar<T extends { [key: string]: any }>(obj: T | (new ()
|
|
|
69
69
|
nonterminals,
|
|
70
70
|
startProductionName,
|
|
71
71
|
uniqueIdCounter
|
|
72
|
-
|
|
72
|
+
)
|
|
73
73
|
}
|
|
74
74
|
|
|
75
75
|
function prepareGrammarElement(
|
|
@@ -128,6 +128,18 @@ function prepareGrammarElement(
|
|
|
128
128
|
throw new Error(`Couldn't resolve function reference in grammar element: ${JSON.stringify(element)}`)
|
|
129
129
|
}
|
|
130
130
|
|
|
131
|
+
if (element.cached !== undefined || element.uniqueId !== undefined) {
|
|
132
|
+
const clonedNonterminal = { ...nonterminal }
|
|
133
|
+
|
|
134
|
+
if (element.cached !== undefined) {
|
|
135
|
+
clonedNonterminal.cached = element.cached
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
clonedNonterminal.uniqueId = getUniqueId()
|
|
139
|
+
|
|
140
|
+
return clonedNonterminal
|
|
141
|
+
}
|
|
142
|
+
|
|
131
143
|
if (nonterminal.uniqueId === undefined) {
|
|
132
144
|
nonterminal.uniqueId = getUniqueId()
|
|
133
145
|
}
|
|
@@ -147,7 +159,7 @@ function detectAndAnnotateOptionalNodes(rootNode: GrammarElement) {
|
|
|
147
159
|
const visitedNodes = new Set<GrammarElement>()
|
|
148
160
|
|
|
149
161
|
const resolvedNodes = new Map<GrammarElement, boolean>()
|
|
150
|
-
const unresolvedNodes = new Map<GrammarElement, Set<GrammarElement
|
|
162
|
+
const unresolvedNodes = new Map<GrammarElement, { dependencies: Set<GrammarElement>, isChoice: boolean }>()
|
|
151
163
|
|
|
152
164
|
function processDepthFirst(node: GrammarElement): boolean | undefined {
|
|
153
165
|
if (visitedNodes.has(node)) {
|
|
@@ -177,24 +189,23 @@ function detectAndAnnotateOptionalNodes(rootNode: GrammarElement) {
|
|
|
177
189
|
|
|
178
190
|
return result
|
|
179
191
|
} else {
|
|
180
|
-
unresolvedNodes.set(node, new Set([node.content]))
|
|
192
|
+
unresolvedNodes.set(node, { dependencies: new Set([node.content]), isChoice: false })
|
|
181
193
|
|
|
182
194
|
return undefined
|
|
183
195
|
}
|
|
184
196
|
}
|
|
185
197
|
|
|
186
|
-
case 'Sequence':
|
|
187
|
-
case 'Choice': {
|
|
198
|
+
case 'Sequence': {
|
|
188
199
|
const dependencies = new Set<GrammarElement>()
|
|
189
200
|
|
|
190
|
-
let
|
|
201
|
+
let hasNonOptionalResolvedMember = false
|
|
191
202
|
|
|
192
203
|
for (const element of node.members) {
|
|
193
204
|
const result = processDepthFirst(element)
|
|
194
205
|
|
|
195
206
|
if (isBoolean(result)) {
|
|
196
|
-
if (result
|
|
197
|
-
|
|
207
|
+
if (result === false) {
|
|
208
|
+
hasNonOptionalResolvedMember = true
|
|
198
209
|
}
|
|
199
210
|
} else {
|
|
200
211
|
dependencies.add(element)
|
|
@@ -205,12 +216,51 @@ function detectAndAnnotateOptionalNodes(rootNode: GrammarElement) {
|
|
|
205
216
|
resolvedNodes.set(node, true)
|
|
206
217
|
|
|
207
218
|
return true
|
|
208
|
-
} else if (
|
|
209
|
-
resolvedNodes.set(node,
|
|
219
|
+
} else if (hasNonOptionalResolvedMember) {
|
|
220
|
+
resolvedNodes.set(node, false)
|
|
221
|
+
|
|
222
|
+
return false
|
|
223
|
+
} else if (dependencies.size == 0) {
|
|
224
|
+
resolvedNodes.set(node, true)
|
|
210
225
|
|
|
211
|
-
return
|
|
226
|
+
return true
|
|
212
227
|
} else {
|
|
213
|
-
unresolvedNodes.set(node, dependencies)
|
|
228
|
+
unresolvedNodes.set(node, { dependencies, isChoice: false })
|
|
229
|
+
|
|
230
|
+
return undefined
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
case 'Choice': {
|
|
235
|
+
const dependencies = new Set<GrammarElement>()
|
|
236
|
+
let hasOptionalResolvedMember = false
|
|
237
|
+
|
|
238
|
+
for (const element of node.members) {
|
|
239
|
+
const result = processDepthFirst(element)
|
|
240
|
+
|
|
241
|
+
if (isBoolean(result)) {
|
|
242
|
+
if (result === true) {
|
|
243
|
+
hasOptionalResolvedMember = true
|
|
244
|
+
}
|
|
245
|
+
} else {
|
|
246
|
+
dependencies.add(element)
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
if (node.optional == true) {
|
|
251
|
+
resolvedNodes.set(node, true)
|
|
252
|
+
|
|
253
|
+
return true
|
|
254
|
+
} else if (hasOptionalResolvedMember) {
|
|
255
|
+
resolvedNodes.set(node, true)
|
|
256
|
+
|
|
257
|
+
return true
|
|
258
|
+
} else if (dependencies.size == 0) {
|
|
259
|
+
resolvedNodes.set(node, false)
|
|
260
|
+
|
|
261
|
+
return false
|
|
262
|
+
} else {
|
|
263
|
+
unresolvedNodes.set(node, { dependencies, isChoice: true })
|
|
214
264
|
|
|
215
265
|
return undefined
|
|
216
266
|
}
|
|
@@ -231,13 +281,14 @@ function detectAndAnnotateOptionalNodes(rootNode: GrammarElement) {
|
|
|
231
281
|
// If it stays false, it means that no improvement was made during the iteration,
|
|
232
282
|
// and we should exit the loop.
|
|
233
283
|
let atLastOneDependencyResolvedInAnyNode = false
|
|
284
|
+
const nodesToDelete: GrammarElement[] = []
|
|
234
285
|
|
|
235
286
|
// Scan the unresolved nodes to locate any new resolved dependencies
|
|
236
|
-
for (const [node, dependencies] of unresolvedNodes) {
|
|
237
|
-
let
|
|
287
|
+
for (const [node, { dependencies, isChoice }] of unresolvedNodes) {
|
|
288
|
+
let nodeResolved = false
|
|
238
289
|
|
|
239
290
|
// Iterate over all unresolved dependencies for the node
|
|
240
|
-
for (const dependency of dependencies) {
|
|
291
|
+
for (const dependency of Array.from(dependencies)) {
|
|
241
292
|
// Check if the dependency has been resolved
|
|
242
293
|
const value = resolvedNodes.get(dependency)
|
|
243
294
|
|
|
@@ -245,28 +296,41 @@ function detectAndAnnotateOptionalNodes(rootNode: GrammarElement) {
|
|
|
245
296
|
// If it did, record that some dependencies were resolved
|
|
246
297
|
atLastOneDependencyResolvedInAnyNode = true
|
|
247
298
|
|
|
248
|
-
if (
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
299
|
+
if (isChoice) {
|
|
300
|
+
if (value === true) {
|
|
301
|
+
resolvedNodes.set(node, true)
|
|
302
|
+
nodeResolved = true
|
|
303
|
+
break
|
|
304
|
+
}
|
|
253
305
|
} else {
|
|
254
|
-
|
|
255
|
-
|
|
306
|
+
if (value === false) {
|
|
307
|
+
resolvedNodes.set(node, false)
|
|
308
|
+
nodeResolved = true
|
|
309
|
+
break
|
|
310
|
+
}
|
|
256
311
|
}
|
|
312
|
+
|
|
313
|
+
dependencies.delete(dependency)
|
|
257
314
|
}
|
|
258
315
|
}
|
|
259
316
|
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
if (
|
|
263
|
-
|
|
317
|
+
if (nodeResolved) {
|
|
318
|
+
nodesToDelete.push(node)
|
|
319
|
+
} else if (dependencies.size === 0) {
|
|
320
|
+
if (isChoice) {
|
|
321
|
+
resolvedNodes.set(node, false)
|
|
322
|
+
} else {
|
|
323
|
+
resolvedNodes.set(node, true)
|
|
324
|
+
}
|
|
264
325
|
|
|
265
|
-
|
|
266
|
-
unresolvedNodes.delete(node)
|
|
326
|
+
nodesToDelete.push(node)
|
|
267
327
|
}
|
|
268
328
|
}
|
|
269
329
|
|
|
330
|
+
for (const node of nodesToDelete) {
|
|
331
|
+
unresolvedNodes.delete(node)
|
|
332
|
+
}
|
|
333
|
+
|
|
270
334
|
// If not even one dependency was eliminated for any node,
|
|
271
335
|
// it means that only mutually cyclic nodes are left unresolved, so exit the loop.
|
|
272
336
|
if (!atLastOneDependencyResolvedInAnyNode) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Grammar, GrammarElement, Terminal } from
|
|
1
|
+
import { Grammar, GrammarElement, Terminal } from './Grammar.js'
|
|
2
2
|
|
|
3
3
|
export function parse(inputString: string, grammar: Grammar<any>) {
|
|
4
4
|
const inputLength = inputString.length
|
|
@@ -78,12 +78,6 @@ export function parse(inputString: string, grammar: Grammar<any>) {
|
|
|
78
78
|
}
|
|
79
79
|
|
|
80
80
|
case 'PatternTerminal': {
|
|
81
|
-
if (startOffset >= inputLength) {
|
|
82
|
-
updateBestFailedMatchesIfNeeded(grammarElement, startOffset)
|
|
83
|
-
|
|
84
|
-
return null
|
|
85
|
-
}
|
|
86
|
-
|
|
87
81
|
const substringToMatch = inputString.substring(startOffset)
|
|
88
82
|
|
|
89
83
|
const matchResults = grammarElement.regExp.exec(substringToMatch)
|
|
@@ -209,6 +203,10 @@ export function parse(inputString: string, grammar: Grammar<any>) {
|
|
|
209
203
|
break
|
|
210
204
|
}
|
|
211
205
|
|
|
206
|
+
if (result.endOffset === readOffset) {
|
|
207
|
+
break
|
|
208
|
+
}
|
|
209
|
+
|
|
212
210
|
if (result.nodes !== undefined) {
|
|
213
211
|
nodes.push(...result.nodes)
|
|
214
212
|
}
|
|
@@ -221,6 +219,11 @@ export function parse(inputString: string, grammar: Grammar<any>) {
|
|
|
221
219
|
endOffset: readOffset,
|
|
222
220
|
nodes: nodes.length > 0 ? nodes : undefined
|
|
223
221
|
}
|
|
222
|
+
} else if (grammarElement.optional === true) {
|
|
223
|
+
return {
|
|
224
|
+
endOffset: startOffset,
|
|
225
|
+
nodes: undefined
|
|
226
|
+
}
|
|
224
227
|
} else {
|
|
225
228
|
return null
|
|
226
229
|
}
|
|
@@ -252,10 +255,8 @@ export function parse(inputString: string, grammar: Grammar<any>) {
|
|
|
252
255
|
|
|
253
256
|
const result = tryParse(grammar.rootElement, 0)
|
|
254
257
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
if (lastNode && lastNode.endOffset >= inputLength) {
|
|
258
|
-
return result.nodes
|
|
258
|
+
if (result && result.endOffset >= inputLength) {
|
|
259
|
+
return result.nodes ?? []
|
|
259
260
|
} else {
|
|
260
261
|
if (bestFailedMatches.length > 0) {
|
|
261
262
|
const possibleMatches = bestFailedMatches.map(match => {
|
|
@@ -280,7 +281,9 @@ export function parse(inputString: string, grammar: Grammar<any>) {
|
|
|
280
281
|
|
|
281
282
|
throw new Error(`Failed parsing the input text. Expected ${possibleMatchesString} at position ${bestFailedMatchesOffset}.`)
|
|
282
283
|
} else {
|
|
283
|
-
|
|
284
|
+
const lastNode = result?.nodes?.[result.nodes.length - 1]
|
|
285
|
+
|
|
286
|
+
throw new Error(`Failed parsing the input text. Parsed length was ${lastNode?.endOffset ?? result?.endOffset ?? 0}. Input length was ${inputLength}.`)
|
|
284
287
|
}
|
|
285
288
|
}
|
|
286
289
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { Timer } from
|
|
2
|
-
import { jsonSample1, jsonSample2 } from
|
|
3
|
-
import { anyOf, buildGrammar } from
|
|
4
|
-
import { JsonGrammar } from
|
|
5
|
-
import { XmlGrammar } from
|
|
6
|
-
import { RegExpGrammar } from
|
|
1
|
+
import { Timer } from '../utilities/Timer.js'
|
|
2
|
+
import { jsonSample1, jsonSample2 } from './test-data/TestData.js'
|
|
3
|
+
import { anyOf, buildGrammar } from '../exports/Exports.js'
|
|
4
|
+
import { JsonGrammar } from './test-grammars/JsonGrammar.js'
|
|
5
|
+
import { XmlGrammar } from './test-grammars/XmlGrammar.js'
|
|
6
|
+
import { RegExpGrammar } from './test-grammars/RegExpGrammar.js'
|
|
7
7
|
|
|
8
8
|
const log = console.log
|
|
9
9
|
|