occam-verify-cli 0.0.837 → 0.0.839
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/lib/constants.js +5 -1
- package/lib/context/file.js +24 -9
- package/lib/context/local.js +77 -39
- package/lib/context/localMeta.js +3 -3
- package/lib/context/release.js +4 -5
- package/lib/equality.js +2 -2
- package/lib/equivalence.js +244 -0
- package/lib/log.js +3 -3
- package/lib/term.js +40 -1
- package/lib/utilities/array.js +5 -5
- package/lib/utilities/equivalences.js +169 -0
- package/lib/verifier/node/metastatement.js +12 -31
- package/lib/verifier/node/statementAsCombinator.js +4 -4
- package/lib/verifier/node/termAsConstructor.js +7 -27
- package/lib/verifier/nodes/equality.js +8 -8
- package/lib/verifier/nodes/metaLevelToIntrinsicLevel.js +22 -6
- package/lib/verify/containment.js +22 -12
- package/lib/verify/defining.js +38 -0
- package/lib/verify/metavariable.js +26 -4
- package/lib/verify/statement.js +62 -45
- package/lib/verify/term.js +6 -6
- package/lib/verify/type.js +7 -7
- package/lib/verify/variable.js +26 -4
- package/package.json +1 -1
- package/src/constants.js +1 -0
- package/src/context/file.js +35 -8
- package/src/context/local.js +113 -44
- package/src/context/localMeta.js +3 -3
- package/src/context/release.js +6 -9
- package/src/equality.js +2 -2
- package/src/{collection.js → equivalence.js} +84 -28
- package/src/log.js +2 -2
- package/src/term.js +48 -0
- package/src/utilities/array.js +1 -1
- package/src/utilities/equivalences.js +152 -0
- package/src/verifier/node/metastatement.js +23 -51
- package/src/verifier/node/statementAsCombinator.js +9 -6
- package/src/verifier/node/termAsConstructor.js +13 -44
- package/src/verifier/nodes/equality.js +7 -7
- package/src/verifier/nodes/metaLevelToIntrinsicLevel.js +38 -12
- package/src/verify/containment.js +31 -20
- package/src/verify/defining.js +43 -0
- package/src/verify/metavariable.js +22 -0
- package/src/verify/statement.js +88 -54
- package/src/verify/term.js +4 -5
- package/src/verify/type.js +6 -7
- package/src/verify/variable.js +22 -0
- package/lib/collection.js +0 -192
- package/lib/utilities/collection.js +0 -121
- package/src/utilities/collection.js +0 -103
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { push, filter, compress, separate } from "../utilities/array";
|
|
4
|
+
|
|
5
|
+
export function areTermNodesEqual(leftTermNode, rightTermNode, equivalences) {
|
|
6
|
+
let termNodesEqual;
|
|
7
|
+
|
|
8
|
+
const leftTermNodeMatchesRightTermNode = leftTermNode.match(rightTermNode);
|
|
9
|
+
|
|
10
|
+
if (leftTermNodeMatchesRightTermNode) {
|
|
11
|
+
termNodesEqual = true;
|
|
12
|
+
} else {
|
|
13
|
+
const termNodes = [
|
|
14
|
+
leftTermNode,
|
|
15
|
+
rightTermNode
|
|
16
|
+
],
|
|
17
|
+
equivalence = findEquivalenceByTermNodes(equivalences, termNodes);
|
|
18
|
+
|
|
19
|
+
termNodesEqual = (equivalence !== null);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return termNodesEqual;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function findEquivalenceByType(equivalences, type, localContext) {
|
|
26
|
+
const equivalence = equivalences.find((equivalence) => {
|
|
27
|
+
const equivalenceMatchesType = equivalence.matchType(type, localContext);
|
|
28
|
+
|
|
29
|
+
if (equivalenceMatchesType) {
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
}) || null;
|
|
33
|
+
|
|
34
|
+
return equivalence;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function findEquivalenceByTerm(equivalences, term) {
|
|
38
|
+
const equivalence = equivalences.find((equivalence) => {
|
|
39
|
+
const equivalenceMatchesTerm = equivalence.matchTerm(term);
|
|
40
|
+
|
|
41
|
+
if (equivalenceMatchesTerm) {
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
}) || null;
|
|
45
|
+
|
|
46
|
+
return equivalence;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function mergeEquivalences(equivalencesA, equivalencesB, localContext) {
|
|
50
|
+
const typesA = typesFromEquivalences(equivalencesA, localContext),
|
|
51
|
+
typesB = typesFromEquivalences(equivalencesB, localContext),
|
|
52
|
+
types = [
|
|
53
|
+
...typesA,
|
|
54
|
+
...typesB
|
|
55
|
+
];
|
|
56
|
+
|
|
57
|
+
compress(types, (typeA, typeB) => {
|
|
58
|
+
if (typeA === typeB) {
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
const equivalences = types.map((type) => {
|
|
64
|
+
let equivalence;
|
|
65
|
+
|
|
66
|
+
const equivalenceA = findEquivalenceByType(equivalencesA, type, localContext),
|
|
67
|
+
equivalenceB = findEquivalenceByType(equivalencesB, type, localContext);
|
|
68
|
+
|
|
69
|
+
if ((equivalenceA !== null) && (equivalenceB !== null)) {
|
|
70
|
+
const leftEquivalence = equivalenceA, ///
|
|
71
|
+
rightEquivalence = equivalenceB; ///
|
|
72
|
+
|
|
73
|
+
equivalence = Equivalence.merge(leftEquivalence, rightEquivalence);
|
|
74
|
+
} else if (equivalenceA !== null) {
|
|
75
|
+
equivalence = equivalenceA; ///
|
|
76
|
+
} else if (equivalenceB !== null) {
|
|
77
|
+
equivalence = equivalenceB; ///
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return equivalence;
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
return equivalences;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export function separateEquivalences(equivalences, remainingEquivalences, initiallyGroundedEquivalences) {
|
|
87
|
+
separate(equivalences, remainingEquivalences, initiallyGroundedEquivalences, (equivalence) => {
|
|
88
|
+
const equivalenceInitiallyGrounded = equivalence.isInitiallyGrounded();
|
|
89
|
+
|
|
90
|
+
if (!equivalenceInitiallyGrounded) {
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export function compressDefinedVariables(definedVariables) {
|
|
97
|
+
compress(definedVariables, (definedVariableA, definedVariableB) => {
|
|
98
|
+
if (definedVariableA === definedVariableB) {
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export function definedVariablesFromGroundedEquivalences(groundedEquivalences, definedVariables, context) {
|
|
105
|
+
groundedEquivalences.forEach((groundedEquivalence) => {
|
|
106
|
+
const variables = groundedEquivalence.getVariables(context);
|
|
107
|
+
|
|
108
|
+
push(definedVariables, variables);
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export function implicitlyGroundedEquivalencesFromRemainingEquivalencesAndDefinedVariables(remainingEquivalences, definedVariables) {
|
|
113
|
+
const implicitlyGroundedEquivalences = [];
|
|
114
|
+
|
|
115
|
+
filter(remainingEquivalences, (remainingEquivalence) => {
|
|
116
|
+
const remainingEquivalenceImplicitlyGrounded = remainingEquivalence.isImplicitlyGrounded(definedVariables);
|
|
117
|
+
|
|
118
|
+
if (remainingEquivalenceImplicitlyGrounded) {
|
|
119
|
+
const implicitlyGroundedEquivalence = remainingEquivalence; ///
|
|
120
|
+
|
|
121
|
+
implicitlyGroundedEquivalences.push(implicitlyGroundedEquivalence);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
if (!remainingEquivalenceImplicitlyGrounded) {
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
return implicitlyGroundedEquivalences;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function findEquivalenceByTermNodes(equivalences, termNodes) {
|
|
133
|
+
const equivalence = equivalences.find((equivalence) => {
|
|
134
|
+
const equivalenceMatchesTerms = equivalence.matchTermNodes(termNodes);
|
|
135
|
+
|
|
136
|
+
if (equivalenceMatchesTerms) {
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
}) || null;
|
|
140
|
+
|
|
141
|
+
return equivalence;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function typesFromEquivalences(equivalences, localContext) {
|
|
145
|
+
const types = equivalences.map((equivalence) => {
|
|
146
|
+
const type = equivalence.getType(localContext);
|
|
147
|
+
|
|
148
|
+
return type;
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
return types;
|
|
152
|
+
}
|
|
@@ -2,7 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
import NodeVerifier from "../../verifier/node";
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { verifyStandaloneTerm } from "../../verify/term";
|
|
6
|
+
import { verifyStandaloneVariable } from "../../verify/variable";
|
|
7
|
+
import { verifyStandaloneMetavariable } from "../../verify/metavariable";
|
|
8
|
+
import { TERM_RULE_NAME, VARIABLE_RULE_NAME, METAVARIABLE_RULE_NAME } from "../../ruleNames";
|
|
6
9
|
|
|
7
10
|
class MetastatementNodeVerifier extends NodeVerifier {
|
|
8
11
|
verifyNonTerminalNode(nonTerminalNode, localMetaContext, verifyAhead) {
|
|
@@ -12,9 +15,10 @@ class MetastatementNodeVerifier extends NodeVerifier {
|
|
|
12
15
|
|
|
13
16
|
switch (ruleName) {
|
|
14
17
|
case METAVARIABLE_RULE_NAME: {
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
+
const context = localMetaContext, ///
|
|
19
|
+
metavariableNode = nonTerminalNode, ///
|
|
20
|
+
standaloneMetavariableVerified = verifyStandaloneMetavariable(metavariableNode, context, verifyAhead),
|
|
21
|
+
metavariableNodeVerified = standaloneMetavariableVerified; ///
|
|
18
22
|
|
|
19
23
|
nonTerminalNodeVerified = metavariableNodeVerified; ///
|
|
20
24
|
|
|
@@ -22,15 +26,27 @@ class MetastatementNodeVerifier extends NodeVerifier {
|
|
|
22
26
|
}
|
|
23
27
|
|
|
24
28
|
case VARIABLE_RULE_NAME: {
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
29
|
+
const context = localMetaContext, ///
|
|
30
|
+
variableNode = nonTerminalNode, ///
|
|
31
|
+
standaloneVariableVerified = verifyStandaloneVariable(variableNode, context, verifyAhead),
|
|
32
|
+
variableNodeVerified = standaloneVariableVerified; ///
|
|
28
33
|
|
|
29
34
|
nonTerminalNodeVerified = variableNodeVerified; ///
|
|
30
35
|
|
|
31
36
|
break;
|
|
32
37
|
}
|
|
33
38
|
|
|
39
|
+
case TERM_RULE_NAME: {
|
|
40
|
+
const context = localMetaContext, ///
|
|
41
|
+
termNode = nonTerminalNode, ///
|
|
42
|
+
standaloneTermVerified = verifyStandaloneTerm(termNode, context, verifyAhead),
|
|
43
|
+
termNodeVerified = standaloneTermVerified; ///
|
|
44
|
+
|
|
45
|
+
nonTerminalNodeVerified = termNodeVerified; ///
|
|
46
|
+
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
|
|
34
50
|
default: {
|
|
35
51
|
nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNode, localMetaContext, verifyAhead);
|
|
36
52
|
|
|
@@ -45,47 +61,3 @@ class MetastatementNodeVerifier extends NodeVerifier {
|
|
|
45
61
|
const metastatementNodeVerifier = new MetastatementNodeVerifier();
|
|
46
62
|
|
|
47
63
|
export default metastatementNodeVerifier;
|
|
48
|
-
|
|
49
|
-
function verifyMetavariable(metavariableNode, localMetaContext, verifyAhead) {
|
|
50
|
-
let metavariableVerified;
|
|
51
|
-
|
|
52
|
-
const metavariableString = localMetaContext.nodeAsString(metavariableNode);
|
|
53
|
-
|
|
54
|
-
localMetaContext.trace(`Verifying the '${metavariableString}' metavariable...`, metavariableNode);
|
|
55
|
-
|
|
56
|
-
const metavariablePresent = localMetaContext.isMetavariablePresentByMetavariableNode(metavariableNode);
|
|
57
|
-
|
|
58
|
-
if (metavariablePresent) {
|
|
59
|
-
const verifiedAhead = verifyAhead();
|
|
60
|
-
|
|
61
|
-
metavariableVerified = verifiedAhead; ///
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
if (metavariableVerified) {
|
|
65
|
-
localMetaContext.debug(`...verified the '${metavariableString}' metavariable.`, metavariableNode);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
return metavariableVerified;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
function verifyVariable(variableNode, localMetaContext, verifyAhead) {
|
|
72
|
-
let variableVerified;
|
|
73
|
-
|
|
74
|
-
const variableString = localMetaContext.nodeAsString(variableNode);
|
|
75
|
-
|
|
76
|
-
localMetaContext.trace(`Verifying the '${variableString}' variable...`, variableNode);
|
|
77
|
-
|
|
78
|
-
const variablePresent = localMetaContext.isVariablePresentByVariableNode(variableNode);
|
|
79
|
-
|
|
80
|
-
if (variablePresent) {
|
|
81
|
-
const verifiedAhead = verifyAhead();
|
|
82
|
-
|
|
83
|
-
variableVerified = verifiedAhead; ///
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
if (variableVerified) {
|
|
87
|
-
localMetaContext.debug(`...verified the '${variableString}' variable.`, variableNode);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
return variableVerified;
|
|
91
|
-
}
|
|
@@ -15,8 +15,9 @@ class StatementAsCombinatorNodeVerifier extends NodeVerifier {
|
|
|
15
15
|
|
|
16
16
|
switch (ruleName) {
|
|
17
17
|
case STATEMENT_RULE_NAME: {
|
|
18
|
-
const
|
|
19
|
-
|
|
18
|
+
const context = fileContext, ///
|
|
19
|
+
statementNode = nonTerminalNode, ///
|
|
20
|
+
standaloneStatementVerified = verifyStandaloneStatement(statementNode, context, verifyAhead),
|
|
20
21
|
statementNodeVerified = standaloneStatementVerified; ///
|
|
21
22
|
|
|
22
23
|
nonTerminalNodeVerified = statementNodeVerified; ///
|
|
@@ -25,8 +26,9 @@ class StatementAsCombinatorNodeVerifier extends NodeVerifier {
|
|
|
25
26
|
}
|
|
26
27
|
|
|
27
28
|
case TERM_RULE_NAME: {
|
|
28
|
-
const
|
|
29
|
-
|
|
29
|
+
const context = fileContext, ///
|
|
30
|
+
termNode = nonTerminalNode, ///
|
|
31
|
+
standaloneTermVerified = verifyStandaloneTerm(termNode, context, verifyAhead),
|
|
30
32
|
termNodeVerified = standaloneTermVerified; ///
|
|
31
33
|
|
|
32
34
|
nonTerminalNodeVerified = termNodeVerified; ///
|
|
@@ -35,8 +37,9 @@ class StatementAsCombinatorNodeVerifier extends NodeVerifier {
|
|
|
35
37
|
}
|
|
36
38
|
|
|
37
39
|
case TYPE_RULE_NAME: {
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
+
const context = fileContext, ///
|
|
41
|
+
typeNode = nonTerminalNode, ///
|
|
42
|
+
standaloneTypeVerified = verifyStandaloneType(typeNode, context, verifyAhead),
|
|
40
43
|
typeNodeVerified = standaloneTypeVerified; ///
|
|
41
44
|
|
|
42
45
|
nonTerminalNodeVerified = typeNodeVerified; ///
|
|
@@ -2,13 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
import NodeVerifier from "../../verifier/node";
|
|
4
4
|
|
|
5
|
-
import { nodeQuery } from "../../utilities/query";
|
|
6
5
|
import { verifyStandaloneType } from "../../verify/type";
|
|
7
6
|
import { verifyStandaloneTerm } from "../../verify/term";
|
|
8
|
-
import { TERM_RULE_NAME,
|
|
9
|
-
|
|
10
|
-
const typeNodeQuery = nodeQuery("/argument/type"),
|
|
11
|
-
termNodeQuery = nodeQuery("/argument/term");
|
|
7
|
+
import { TERM_RULE_NAME, TYPE_RULE_NAME } from "../../ruleNames";
|
|
12
8
|
|
|
13
9
|
class TermAsConstructorNodeVerifier extends NodeVerifier {
|
|
14
10
|
verifyNonTerminalNode(nonTerminalNode, fileContext, verifyAhead) {
|
|
@@ -17,22 +13,24 @@ class TermAsConstructorNodeVerifier extends NodeVerifier {
|
|
|
17
13
|
const ruleName = nonTerminalNode.getRuleName();
|
|
18
14
|
|
|
19
15
|
switch (ruleName) {
|
|
20
|
-
case
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
16
|
+
case TERM_RULE_NAME: {
|
|
17
|
+
const context = fileContext, ///
|
|
18
|
+
termNode = nonTerminalNode, ///
|
|
19
|
+
standaloneTermVerified = verifyStandaloneTerm(termNode, context, verifyAhead),
|
|
20
|
+
termNodeVerified = standaloneTermVerified; ///
|
|
24
21
|
|
|
25
|
-
nonTerminalNodeVerified =
|
|
22
|
+
nonTerminalNodeVerified = termNodeVerified; ///
|
|
26
23
|
|
|
27
24
|
break;
|
|
28
25
|
}
|
|
29
26
|
|
|
30
|
-
case
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
27
|
+
case TYPE_RULE_NAME: {
|
|
28
|
+
const context = fileContext, ///
|
|
29
|
+
typeNode = nonTerminalNode, ///
|
|
30
|
+
standaloneTypeVerified = verifyStandaloneType(typeNode, context, verifyAhead),
|
|
31
|
+
typeNodeVerified = standaloneTypeVerified; ///
|
|
34
32
|
|
|
35
|
-
nonTerminalNodeVerified =
|
|
33
|
+
nonTerminalNodeVerified = typeNodeVerified; ///
|
|
36
34
|
|
|
37
35
|
break;
|
|
38
36
|
}
|
|
@@ -51,32 +49,3 @@ class TermAsConstructorNodeVerifier extends NodeVerifier {
|
|
|
51
49
|
const termAsConstructorNodeVerifier = new TermAsConstructorNodeVerifier();
|
|
52
50
|
|
|
53
51
|
export default termAsConstructorNodeVerifier;
|
|
54
|
-
|
|
55
|
-
function verifyArgument(argumentNode, fileContext, verifyAhead) {
|
|
56
|
-
let argumentVerified;
|
|
57
|
-
|
|
58
|
-
const argumentString = fileContext.nodeAsString(argumentNode);
|
|
59
|
-
|
|
60
|
-
fileContext.trace(`Verifying the '${argumentString}' argument...`, argumentNode);
|
|
61
|
-
|
|
62
|
-
const typeNode = typeNodeQuery(argumentNode),
|
|
63
|
-
termNode = termNodeQuery(argumentNode);
|
|
64
|
-
|
|
65
|
-
if (typeNode !== null) {
|
|
66
|
-
const standaloneTypeVerified = verifyStandaloneType(typeNode, fileContext, verifyAhead);
|
|
67
|
-
|
|
68
|
-
argumentVerified = standaloneTypeVerified; ///
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
if (termNode !== null) {
|
|
72
|
-
const standaloneTermVerified = verifyStandaloneTerm(termNode, fileContext, verifyAhead);
|
|
73
|
-
|
|
74
|
-
argumentVerified = standaloneTermVerified; ///
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
if (argumentVerified) {
|
|
78
|
-
fileContext.debug(`...verified the '${argumentString}' argument.`, argumentNode);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
return argumentVerified;
|
|
82
|
-
}
|
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
import NodesVerifier from "../../verifier/nodes";
|
|
4
4
|
|
|
5
5
|
import { TERM_RULE_NAME } from "../../ruleNames";
|
|
6
|
-
import { areTermNodesEqual } from "../../utilities/
|
|
6
|
+
import { areTermNodesEqual } from "../../utilities/equivalences";
|
|
7
7
|
|
|
8
8
|
class EqualityNodesVerifier extends NodesVerifier {
|
|
9
|
-
verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB,
|
|
9
|
+
verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, equivalences, localContext, verifyAhead) {
|
|
10
10
|
let nonTerminalNodeVerified = false;
|
|
11
11
|
|
|
12
12
|
const ruleNameA = nonTerminalNodeA.getRuleName(), ///
|
|
@@ -17,7 +17,7 @@ class EqualityNodesVerifier extends NodesVerifier {
|
|
|
17
17
|
case TERM_RULE_NAME: {
|
|
18
18
|
const termNodeA = nonTerminalNodeA, ///
|
|
19
19
|
termNodeB = nonTerminalNodeB, ///
|
|
20
|
-
termNodeVerified = this.verifyTermNode(termNodeA, termNodeB,
|
|
20
|
+
termNodeVerified = this.verifyTermNode(termNodeA, termNodeB, equivalences, localContext, verifyAhead);
|
|
21
21
|
|
|
22
22
|
nonTerminalNodeVerified = termNodeVerified; ///
|
|
23
23
|
|
|
@@ -25,7 +25,7 @@ class EqualityNodesVerifier extends NodesVerifier {
|
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
default: {
|
|
28
|
-
nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB,
|
|
28
|
+
nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, equivalences, localContext, verifyAhead);
|
|
29
29
|
|
|
30
30
|
break;
|
|
31
31
|
}
|
|
@@ -35,12 +35,12 @@ class EqualityNodesVerifier extends NodesVerifier {
|
|
|
35
35
|
return nonTerminalNodeVerified;
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
verifyTermNode(termNodeA, termNodeB,
|
|
38
|
+
verifyTermNode(termNodeA, termNodeB, equivalences, localContext, verifyAhead) {
|
|
39
39
|
let termNodeVerified;
|
|
40
40
|
|
|
41
41
|
const leftTermNode = termNodeA, ///
|
|
42
42
|
rightTermNode = termNodeB, ///
|
|
43
|
-
termNodesEqual = areTermNodesEqual(leftTermNode, rightTermNode,
|
|
43
|
+
termNodesEqual = areTermNodesEqual(leftTermNode, rightTermNode, equivalences);
|
|
44
44
|
|
|
45
45
|
if (termNodesEqual) {
|
|
46
46
|
const verifiedAhead = verifyAhead();
|
|
@@ -50,7 +50,7 @@ class EqualityNodesVerifier extends NodesVerifier {
|
|
|
50
50
|
const nonTerminalNodeA = termNodeA, ///
|
|
51
51
|
nonTerminalNodeB = termNodeB; ///
|
|
52
52
|
|
|
53
|
-
termNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB,
|
|
53
|
+
termNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, equivalences, localContext, verifyAhead);
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
return termNodeVerified;
|
|
@@ -2,15 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
import LocalContext from "../../context/local";
|
|
4
4
|
import NodesVerifier from "../../verifier/nodes";
|
|
5
|
+
import TermForVariableSubstitution from "../../substitution/termForVariable";
|
|
5
6
|
import intrinsicLevelNodesVerifierMixins from "../../mixins/nodesVerifier/intrinsiclevel";
|
|
6
7
|
import StatementForMetavariableSubstitution from "../../substitution/statementForMetavariable";
|
|
7
8
|
|
|
8
9
|
import { nodeQuery } from "../../utilities/query";
|
|
9
10
|
import { TERM_RULE_NAME, STATEMENT_RULE_NAME, METASTATEMENT_RULE_NAME, META_ARGUMENT_RULE_NAME } from "../../ruleNames";
|
|
10
11
|
|
|
11
|
-
const
|
|
12
|
+
const termNodeQuery = nodeQuery("/substitution/term!"),
|
|
13
|
+
variableNodeQuery = nodeQuery("/*/variable!"),
|
|
12
14
|
statementNodeQuery = nodeQuery("/metaArgument/statement"),
|
|
13
|
-
metavariableNodeQuery = nodeQuery("/metastatement/metavariable!")
|
|
15
|
+
metavariableNodeQuery = nodeQuery("/metastatement/metavariable!"),
|
|
16
|
+
substitutionNodeQuery = nodeQuery("/metastatement/substitution!");
|
|
14
17
|
|
|
15
18
|
class MetaLevelToIntrinsicLevelNodesVerifier extends NodesVerifier {
|
|
16
19
|
verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, localContextB, verifyAhead) {
|
|
@@ -80,9 +83,24 @@ class MetaLevelToIntrinsicLevelNodesVerifier extends NodesVerifier {
|
|
|
80
83
|
metavariableNodeA = metavariableNodeQuery(metastatementNodeA);
|
|
81
84
|
|
|
82
85
|
if ((metavariableNodeA !== null) && (statementNodeB !== null)) {
|
|
83
|
-
const
|
|
86
|
+
const substitutionNode = substitutionNodeQuery(metastatementNodeA);
|
|
87
|
+
|
|
88
|
+
if (substitutionNode !== null) {
|
|
89
|
+
const variableNode = variableNodeQuery(substitutionNode),
|
|
90
|
+
variable = fileContextA.findVariableByVariableNode(variableNode);
|
|
91
|
+
|
|
92
|
+
if (variable !== null) {
|
|
93
|
+
const termNode = termNodeQuery(substitutionNode);
|
|
94
|
+
|
|
95
|
+
debugger
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
}
|
|
99
|
+
} else {
|
|
100
|
+
const metavariableNodeVerified = this.verifyMetavariableNode(metavariableNodeA, statementNodeB, substitutions, fileContextA, localContextB, verifyAhead);
|
|
84
101
|
|
|
85
|
-
|
|
102
|
+
metaArgumentNodeVerified = metavariableNodeVerified; ///
|
|
103
|
+
}
|
|
86
104
|
}
|
|
87
105
|
|
|
88
106
|
return metaArgumentNodeVerified;
|
|
@@ -121,15 +139,23 @@ class MetaLevelToIntrinsicLevelNodesVerifier extends NodesVerifier {
|
|
|
121
139
|
verifyStatementNode(metastatementNodeA, statementNodeB, substitutions, fileContextA, localContextB, verifyAhead) {
|
|
122
140
|
let statementNodeVerified;
|
|
123
141
|
|
|
124
|
-
const
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
childNodesA = nonTerminalNodeAChildNodes, ///
|
|
129
|
-
childNodesB = nonTerminalNodeBChildNodes, ///
|
|
130
|
-
childNodesVerified = super.verifyChildNodes(childNodesA, childNodesB, substitutions, fileContextA, localContextB, verifyAhead);
|
|
142
|
+
const metavariableNodeA = metavariableNodeQuery(metastatementNodeA);
|
|
143
|
+
|
|
144
|
+
if (metavariableNodeA !== null) {
|
|
145
|
+
const metavariableNodeVerified = this.verifyMetavariableNode(metavariableNodeA, statementNodeB, substitutions, fileContextA, localContextB, verifyAhead);
|
|
131
146
|
|
|
132
|
-
|
|
147
|
+
statementNodeVerified = metavariableNodeVerified; ///
|
|
148
|
+
} else {
|
|
149
|
+
const nonTerminalNodeA = metastatementNodeA, ///
|
|
150
|
+
nonTerminalNodeB = statementNodeB, ///
|
|
151
|
+
nonTerminalNodeAChildNodes = nonTerminalNodeA.getChildNodes(),
|
|
152
|
+
nonTerminalNodeBChildNodes = nonTerminalNodeB.getChildNodes(),
|
|
153
|
+
childNodesA = nonTerminalNodeAChildNodes, ///
|
|
154
|
+
childNodesB = nonTerminalNodeBChildNodes, ///
|
|
155
|
+
childNodesVerified = super.verifyChildNodes(childNodesA, childNodesB, substitutions, fileContextA, localContextB, verifyAhead);
|
|
156
|
+
|
|
157
|
+
statementNodeVerified = childNodesVerified; ///
|
|
158
|
+
}
|
|
133
159
|
|
|
134
160
|
return statementNodeVerified;
|
|
135
161
|
}
|
|
@@ -1,37 +1,48 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { second } from "../utilities/array";
|
|
4
4
|
import { CONTAINED } from "../constants";
|
|
5
5
|
import { nodeQuery, nodesQuery } from "../utilities/query";
|
|
6
6
|
|
|
7
|
-
const
|
|
8
|
-
containmentVariableNodeQuery = nodeQuery("/
|
|
7
|
+
const variableNodesQuery = nodesQuery("/metaArgument//variable"),
|
|
8
|
+
containmentVariableNodeQuery = nodeQuery("/argument/term/variable!");
|
|
9
9
|
|
|
10
|
-
export default function verifyContainment(containmentNode,
|
|
10
|
+
export default function verifyContainment(argumentNode, containmentNode, metaArgumentNode, context) {
|
|
11
11
|
let containmentVerified = false;
|
|
12
12
|
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
13
|
+
const containmentVariableNode = containmentVariableNodeQuery(argumentNode);
|
|
14
|
+
|
|
15
|
+
if (containmentVariableNode !== null) {
|
|
16
|
+
const contained = containedFromContainmentNode(containmentNode),
|
|
17
|
+
variableNodes = variableNodesQuery(metaArgumentNode),
|
|
18
|
+
containmentVariableNodeMatchesStatementVariableNode = variableNodes.some((statementVariableNode) => {
|
|
19
|
+
const containmentVariableNodeMatchesStatementVariableNode = containmentVariableNode.match(statementVariableNode);
|
|
20
|
+
|
|
21
|
+
if (containmentVariableNodeMatchesStatementVariableNode) {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
if (contained) {
|
|
27
|
+
if (containmentVariableNodeMatchesStatementVariableNode) {
|
|
28
|
+
containmentVerified = true;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
if (!contained) {
|
|
33
|
+
if (!containmentVariableNodeMatchesStatementVariableNode) {
|
|
34
|
+
containmentVerified = true;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
26
37
|
}
|
|
27
38
|
|
|
28
39
|
return containmentVerified;
|
|
29
40
|
}
|
|
30
41
|
|
|
31
|
-
function
|
|
42
|
+
function containedFromContainmentNode(containmentNode) {
|
|
32
43
|
const childNodes = containmentNode.getChildNodes(),
|
|
33
|
-
|
|
34
|
-
terminalNode =
|
|
44
|
+
secondChildNode = second(childNodes),
|
|
45
|
+
terminalNode = secondChildNode, ///
|
|
35
46
|
content = terminalNode.getContent(),
|
|
36
47
|
contained = (content === CONTAINED);
|
|
37
48
|
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { second } from "../utilities/array";
|
|
4
|
+
import { DEFINED } from "../constants";
|
|
5
|
+
import { nodeQuery } from "../utilities/query";
|
|
6
|
+
|
|
7
|
+
const definedVariableNodeQuery = nodeQuery("/argument/term/variable!");
|
|
8
|
+
|
|
9
|
+
export default function verifyDefining(argumentNode, definingNode, context) {
|
|
10
|
+
let definingVerified = false;
|
|
11
|
+
|
|
12
|
+
const definedVariableNode = definedVariableNodeQuery(argumentNode);
|
|
13
|
+
|
|
14
|
+
if (definedVariableNode !== null) {
|
|
15
|
+
const defined = definedFromDefiningNode(definingNode),
|
|
16
|
+
variableNode = definedVariableNode, ///
|
|
17
|
+
variableDefined = context.isVariableDefined(variableNode);
|
|
18
|
+
|
|
19
|
+
if (defined) {
|
|
20
|
+
if (variableDefined) {
|
|
21
|
+
definingVerified = true;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
if (!defined) {
|
|
26
|
+
if (!variableDefined) {
|
|
27
|
+
definingVerified = true;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return definingVerified;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function definedFromDefiningNode(definingNode) {
|
|
36
|
+
const childNodes = definingNode.getChildNodes(),
|
|
37
|
+
secondChildNode = second(childNodes),
|
|
38
|
+
terminalNode = secondChildNode, ///
|
|
39
|
+
content = terminalNode.getContent(),
|
|
40
|
+
defined = (content === DEFINED);
|
|
41
|
+
|
|
42
|
+
return defined;
|
|
43
|
+
}
|
|
@@ -34,3 +34,25 @@ export default function verifyMetavariable(metavariableNode, metaTypeNode, fileC
|
|
|
34
34
|
|
|
35
35
|
return metavariableVerified;
|
|
36
36
|
}
|
|
37
|
+
|
|
38
|
+
export function verifyStandaloneMetavariable(metavariableNode, contexct, verifyAhead) {
|
|
39
|
+
let standaloneMetavariableVerified = false;
|
|
40
|
+
|
|
41
|
+
const metavariableString = contexct.nodeAsString(metavariableNode);
|
|
42
|
+
|
|
43
|
+
contexct.trace(`Verifying the '${metavariableString}' standalone metavariable...`, metavariableNode);
|
|
44
|
+
|
|
45
|
+
const metavariablePresent = contexct.isMetavariablePresentByMetavariableNode(metavariableNode);
|
|
46
|
+
|
|
47
|
+
if (metavariablePresent) {
|
|
48
|
+
const verifiedAhead = verifyAhead();
|
|
49
|
+
|
|
50
|
+
standaloneMetavariableVerified = verifiedAhead; ///
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (standaloneMetavariableVerified) {
|
|
54
|
+
contexct.debug(`...verified the '${metavariableString}' standalone metavariable.`, metavariableNode);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return standaloneMetavariableVerified;
|
|
58
|
+
}
|