occam-verify-cli 0.0.705 → 0.0.707
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/bin/action/verify.js +14 -24
- package/bin/utilities/releaseContext.js +11 -9
- package/lib/context/release.js +5 -30
- package/lib/index.js +8 -4
- package/lib/releaseContext/create.js +124 -0
- package/lib/releaseContext/initialise.js +66 -0
- package/lib/ruleNames.js +1 -13
- package/lib/utilities/array.js +24 -1
- package/lib/utilities/terminalNodes.js +46 -0
- package/lib/verifier/node.js +29 -30
- package/lib/verifier/nodes/term.js +1 -1
- package/lib/verifier/nodes.js +41 -41
- package/lib/verify/givenVariable.js +31 -0
- package/lib/verify/term.js +33 -25
- package/package.json +3 -3
- package/src/context/release.js +8 -8
- package/src/index.js +3 -1
- package/src/releaseContext/create.js +154 -0
- package/src/releaseContext/initialise.js +89 -0
- package/src/ruleNames.js +0 -3
- package/src/utilities/array.js +28 -0
- package/src/utilities/terminalNodes.js +43 -0
- package/src/verifier/node.js +24 -25
- package/src/verifier/nodes/term.js +1 -0
- package/src/verifier/nodes.js +43 -40
- package/src/verify/givenVariable.js +31 -0
- package/src/verify/term.js +40 -29
- package/lib/utilities/releaseContext.js +0 -181
- package/lib/verify/termAsGivenVariable.js +0 -36
- package/src/utilities/releaseContext.js +0 -225
- package/src/verify/termAsGivenVariable.js +0 -39
package/src/context/release.js
CHANGED
|
@@ -339,14 +339,14 @@ export default class ReleaseContext {
|
|
|
339
339
|
|
|
340
340
|
fatal(message, node = null, tokens = null, filePath = null) { this.log.fatal(message, node, tokens, filePath); }
|
|
341
341
|
|
|
342
|
-
initialise(
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
342
|
+
initialise(releaseContexts) {
|
|
343
|
+
releaseContexts = releaseContexts.slice(); ///
|
|
344
|
+
|
|
345
|
+
const combinedCustomGrammar = combinedCustomGrammarFromReleaseContexts(releaseContexts),
|
|
346
|
+
releaseContext = releaseContexts.shift(),
|
|
347
|
+
dependencyReleaseContexts = releaseContexts; ///
|
|
348
|
+
|
|
349
|
+
const florenceLexer = florenceLexerFromCombinedCustomGrammar(combinedCustomGrammar),
|
|
350
350
|
florenceParser = florenceParserFromCombinedCustomGrammar(combinedCustomGrammar);
|
|
351
351
|
|
|
352
352
|
this.lexer = florenceLexer; ///
|
package/src/index.js
CHANGED
|
@@ -6,4 +6,6 @@ export { default as verifyRelease } from "./verify/release";
|
|
|
6
6
|
export { default as ReleaseContext } from "./context/release";
|
|
7
7
|
|
|
8
8
|
export { default as customGrammarUtilities } from "./utilities/customGrammar";
|
|
9
|
-
|
|
9
|
+
|
|
10
|
+
export { default as createReleaseContext } from "./releaseContext/create";
|
|
11
|
+
export { default as initialiseReleaseContext } from "./releaseContext/initialise";
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { last } from "../utilities/array";
|
|
4
|
+
|
|
5
|
+
export default function createReleaseContext(dependency, dependentNames, context, callback) {
|
|
6
|
+
const { log, releaseContextMap } = context,
|
|
7
|
+
dependencyName = dependency.getName(),
|
|
8
|
+
releaseName = dependencyName, ///
|
|
9
|
+
releaseContext = releaseContextMap[releaseName] || null;
|
|
10
|
+
|
|
11
|
+
if (releaseContext !== null) {
|
|
12
|
+
const error = null;
|
|
13
|
+
|
|
14
|
+
callback(error);
|
|
15
|
+
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
log.info(`Creating the '${releaseName}' context.`)
|
|
20
|
+
|
|
21
|
+
const { releaseContextFromDependency } = context;
|
|
22
|
+
|
|
23
|
+
releaseContextFromDependency(dependency, context, (error, releaseContext) => {
|
|
24
|
+
if (error) {
|
|
25
|
+
callback(error);
|
|
26
|
+
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const releaseContextCreated = checkReleaseContextCreated(releaseContext, dependency, context);
|
|
31
|
+
|
|
32
|
+
if (!releaseContextCreated) {
|
|
33
|
+
const error = null;
|
|
34
|
+
|
|
35
|
+
callback(error);
|
|
36
|
+
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const releaseMatchesDependency = checkReleaseMatchesDependency(releaseContext, dependency, dependentNames, context);
|
|
41
|
+
|
|
42
|
+
if (!releaseMatchesDependency) {
|
|
43
|
+
const error = null;
|
|
44
|
+
|
|
45
|
+
callback(error);
|
|
46
|
+
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
releaseContextMap[releaseName] = releaseContext;
|
|
51
|
+
|
|
52
|
+
createDependencyReleaseContexts(dependency, dependentNames, context, callback);
|
|
53
|
+
}, context);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function checkReleaseContextCreated(releaseContext, dependency, context) {
|
|
57
|
+
const releaseContextCreated = (releaseContext !== null);
|
|
58
|
+
|
|
59
|
+
if (!releaseContextCreated) {
|
|
60
|
+
const { log } = context,
|
|
61
|
+
dependencyName = dependency.getName(),
|
|
62
|
+
releaseName = dependencyName; ///
|
|
63
|
+
|
|
64
|
+
log.error(`The '${releaseName}' context could not be created.`);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return releaseContextCreated;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function checkCyclicDependencyExists(dependency, dependentNames, context) {
|
|
71
|
+
const dependencyName = dependency.getName(),
|
|
72
|
+
dependentNamesIncludesDependencyName = dependentNames.includes(dependencyName),
|
|
73
|
+
cyclicDependencyExists = dependentNamesIncludesDependencyName; ///
|
|
74
|
+
|
|
75
|
+
if (cyclicDependencyExists) {
|
|
76
|
+
const { log } = context,
|
|
77
|
+
firstDependentName = first(dependentNames),
|
|
78
|
+
dependencyNames = [ ///
|
|
79
|
+
...dependentNames,
|
|
80
|
+
firstDependentName
|
|
81
|
+
],
|
|
82
|
+
dependencyNamesString = dependencyNames.join(`' -> '`);
|
|
83
|
+
|
|
84
|
+
log.error(`There is a cyclic dependency: '${dependencyNamesString}'.`);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return cyclicDependencyExists;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function checkReleaseMatchesDependency(releaseContext, dependency, dependentNames, context) {
|
|
91
|
+
let releaseMatchesDependency = true;
|
|
92
|
+
|
|
93
|
+
const entries = releaseContext.getEntries(),
|
|
94
|
+
shortenedVersion = dependency.getShortedVersion();
|
|
95
|
+
|
|
96
|
+
if (shortenedVersion !== null) {
|
|
97
|
+
const entriesMatchShortenedVersion = entries.matchShortenedVersion(shortenedVersion);
|
|
98
|
+
|
|
99
|
+
if (!entriesMatchShortenedVersion) {
|
|
100
|
+
const { log } = context,
|
|
101
|
+
version = releaseContext.getVersion(),
|
|
102
|
+
versionString = version.toString(),
|
|
103
|
+
lastDependentName = last(dependentNames),
|
|
104
|
+
dependentName = lastDependentName, ///
|
|
105
|
+
dependencyName = dependency.getName(),
|
|
106
|
+
shortenedVersion = dependency.getShortedVersion(),
|
|
107
|
+
shortenedVersionString = shortenedVersion.toString();
|
|
108
|
+
|
|
109
|
+
log.error(`Version mismatch: '${dependentName}' requires '${dependencyName}' to be version ${shortenedVersionString}.0 or higher but version ${versionString} has been supplied.`);
|
|
110
|
+
|
|
111
|
+
releaseMatchesDependency = false;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return releaseMatchesDependency;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function createDependencyReleaseContexts(dependency, dependentNames, context, callback) {
|
|
119
|
+
const { releaseContextMap } = context,
|
|
120
|
+
dependencyName = dependency.getName(),
|
|
121
|
+
releaseName = dependencyName, ///
|
|
122
|
+
releaseContext = releaseContextMap[releaseName],
|
|
123
|
+
dependencies = releaseContext.getDependencies();
|
|
124
|
+
|
|
125
|
+
dependentNames = [ ...dependentNames, dependencyName ]; ///
|
|
126
|
+
|
|
127
|
+
dependencies.asynchronousForEachDependency((dependency, next, done) => {
|
|
128
|
+
const cyclicDependencyExists = checkCyclicDependencyExists(dependency, dependentNames);
|
|
129
|
+
|
|
130
|
+
if (cyclicDependencyExists) {
|
|
131
|
+
const error = null;
|
|
132
|
+
|
|
133
|
+
callback(error);
|
|
134
|
+
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
createReleaseContext(dependency, dependentNames, context, (error) => {
|
|
139
|
+
if (error) {
|
|
140
|
+
callback(error);
|
|
141
|
+
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
next();
|
|
146
|
+
});
|
|
147
|
+
}, done);
|
|
148
|
+
|
|
149
|
+
function done() {
|
|
150
|
+
const error = null;
|
|
151
|
+
|
|
152
|
+
callback(error);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
export default function initialiseReleaseContext(dependency, dependentName, dependentReleased, context) {
|
|
4
|
+
let releaseContextInitialised = false;
|
|
5
|
+
|
|
6
|
+
const { releaseContextMap } = context,
|
|
7
|
+
dependencyName = dependency.getName(),
|
|
8
|
+
releaseName = dependencyName, ///
|
|
9
|
+
releaseContext = releaseContextMap[releaseName] || null;
|
|
10
|
+
|
|
11
|
+
if (releaseContext === null) {
|
|
12
|
+
const { log } = context;
|
|
13
|
+
|
|
14
|
+
log.error(`Unable to initialise the '${dependencyName}' dependency's context because it has not been created.`);
|
|
15
|
+
} else {
|
|
16
|
+
const initialised = releaseContext.isInitialised();
|
|
17
|
+
|
|
18
|
+
if (initialised) {
|
|
19
|
+
releaseContextInitialised = true;
|
|
20
|
+
} else {
|
|
21
|
+
const released = releaseContext.isReleased();
|
|
22
|
+
|
|
23
|
+
if (!released && dependentReleased) {
|
|
24
|
+
const { log } = context;
|
|
25
|
+
|
|
26
|
+
log.error(`Unable to initialise the '${dependencyName}' dependency's context because its '${dependentName}' dependent is a package.`);
|
|
27
|
+
} else {
|
|
28
|
+
const dependencies = releaseContext.getDependencies();
|
|
29
|
+
|
|
30
|
+
dependentName = dependencyName; ///
|
|
31
|
+
|
|
32
|
+
dependentReleased = released; ///
|
|
33
|
+
|
|
34
|
+
releaseContextInitialised = dependencies.everyDependency((dependency) => { ///
|
|
35
|
+
const releaseContextInitialised = initialiseReleaseContext(dependency, dependentName, dependentReleased, context);
|
|
36
|
+
|
|
37
|
+
if (releaseContextInitialised) {
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
if (releaseContextInitialised) {
|
|
43
|
+
const releaseContexts = retrieveReleaseContexts(releaseContext, releaseContextMap);
|
|
44
|
+
|
|
45
|
+
releaseContext.initialise(releaseContexts);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return releaseContextInitialised;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function retrieveReleaseContexts(releaseContext, releaseContextMap) {
|
|
55
|
+
const releaseContexts = [],
|
|
56
|
+
remainingReleaseContext = releaseContext, ///
|
|
57
|
+
remainingReleaseContexts = [
|
|
58
|
+
remainingReleaseContext
|
|
59
|
+
];
|
|
60
|
+
|
|
61
|
+
let remainingReleaseContextsLength = remainingReleaseContexts.length;
|
|
62
|
+
|
|
63
|
+
while (remainingReleaseContextsLength > 0) {
|
|
64
|
+
const remainingReleaseContext = remainingReleaseContexts.shift(),
|
|
65
|
+
releaseContext = remainingReleaseContext; ///
|
|
66
|
+
|
|
67
|
+
releaseContexts.push(releaseContext);
|
|
68
|
+
|
|
69
|
+
const dependencies = releaseContext.getDependencies();
|
|
70
|
+
|
|
71
|
+
dependencies.forEachDependency((dependency) => {
|
|
72
|
+
const dependencyName = dependency.getName(),
|
|
73
|
+
releaseName = dependencyName, ///
|
|
74
|
+
releaseContext = releaseContextMap[releaseName],
|
|
75
|
+
releaseContextsIncludesReleaseContext = releaseContexts.includes(releaseContext),
|
|
76
|
+
remainingReleaseContextsIncludesReleaseContext = remainingReleaseContexts.includes(releaseContext);
|
|
77
|
+
|
|
78
|
+
if (!releaseContextsIncludesReleaseContext && !remainingReleaseContextsIncludesReleaseContext) {
|
|
79
|
+
const remainingReleaseContext = releaseContext; ///
|
|
80
|
+
|
|
81
|
+
remainingReleaseContexts.push(remainingReleaseContext);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
remainingReleaseContextsLength = remainingReleaseContexts.length;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return releaseContexts;
|
|
89
|
+
}
|
package/src/ruleNames.js
CHANGED
|
@@ -3,11 +3,9 @@
|
|
|
3
3
|
export const TERM_RULE_NAME = "term";
|
|
4
4
|
export const TYPE_RULE_NAME = "type";
|
|
5
5
|
export const LABEL_RULE_NAME = "label";
|
|
6
|
-
export const VARIABLE_RULE_NAME = "variable";
|
|
7
6
|
export const ARGUMENT_RULE_NAME = "argument";
|
|
8
7
|
export const SUBPROOF_RULE_NAME = "subproof";
|
|
9
8
|
export const STATEMENT_RULE_NAME = "statement";
|
|
10
|
-
export const META_TYPE_RULE_NAME = "meta-type";
|
|
11
9
|
export const METAVARIABLE_RULE_NAME = "metavariable";
|
|
12
10
|
export const METASTATEMENT_RULE_NAME = "metastatement";
|
|
13
11
|
export const RULE_SUBPROOF_RULE_NAME = "ruleSubproof";
|
|
@@ -17,5 +15,4 @@ export const VARIABLE_DECLARATION_RULE_NAME = "variableDeclaration";
|
|
|
17
15
|
export const UNQUALIFIED_STATEMENT_RULE_NAME = "unqualifiedStatement";
|
|
18
16
|
export const CONSTRUCTOR_DECLARATION_RULE_NAME = "constructorDeclaration";
|
|
19
17
|
export const QUALIFIED_METASTATEMENT_RULE_NAME = "qualifiedMetastatement";
|
|
20
|
-
export const METAVARIABLE_DECLARATION_RULE_NAME = "metavariableDeclaration";
|
|
21
18
|
export const UNQUALIFIED_METASTATEMENT_RULE_NAME = "unqualifiedMetastatement";
|
package/src/utilities/array.js
CHANGED
|
@@ -73,3 +73,31 @@ export function rightDifference(arrayA, arrayB) {
|
|
|
73
73
|
}
|
|
74
74
|
});
|
|
75
75
|
}
|
|
76
|
+
|
|
77
|
+
export function areArraysEqual(arrayA, arrayB, callback) {
|
|
78
|
+
if (callback === undefined) {
|
|
79
|
+
callback = (elementA, elementB) => {
|
|
80
|
+
if (elementA === elementB) {
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
let arraysEqual = false;
|
|
87
|
+
|
|
88
|
+
const arrayALength = arrayA.length,
|
|
89
|
+
arrayBLength = arrayB.length;
|
|
90
|
+
|
|
91
|
+
if (arrayALength === arrayBLength) {
|
|
92
|
+
arraysEqual = arrayA.every((elementA, index) => {
|
|
93
|
+
const elementB = arrayB[index],
|
|
94
|
+
result = callback(elementA, elementB);
|
|
95
|
+
|
|
96
|
+
if (result) {
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
})
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return arraysEqual;
|
|
103
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { areArraysEqual } from "../utilities/array";
|
|
4
|
+
|
|
5
|
+
export function terminalNodeMapFromNodes(nodes) {
|
|
6
|
+
const terminalNodeMap = {};
|
|
7
|
+
|
|
8
|
+
nodes.forEach((node, index) => {
|
|
9
|
+
const nodeTerminalNode = node.isTerminalNode();
|
|
10
|
+
|
|
11
|
+
if (nodeTerminalNode) {
|
|
12
|
+
const terminalNode = node; //
|
|
13
|
+
|
|
14
|
+
terminalNodeMap[index] = terminalNode;
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
return terminalNodeMap;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function areTerminalNodeMapsEqual(terminalNodeMapA, terminalNodeMapB) {
|
|
22
|
+
let terminalNodeMapsEqual = false;
|
|
23
|
+
|
|
24
|
+
const indexesA = Object.keys(terminalNodeMapA), ///
|
|
25
|
+
indexesB = Object.keys(terminalNodeMapB), ///
|
|
26
|
+
terminalNodeMapKeysEqual = areArraysEqual(indexesA, indexesB);
|
|
27
|
+
|
|
28
|
+
if (terminalNodeMapKeysEqual) {
|
|
29
|
+
const terminalNodesA = Object.keys(terminalNodeMapA), ///
|
|
30
|
+
terminalNodesB = Object.keys(terminalNodeMapB), ///
|
|
31
|
+
terminalNodeMapValuesEqual = areArraysEqual(terminalNodesA, terminalNodesB, (terminalNodeA, terminalNodeB) => {
|
|
32
|
+
const matches = terminalNodeA.match(terminalNodeB);
|
|
33
|
+
|
|
34
|
+
if (matches) {
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
terminalNodeMapsEqual = terminalNodeMapValuesEqual; ///
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return terminalNodeMapsEqual;
|
|
43
|
+
}
|
package/src/verifier/node.js
CHANGED
|
@@ -32,6 +32,28 @@ export default class NodeVerifier {
|
|
|
32
32
|
return childNodesVerify;
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
+
verifyTerminalNode(terminalNode, ...remainingArguments) {
|
|
36
|
+
let terminalNodeVerified;
|
|
37
|
+
|
|
38
|
+
const verifyAhead = remainingArguments.pop(), ///
|
|
39
|
+
verifiedAhead = verifyAhead(); ///
|
|
40
|
+
|
|
41
|
+
terminalNodeVerified = verifiedAhead; ///
|
|
42
|
+
|
|
43
|
+
return terminalNodeVerified;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
verifyNonTerminalNode(nonTerminalNode, ...remainingArguments) {
|
|
47
|
+
let nonTerminalNodeVerified;
|
|
48
|
+
|
|
49
|
+
const childNodes = nonTerminalNode.getChildNodes(), ///
|
|
50
|
+
childNodesVerify = this.verifyChildNodes(childNodes, ...remainingArguments);
|
|
51
|
+
|
|
52
|
+
nonTerminalNodeVerified = childNodesVerify; ///
|
|
53
|
+
|
|
54
|
+
return nonTerminalNodeVerified;
|
|
55
|
+
}
|
|
56
|
+
|
|
35
57
|
verifyChildNodesAhead(index, childNodes, ...remainingArguments) {
|
|
36
58
|
let childNodesVerify;
|
|
37
59
|
|
|
@@ -46,11 +68,10 @@ export default class NodeVerifier {
|
|
|
46
68
|
const childNode = childNodes[index],
|
|
47
69
|
node = childNode, ///
|
|
48
70
|
nodeVerified = this.verifyNode(node, ...remainingArguments, () => {
|
|
49
|
-
index++;
|
|
50
|
-
|
|
51
71
|
remainingArguments.push(verifyAhead);
|
|
52
72
|
|
|
53
|
-
const
|
|
73
|
+
const aheadIndex = index + 1,
|
|
74
|
+
childNodesVerifyAhead = this.verifyChildNodesAhead(aheadIndex, childNodes, ...remainingArguments);
|
|
54
75
|
|
|
55
76
|
return childNodesVerifyAhead;
|
|
56
77
|
});
|
|
@@ -60,26 +81,4 @@ export default class NodeVerifier {
|
|
|
60
81
|
|
|
61
82
|
return childNodesVerify;
|
|
62
83
|
}
|
|
63
|
-
|
|
64
|
-
verifyTerminalNode(terminalNode, ...remainingArguments) {
|
|
65
|
-
let terminalNodeVerified;
|
|
66
|
-
|
|
67
|
-
const verifyAhead = remainingArguments.pop(), ///
|
|
68
|
-
verifiedAhead = verifyAhead(); ///
|
|
69
|
-
|
|
70
|
-
terminalNodeVerified = verifiedAhead; ///
|
|
71
|
-
|
|
72
|
-
return terminalNodeVerified;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
verifyNonTerminalNode(nonTerminalNode, ...remainingArguments) {
|
|
76
|
-
let nonTerminalNodeVerified;
|
|
77
|
-
|
|
78
|
-
const childNodes = nonTerminalNode.getChildNodes(), ///
|
|
79
|
-
childNodesVerify = this.verifyChildNodes(childNodes, ...remainingArguments);
|
|
80
|
-
|
|
81
|
-
nonTerminalNodeVerified = childNodesVerify; ///
|
|
82
|
-
|
|
83
|
-
return nonTerminalNodeVerified;
|
|
84
|
-
}
|
|
85
84
|
}
|
package/src/verifier/nodes.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
import { terminalNodeMapFromNodes, areTerminalNodeMapsEqual } from "../utilities/terminalNodes";
|
|
4
|
+
|
|
3
5
|
export default class NodesVerifier {
|
|
4
6
|
verifyNode(nodeA, nodeB, ...remainingArguments) {
|
|
5
7
|
let nodeVerified = false;
|
|
@@ -35,15 +37,51 @@ export default class NodesVerifier {
|
|
|
35
37
|
childNodesBLength = childNodesB.length;
|
|
36
38
|
|
|
37
39
|
if (childNodesALength === childNodesBLength) {
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
+
const childTerminalNodeMapA = terminalNodeMapFromNodes(childNodesA),
|
|
41
|
+
childTerminalNodeMapB = terminalNodeMapFromNodes(childNodesB),
|
|
42
|
+
terminalNodeMapsEqual = areTerminalNodeMapsEqual(childTerminalNodeMapA, childTerminalNodeMapB);
|
|
43
|
+
|
|
44
|
+
if (terminalNodeMapsEqual) {
|
|
45
|
+
const index = 0,
|
|
46
|
+
childNodesVerifyAhead = this.verifyChildNodesAhead(index, childNodesA, childNodesB, ...remainingArguments);
|
|
40
47
|
|
|
41
|
-
|
|
48
|
+
childNodesVerify = childNodesVerifyAhead; ///
|
|
49
|
+
}
|
|
42
50
|
}
|
|
43
51
|
|
|
44
52
|
return childNodesVerify;
|
|
45
53
|
}
|
|
46
54
|
|
|
55
|
+
verifyTerminalNode(terminalNodeA, terminalNodeB, ...remainingArguments) { ///
|
|
56
|
+
let terminalNodeVerified;
|
|
57
|
+
|
|
58
|
+
const verifyAhead = remainingArguments.pop(),
|
|
59
|
+
verifiedAhead = verifyAhead();
|
|
60
|
+
|
|
61
|
+
terminalNodeVerified = verifiedAhead; ///
|
|
62
|
+
|
|
63
|
+
return terminalNodeVerified;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, ...remainingArguments) {
|
|
67
|
+
let nonTerminalNodeVerified = false;
|
|
68
|
+
|
|
69
|
+
const nonTerminalNodeARuleName = nonTerminalNodeA.getRuleName(), ///
|
|
70
|
+
nonTerminalNodeBRuleName = nonTerminalNodeB.getRuleName(); ///
|
|
71
|
+
|
|
72
|
+
if (nonTerminalNodeARuleName === nonTerminalNodeBRuleName) {
|
|
73
|
+
const nonTerminalNodeAChildNodes = nonTerminalNodeA.getChildNodes(),
|
|
74
|
+
nonTerminalNodeBChildNodes = nonTerminalNodeB.getChildNodes(),
|
|
75
|
+
childNodesA = nonTerminalNodeAChildNodes, ///
|
|
76
|
+
childNodesB = nonTerminalNodeBChildNodes, ///
|
|
77
|
+
childNodesVerify = this.verifyChildNodes(childNodesA, childNodesB, ...remainingArguments);
|
|
78
|
+
|
|
79
|
+
nonTerminalNodeVerified = childNodesVerify; ///
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return nonTerminalNodeVerified;
|
|
83
|
+
}
|
|
84
|
+
|
|
47
85
|
verifyChildNodesAhead(index, childNodesA, childNodesB, ...remainingArguments) {
|
|
48
86
|
let childNodesVerify;
|
|
49
87
|
|
|
@@ -60,11 +98,10 @@ export default class NodesVerifier {
|
|
|
60
98
|
nodeA = childNodeA, ///
|
|
61
99
|
nodeB = childNodeB, ///
|
|
62
100
|
nodeVerified = this.verifyNode(nodeA, nodeB, ...remainingArguments, () => {
|
|
63
|
-
index++;
|
|
64
|
-
|
|
65
101
|
remainingArguments.push(verifyAhead); ///
|
|
66
102
|
|
|
67
|
-
const
|
|
103
|
+
const aheadIndex = index + 1,
|
|
104
|
+
childNodesVerifyAhead = this.verifyChildNodesAhead(aheadIndex, childNodesA, childNodesB, ...remainingArguments);
|
|
68
105
|
|
|
69
106
|
return childNodesVerifyAhead;
|
|
70
107
|
});
|
|
@@ -74,38 +111,4 @@ export default class NodesVerifier {
|
|
|
74
111
|
|
|
75
112
|
return childNodesVerify;
|
|
76
113
|
}
|
|
77
|
-
|
|
78
|
-
verifyTerminalNode(terminalNodeA, terminalNodeB, ...remainingArguments) {
|
|
79
|
-
let terminalNodeVerified = false;
|
|
80
|
-
|
|
81
|
-
const matches = terminalNodeA.match(terminalNodeB);
|
|
82
|
-
|
|
83
|
-
if (matches) {
|
|
84
|
-
const verifyAhead = remainingArguments.pop(),
|
|
85
|
-
verifiedAhead = verifyAhead();
|
|
86
|
-
|
|
87
|
-
terminalNodeVerified = verifiedAhead; ///
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
return terminalNodeVerified;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, ...remainingArguments) {
|
|
94
|
-
let nonTerminalNodeVerified = false;
|
|
95
|
-
|
|
96
|
-
const nonTerminalNodeARuleName = nonTerminalNodeA.getRuleName(), ///
|
|
97
|
-
nonTerminalNodeBRuleName = nonTerminalNodeB.getRuleName(); ///
|
|
98
|
-
|
|
99
|
-
if (nonTerminalNodeARuleName === nonTerminalNodeBRuleName) {
|
|
100
|
-
const nonTerminalNodeAChildNodes = nonTerminalNodeA.getChildNodes(),
|
|
101
|
-
nonTerminalNodeBChildNodes = nonTerminalNodeB.getChildNodes(),
|
|
102
|
-
childNodesA = nonTerminalNodeAChildNodes, ///
|
|
103
|
-
childNodesB = nonTerminalNodeBChildNodes, ///
|
|
104
|
-
childNodesVerify = this.verifyChildNodes(childNodesA, childNodesB, ...remainingArguments);
|
|
105
|
-
|
|
106
|
-
nonTerminalNodeVerified = childNodesVerify; ///
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
return nonTerminalNodeVerified;
|
|
110
|
-
}
|
|
111
114
|
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
export default function verifyGivenVariable(variableNode, variables, context, verifyAhead) {
|
|
4
|
+
let givenVariableVerified = false;
|
|
5
|
+
|
|
6
|
+
const variableString = context.nodeAsString(variableNode);
|
|
7
|
+
|
|
8
|
+
context.trace(`Verifying the '${variableString}' given variable...`, variableNode);
|
|
9
|
+
|
|
10
|
+
const variable = context.findVariableByVariableNode(variableNode);
|
|
11
|
+
|
|
12
|
+
if (variable !== null) {
|
|
13
|
+
let verifiedAhead;
|
|
14
|
+
|
|
15
|
+
variables.push(variable);
|
|
16
|
+
|
|
17
|
+
verifiedAhead = verifyAhead();
|
|
18
|
+
|
|
19
|
+
if (!verifiedAhead) {
|
|
20
|
+
variables.pop();
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
givenVariableVerified = verifiedAhead; ///
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
if (givenVariableVerified) {
|
|
27
|
+
context.debug(`...verified the '${variableString}' given variable.`, variableNode);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return givenVariableVerified;
|
|
31
|
+
}
|