occam-verify-cli 1.0.438 → 1.0.444
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/context/file.js +38 -35
- package/lib/context/local.js +10 -10
- package/lib/context/release.js +6 -6
- package/lib/context/temporary.js +14 -14
- package/lib/element/assertion/contained.js +45 -45
- package/lib/element/assertion/defined.js +13 -13
- package/lib/element/assertion/property.js +23 -22
- package/lib/element/assertion/satisfies.js +7 -6
- package/lib/element/assertion/subproof.js +20 -17
- package/lib/element/assertion/type.js +3 -2
- package/lib/element/assertion.js +1 -23
- package/lib/element/assumption.js +24 -22
- package/lib/element/axiom.js +9 -12
- package/lib/element/axiomLemmaTheoremConjecture.js +32 -32
- package/lib/element/{statement/combinator → combinator}/bracketed.js +16 -16
- package/lib/element/combinator.js +229 -0
- package/lib/element/conclusion.js +11 -9
- package/lib/element/{term/constructor → constructor}/bracketed.js +5 -5
- package/lib/element/constructor.js +232 -0
- package/lib/element/declaration/combinator.js +2 -16
- package/lib/element/declaration/complexType.js +12 -12
- package/lib/element/declaration/constructor.js +13 -11
- package/lib/element/declaration/simpleType.js +4 -4
- package/lib/element/declaration/typePrefix.js +2 -2
- package/lib/element/declaration/variable.js +3 -3
- package/lib/element/deduction.js +11 -9
- package/lib/element/derivation.js +7 -10
- package/lib/element/equivalence.js +10 -10
- package/lib/element/equivalences.js +5 -5
- package/lib/element/frame.js +32 -38
- package/lib/element/hypothesis.js +3 -3
- package/lib/element/judgement.js +6 -4
- package/lib/element/label.js +8 -8
- package/lib/element/metaLemmaMetatheorem.js +5 -5
- package/lib/element/metaType.js +17 -80
- package/lib/element/metavariable.js +34 -34
- package/lib/element/parameter.js +3 -3
- package/lib/element/premise.js +49 -58
- package/lib/element/property.js +9 -9
- package/lib/element/propertyRelation.js +13 -13
- package/lib/element/reference.js +14 -17
- package/lib/element/rule.js +21 -21
- package/lib/element/signature.js +11 -11
- package/lib/element/statement.js +18 -18
- package/lib/element/step.js +83 -55
- package/lib/element/subDerivation.js +7 -10
- package/lib/element/subproof.js +6 -14
- package/lib/element/substitution/frame.js +1 -7
- package/lib/element/substitution/reference.js +2 -3
- package/lib/element/substitution/statement.js +44 -15
- package/lib/element/substitution/term.js +10 -57
- package/lib/element/substitution.js +5 -11
- package/lib/element/substitutions.js +29 -29
- package/lib/element/supposition.js +63 -55
- package/lib/element/term.js +21 -34
- package/lib/element/type.js +47 -60
- package/lib/element/typePrefix.js +5 -5
- package/lib/element/variable.js +9 -9
- package/lib/element.js +9 -3
- package/lib/metaTypes.js +52 -0
- package/lib/node/axiomLemmaTheoremConjecture.js +9 -9
- package/lib/node/body/axiom.js +2 -25
- package/lib/node/body/conjecture.js +2 -25
- package/lib/node/body/lemma.js +2 -25
- package/lib/node/body/metaLemma.js +2 -25
- package/lib/node/body/metatheorem.js +2 -25
- package/lib/node/body/rule.js +15 -1
- package/lib/node/body/theorem.js +2 -25
- package/lib/node/body.js +25 -2
- package/lib/node/combinator.js +11 -2
- package/lib/node/constructor.js +11 -2
- package/lib/node/declaration/combinator.js +5 -5
- package/lib/node/declaration/constructor.js +8 -8
- package/lib/node/declaration/property.js +15 -15
- package/lib/node/declaration/simpleType.js +31 -31
- package/lib/node/declaration/variable.js +8 -8
- package/lib/node/equality.js +8 -8
- package/lib/node/frame.js +20 -20
- package/lib/node/header.js +22 -22
- package/lib/node/metaLemmaMetaTheorem.js +16 -16
- package/lib/node/metavariable.js +15 -15
- package/lib/node/property.js +8 -8
- package/lib/node/propertyRelation.js +8 -8
- package/lib/node/rule.js +16 -16
- package/lib/node/statement.js +12 -12
- package/lib/node/step.js +22 -22
- package/lib/node/subproof.js +8 -8
- package/lib/node/substitution/frame.js +19 -19
- package/lib/node/substitution/statement.js +19 -19
- package/lib/node/substitution/term.js +19 -19
- package/lib/node/term.js +35 -35
- package/lib/preamble.js +5 -5
- package/lib/process/instantiate.js +20 -2
- package/lib/process/unify.js +39 -42
- package/lib/process/validate.js +431 -0
- package/lib/process/verify.js +44 -135
- package/lib/types.js +27 -0
- package/lib/utilities/brackets.js +4 -4
- package/lib/utilities/element.js +91 -55
- package/lib/utilities/instance.js +18 -18
- package/lib/utilities/statement.js +2 -2
- package/lib/utilities/string.js +21 -10
- package/lib/utilities/unification.js +237 -0
- package/lib/utilities/validation.js +251 -0
- package/package.json +6 -6
- package/src/context/file.js +37 -31
- package/src/context/local.js +8 -8
- package/src/context/release.js +9 -6
- package/src/context/temporary.js +11 -11
- package/src/element/assertion/contained.js +19 -20
- package/src/element/assertion/defined.js +11 -12
- package/src/element/assertion/property.js +20 -20
- package/src/element/assertion/satisfies.js +6 -6
- package/src/element/assertion/subproof.js +17 -15
- package/src/element/assertion/type.js +2 -2
- package/src/element/assertion.js +0 -2
- package/src/element/assumption.js +22 -19
- package/src/element/axiom.js +7 -11
- package/src/element/axiomLemmaTheoremConjecture.js +36 -36
- package/src/element/{statement/combinator → combinator}/bracketed.js +7 -7
- package/src/element/combinator.js +90 -0
- package/src/element/conclusion.js +12 -10
- package/src/element/{term/constructor → constructor}/bracketed.js +5 -5
- package/src/element/{term/constructor.js → constructor.js} +17 -25
- package/src/element/declaration/combinator.js +1 -22
- package/src/element/declaration/complexType.js +11 -11
- package/src/element/declaration/constructor.js +13 -10
- package/src/element/declaration/simpleType.js +3 -3
- package/src/element/declaration/typePrefix.js +1 -1
- package/src/element/declaration/variable.js +2 -2
- package/src/element/deduction.js +12 -9
- package/src/element/derivation.js +6 -10
- package/src/element/equivalence.js +8 -8
- package/src/element/equivalences.js +4 -4
- package/src/element/frame.js +28 -30
- package/src/element/hypothesis.js +2 -2
- package/src/element/judgement.js +6 -3
- package/src/element/label.js +4 -4
- package/src/element/metaLemmaMetatheorem.js +4 -3
- package/src/element/metaType.js +9 -45
- package/src/element/metavariable.js +29 -31
- package/src/element/parameter.js +2 -2
- package/src/element/premise.js +55 -62
- package/src/element/property.js +6 -6
- package/src/element/propertyRelation.js +11 -11
- package/src/element/reference.js +12 -21
- package/src/element/rule.js +17 -16
- package/src/element/signature.js +10 -9
- package/src/element/statement.js +16 -18
- package/src/element/step.js +93 -55
- package/src/element/subDerivation.js +6 -10
- package/src/element/subproof.js +4 -12
- package/src/element/substitution/frame.js +0 -2
- package/src/element/substitution/reference.js +1 -5
- package/src/element/substitution/statement.js +44 -14
- package/src/element/substitution/term.js +10 -13
- package/src/element/substitution.js +3 -5
- package/src/element/substitutions.js +48 -30
- package/src/element/supposition.js +88 -70
- package/src/element/term.js +18 -28
- package/src/element/type.js +42 -36
- package/src/element/typePrefix.js +3 -3
- package/src/element/variable.js +7 -7
- package/src/element.js +3 -1
- package/src/metaTypes.js +42 -0
- package/src/node/axiomLemmaTheoremConjecture.js +6 -6
- package/src/node/body/axiom.js +0 -21
- package/src/node/body/conjecture.js +0 -23
- package/src/node/body/lemma.js +0 -23
- package/src/node/body/metaLemma.js +0 -23
- package/src/node/body/metatheorem.js +0 -23
- package/src/node/body/rule.js +12 -0
- package/src/node/body/theorem.js +0 -23
- package/src/node/body.js +23 -0
- package/src/node/combinator.js +9 -0
- package/src/node/constructor.js +9 -0
- package/src/node/declaration/combinator.js +5 -5
- package/src/node/declaration/constructor.js +8 -8
- package/src/node/declaration/property.js +14 -14
- package/src/node/declaration/simpleType.js +31 -31
- package/src/node/declaration/variable.js +7 -7
- package/src/node/equality.js +7 -7
- package/src/node/frame.js +21 -21
- package/src/node/header.js +22 -22
- package/src/node/metaLemmaMetaTheorem.js +14 -14
- package/src/node/metavariable.js +14 -14
- package/src/node/property.js +7 -7
- package/src/node/propertyRelation.js +7 -7
- package/src/node/rule.js +15 -15
- package/src/node/statement.js +12 -12
- package/src/node/step.js +21 -21
- package/src/node/subproof.js +7 -7
- package/src/node/substitution/frame.js +18 -18
- package/src/node/substitution/statement.js +18 -18
- package/src/node/substitution/term.js +18 -18
- package/src/node/term.js +34 -34
- package/src/preamble.js +4 -4
- package/src/process/instantiate.js +12 -0
- package/src/process/unify.js +53 -57
- package/src/process/validate.js +316 -0
- package/src/process/verify.js +50 -138
- package/src/types.js +18 -0
- package/src/utilities/brackets.js +10 -6
- package/src/utilities/element.js +125 -82
- package/src/utilities/instance.js +18 -18
- package/src/utilities/statement.js +2 -2
- package/src/utilities/string.js +34 -20
- package/src/{mixins/step/unify.js → utilities/unification.js} +82 -68
- package/src/{mixins/statement/validate.js → utilities/validation.js} +143 -69
- package/lib/element/statement/combinator.js +0 -105
- package/lib/element/term/constructor.js +0 -172
- package/lib/mixins/statement/validate.js +0 -198
- package/lib/mixins/step/unify.js +0 -228
- package/lib/mixins/term/verify.js +0 -65
- package/src/element/statement/combinator.js +0 -59
- package/src/mixins/term/verify.js +0 -81
package/src/process/unify.js
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import elements from "../elements";
|
|
4
|
-
|
|
5
3
|
import { nodeQuery } from "../utilities/query";
|
|
4
|
+
import { termFromTermNode, frameFromFrameNode, statementFromStatementNode } from "../utilities/element";
|
|
6
5
|
import { terminalNodeMapFromNodes, areTerminalNodeMapsEqual, isLastRemainingArgumentFunction } from "../utilities/pass";
|
|
7
6
|
|
|
8
7
|
const nonTerminalNodeQuery = nodeQuery("/*");
|
|
@@ -29,7 +28,7 @@ class Pass {
|
|
|
29
28
|
}
|
|
30
29
|
|
|
31
30
|
descend(generalChildNodes, specificChildNodes, ...remainingArguments) {
|
|
32
|
-
let
|
|
31
|
+
let descended = false;
|
|
33
32
|
|
|
34
33
|
const generalChildNodesLength = generalChildNodes.length,
|
|
35
34
|
specificChildNodesLength = specificChildNodes.length;
|
|
@@ -43,9 +42,12 @@ class Pass {
|
|
|
43
42
|
const lastRemainingArgumentFunction = isLastRemainingArgumentFunction(remainingArguments);
|
|
44
43
|
|
|
45
44
|
if (lastRemainingArgumentFunction) {
|
|
46
|
-
const index = 0
|
|
45
|
+
const index = 0,
|
|
46
|
+
descendedAhead = this.descendAhead(index, generalChildNodes, specificChildNodes,...remainingArguments);
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
if (descendedAhead) {
|
|
49
|
+
descended = true;
|
|
50
|
+
}
|
|
49
51
|
} else {
|
|
50
52
|
const visited = generalChildNodes.every((generalChildNode, index) => {
|
|
51
53
|
const specificChildNode = specificChildNodes[index],
|
|
@@ -59,13 +61,13 @@ class Pass {
|
|
|
59
61
|
});
|
|
60
62
|
|
|
61
63
|
if (visited) {
|
|
62
|
-
|
|
64
|
+
descended = true;
|
|
63
65
|
}
|
|
64
66
|
}
|
|
65
67
|
}
|
|
66
68
|
}
|
|
67
69
|
|
|
68
|
-
return
|
|
70
|
+
return descended;
|
|
69
71
|
}
|
|
70
72
|
|
|
71
73
|
descendAhead(index, generalChildNodes, specificChildNodes, ...remainingArguments) {
|
|
@@ -346,11 +348,10 @@ class CombinatorPass extends Pass {
|
|
|
346
348
|
|
|
347
349
|
context = specificContext; ///
|
|
348
350
|
|
|
349
|
-
const
|
|
350
|
-
|
|
351
|
-
statementVerifiesGivenType = statement.verifyGivenMetaType(metaType, assignments, stated, context);
|
|
351
|
+
const statement = statementFromStatementNode(statementNode, context),
|
|
352
|
+
statementValidatesGivenType = statement.validateGivenMetaType(metaType, assignments, stated, context);
|
|
352
353
|
|
|
353
|
-
if (
|
|
354
|
+
if (statementValidatesGivenType) {
|
|
354
355
|
success = true;
|
|
355
356
|
}
|
|
356
357
|
|
|
@@ -375,11 +376,10 @@ class CombinatorPass extends Pass {
|
|
|
375
376
|
|
|
376
377
|
context = specificContext; ///
|
|
377
378
|
|
|
378
|
-
const
|
|
379
|
-
|
|
380
|
-
frameVerifiesGivenType = frame.verifyGivenMetaType(metaType, assignments, stated, context);
|
|
379
|
+
const frame = frameFromFrameNode(frameNode, context),
|
|
380
|
+
frameValidatesGivenMetaType = frame.validateGivenMetaType(metaType, assignments, stated, context);
|
|
381
381
|
|
|
382
|
-
if (
|
|
382
|
+
if (frameValidatesGivenMetaType) {
|
|
383
383
|
success = true;
|
|
384
384
|
}
|
|
385
385
|
|
|
@@ -405,11 +405,10 @@ class CombinatorPass extends Pass {
|
|
|
405
405
|
if (type !== null) {
|
|
406
406
|
context = specificContext; ///
|
|
407
407
|
|
|
408
|
-
const
|
|
409
|
-
|
|
410
|
-
termVerifiesGivenType = term.verifyGivenType(type, generalContext, specificContext);
|
|
408
|
+
const term = termFromTermNode(termNode, context),
|
|
409
|
+
termValidatesGivenType = term.validateGivenType(type, generalContext, specificContext);
|
|
411
410
|
|
|
412
|
-
if (
|
|
411
|
+
if (termValidatesGivenType) {
|
|
413
412
|
success = true;
|
|
414
413
|
}
|
|
415
414
|
}
|
|
@@ -441,11 +440,10 @@ class ConstructorPass extends Pass {
|
|
|
441
440
|
if (type !== null) {
|
|
442
441
|
context = specificContext; ///
|
|
443
442
|
|
|
444
|
-
const
|
|
445
|
-
|
|
446
|
-
termVerifiesGivenType = term.verifyGivenType(type, generalContext, specificContext);
|
|
443
|
+
const term = termFromTermNode(termNode, context),
|
|
444
|
+
termValidatesGivenType = term.validateGivenType(type, generalContext, specificContext);
|
|
447
445
|
|
|
448
|
-
if (
|
|
446
|
+
if (termValidatesGivenType) {
|
|
449
447
|
success = true;
|
|
450
448
|
}
|
|
451
449
|
}
|
|
@@ -470,9 +468,9 @@ class MetavariablePass extends Pass {
|
|
|
470
468
|
type = generalContext.findTypeByNominalTypeName(nominalTypeName),
|
|
471
469
|
context = specificContext, ///
|
|
472
470
|
term = context.findTermByTermNode(termNode),
|
|
473
|
-
|
|
471
|
+
termValidatesGivenType = term.validateGivenType(type, generalContext, specificContext);
|
|
474
472
|
|
|
475
|
-
if (
|
|
473
|
+
if (termValidatesGivenType) {
|
|
476
474
|
success = true;
|
|
477
475
|
}
|
|
478
476
|
|
|
@@ -567,6 +565,21 @@ export function unifyMetavariable(generalMetavariable, specificMetavariable, gen
|
|
|
567
565
|
return metavariableUnifies;
|
|
568
566
|
}
|
|
569
567
|
|
|
568
|
+
export function unifyTermWithConstructor(term, constructor, generalContext, specificContext) {
|
|
569
|
+
let termUnifiesWithConstructor = false;
|
|
570
|
+
|
|
571
|
+
const termNode = term.getNode(),
|
|
572
|
+
constructorTerm = constructor.getTerm(),
|
|
573
|
+
constructorTermNode = constructorTerm.getNode(),
|
|
574
|
+
success = constructorPass.run(constructorTermNode, termNode, generalContext, specificContext);
|
|
575
|
+
|
|
576
|
+
if (success) {
|
|
577
|
+
termUnifiesWithConstructor = true;
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
return termUnifiesWithConstructor;
|
|
581
|
+
}
|
|
582
|
+
|
|
570
583
|
export function unifyStatementIntrinsically(generalStatement, specificStatement, substitutions, generalContext, specificContext) {
|
|
571
584
|
let statementUnifiesIntrinsically = false;
|
|
572
585
|
|
|
@@ -583,6 +596,21 @@ export function unifyStatementIntrinsically(generalStatement, specificStatement,
|
|
|
583
596
|
return statementUnifiesIntrinsically;
|
|
584
597
|
}
|
|
585
598
|
|
|
599
|
+
export function unifyStatementWithCombinator(statement, combinator, assignments, stated, generalContext, specificContext) {
|
|
600
|
+
let statementUnifiesWithCombinator = false;
|
|
601
|
+
|
|
602
|
+
const statementNode = statement.getNode(),
|
|
603
|
+
combinatorStatement = combinator.getStatement(),
|
|
604
|
+
combinatorStatementNode = combinatorStatement.getNode(),
|
|
605
|
+
success = combinatorPass.run(combinatorStatementNode, statementNode, assignments, stated, generalContext, specificContext);
|
|
606
|
+
|
|
607
|
+
if (success) {
|
|
608
|
+
statementUnifiesWithCombinator = true;
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
return statementUnifiesWithCombinator;
|
|
612
|
+
}
|
|
613
|
+
|
|
586
614
|
export function unifyMetavariableIntrinsically(generalMetavariable, specificMetavariable, substitutions, generalContext, specificContext) {
|
|
587
615
|
let metavariableUnifiesIntrinsically = false;
|
|
588
616
|
|
|
@@ -598,35 +626,3 @@ export function unifyMetavariableIntrinsically(generalMetavariable, specificMeta
|
|
|
598
626
|
|
|
599
627
|
return metavariableUnifiesIntrinsically;
|
|
600
628
|
}
|
|
601
|
-
|
|
602
|
-
export function unifyTermWithConstructorTerm(term, constructorTerm, context) {
|
|
603
|
-
let termUnifiesWithConstructor = false;
|
|
604
|
-
|
|
605
|
-
const termNode = term.getNode(),
|
|
606
|
-
generalContext = context, ///
|
|
607
|
-
specificContext = context, ///
|
|
608
|
-
constructorTermNode = constructorTerm.getNode(),
|
|
609
|
-
success = constructorPass.run(constructorTermNode, termNode, generalContext, specificContext);
|
|
610
|
-
|
|
611
|
-
if (success) {
|
|
612
|
-
termUnifiesWithConstructor = true;
|
|
613
|
-
}
|
|
614
|
-
|
|
615
|
-
return termUnifiesWithConstructor;
|
|
616
|
-
}
|
|
617
|
-
|
|
618
|
-
export function unifyStatementWithCombinatorStatement(statement, combinatorStatement, assignments, stated, context) {
|
|
619
|
-
let statementUnifiesWithCombinator = false;
|
|
620
|
-
|
|
621
|
-
const statementNode = statement.getNode(),
|
|
622
|
-
generalContext = context, ///
|
|
623
|
-
specificContext = context, ///
|
|
624
|
-
combinatorStatementNode = combinatorStatement.getNode(),
|
|
625
|
-
success = combinatorPass.run(combinatorStatementNode, statementNode, assignments, stated, generalContext, specificContext);
|
|
626
|
-
|
|
627
|
-
if (success) {
|
|
628
|
-
statementUnifiesWithCombinator = true;
|
|
629
|
-
}
|
|
630
|
-
|
|
631
|
-
return statementUnifiesWithCombinator;
|
|
632
|
-
}
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { nodeQuery } from "../utilities/query";
|
|
4
|
+
import { isLastRemainingArgumentFunction } from "../utilities/pass";
|
|
5
|
+
import { termFromTermNode, statementFromStatementNode } from "../utilities/element";
|
|
6
|
+
|
|
7
|
+
const nonTerminalNodeQuery = nodeQuery("/*");
|
|
8
|
+
|
|
9
|
+
const termNodeQuery = nodeQuery("/term"),
|
|
10
|
+
typeNodeQuery = nodeQuery("/type"),
|
|
11
|
+
statementNodeQuery = nodeQuery("/statement");
|
|
12
|
+
|
|
13
|
+
class Pass {
|
|
14
|
+
run(node, ...remainingArguments) {
|
|
15
|
+
let success;
|
|
16
|
+
|
|
17
|
+
const visited = this.visitNode(node, ...remainingArguments);
|
|
18
|
+
|
|
19
|
+
success = visited; ///
|
|
20
|
+
|
|
21
|
+
return success;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
descend(childNodes, ...remainingArguments) {
|
|
25
|
+
let descended = false;
|
|
26
|
+
|
|
27
|
+
const lastRemainingArgumentFunction = isLastRemainingArgumentFunction(remainingArguments);
|
|
28
|
+
|
|
29
|
+
if (lastRemainingArgumentFunction) {
|
|
30
|
+
const index = 0;
|
|
31
|
+
|
|
32
|
+
descended = this.descendAhead(index, childNodes, ...remainingArguments); ///
|
|
33
|
+
} else {
|
|
34
|
+
const visited = childNodes.every((childNode) => {
|
|
35
|
+
const node = childNode, ///
|
|
36
|
+
visited = this.visitNode(node, ...remainingArguments);
|
|
37
|
+
|
|
38
|
+
if (visited) {
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
if (visited) {
|
|
44
|
+
descended = true;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return descended;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
descendAhead(index, childNodes, ...remainingArguments) {
|
|
52
|
+
let descendedAhead = false;
|
|
53
|
+
|
|
54
|
+
const descendAhead = remainingArguments.pop(), ///
|
|
55
|
+
childNodesLength = childNodes.length;
|
|
56
|
+
|
|
57
|
+
if (index === childNodesLength) {
|
|
58
|
+
descendedAhead = descendAhead();
|
|
59
|
+
} else {
|
|
60
|
+
const childNode = childNodes[index],
|
|
61
|
+
node = childNode, ///
|
|
62
|
+
visited = this.visitNode(node, ...remainingArguments, () => {
|
|
63
|
+
remainingArguments.push(descendAhead);
|
|
64
|
+
|
|
65
|
+
const aheadIndex = index + 1,
|
|
66
|
+
descendedAhead = this.descendAhead(aheadIndex, childNodes, ...remainingArguments);
|
|
67
|
+
|
|
68
|
+
return descendedAhead;
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
if (visited) {
|
|
72
|
+
descendedAhead = true;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return descendedAhead;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
visitNode(node, ...remainingArguments) {
|
|
80
|
+
let visited;
|
|
81
|
+
|
|
82
|
+
const nodeTerminalNode = node.isTerminalNode();
|
|
83
|
+
|
|
84
|
+
if (nodeTerminalNode) {
|
|
85
|
+
const terminalNode = node; ///
|
|
86
|
+
|
|
87
|
+
visited = this.visitTerminalNode(terminalNode, ...remainingArguments);
|
|
88
|
+
} else {
|
|
89
|
+
const nonTerminalNode = node; ///
|
|
90
|
+
|
|
91
|
+
visited = this.visitNonTerminalNode(nonTerminalNode, ...remainingArguments);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return visited;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
visitTerminalNode(terminalNode, ...remainingArguments) {
|
|
98
|
+
let visited = false;
|
|
99
|
+
|
|
100
|
+
const lastRemainingArgumentFunction = isLastRemainingArgumentFunction(remainingArguments);
|
|
101
|
+
|
|
102
|
+
if (lastRemainingArgumentFunction) {
|
|
103
|
+
const descendAhead = remainingArguments.pop(), ///
|
|
104
|
+
descendedAhead = descendAhead();
|
|
105
|
+
|
|
106
|
+
if (descendedAhead) {
|
|
107
|
+
visited = true;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
remainingArguments.push(descendAhead);
|
|
111
|
+
} else {
|
|
112
|
+
visited = true;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return visited;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
visitNonTerminalNode(nonTerminalNode, ...remainingArguments) {
|
|
119
|
+
let visited = false;
|
|
120
|
+
|
|
121
|
+
let { maps } = this.constructor;
|
|
122
|
+
|
|
123
|
+
maps = [ ///
|
|
124
|
+
...maps,
|
|
125
|
+
{
|
|
126
|
+
nodeQuery: nonTerminalNodeQuery,
|
|
127
|
+
run: (node, ...remainingArguments) => {
|
|
128
|
+
let visited = false;
|
|
129
|
+
|
|
130
|
+
const childNodes = nonTerminalNode.getChildNodes(), ///
|
|
131
|
+
descended = this.descend(childNodes, ...remainingArguments);
|
|
132
|
+
|
|
133
|
+
if (descended) {
|
|
134
|
+
visited = true;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return visited;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
]
|
|
141
|
+
|
|
142
|
+
maps.some((map) => {
|
|
143
|
+
const { nodeQuery, run } = map;
|
|
144
|
+
|
|
145
|
+
const node = nodeQuery(nonTerminalNode);
|
|
146
|
+
|
|
147
|
+
if (node !== null) {
|
|
148
|
+
const success = run(node, ...remainingArguments);
|
|
149
|
+
|
|
150
|
+
visited = success;
|
|
151
|
+
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
return visited;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
class TermPass extends Pass {
|
|
161
|
+
run(statementNode, context) {
|
|
162
|
+
let success = false;
|
|
163
|
+
|
|
164
|
+
const nonTerminalNode = statementNode, ///
|
|
165
|
+
childNodes = nonTerminalNode.getChildNodes(), ///
|
|
166
|
+
descended = this.descend(childNodes,context);
|
|
167
|
+
|
|
168
|
+
if (descended) {
|
|
169
|
+
success = true;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
return success;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
static maps = [
|
|
176
|
+
{
|
|
177
|
+
nodeQuery: termNodeQuery,
|
|
178
|
+
run: (termNode, context, validateAhead) => {
|
|
179
|
+
let success = false;
|
|
180
|
+
|
|
181
|
+
const term = termFromTermNode(termNode, context),
|
|
182
|
+
termValidates = term.validate(context, validateAhead);
|
|
183
|
+
|
|
184
|
+
if (termValidates) {
|
|
185
|
+
success = true;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
return success;
|
|
189
|
+
}
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
nodeQuery: typeNodeQuery,
|
|
193
|
+
run: (typeNode, context, validateAhead) => {
|
|
194
|
+
let success = false;
|
|
195
|
+
|
|
196
|
+
const nominalTypeName = typeNode.getNominalTypeName(),
|
|
197
|
+
typePresent = context.isTypePresentByNominalTypeName(nominalTypeName);
|
|
198
|
+
|
|
199
|
+
if (typePresent) {
|
|
200
|
+
const verifiesAhead = validateAhead();
|
|
201
|
+
|
|
202
|
+
if (verifiesAhead) {
|
|
203
|
+
success = true;
|
|
204
|
+
}
|
|
205
|
+
} else {
|
|
206
|
+
const typeString = nominalTypeName; ///
|
|
207
|
+
|
|
208
|
+
context.debug(`The '${typeString}' type is not present.`);
|
|
209
|
+
|
|
210
|
+
success = false;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
return success;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
];
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
class StatementPass extends Pass {
|
|
220
|
+
run(statementNode, context) {
|
|
221
|
+
let success = false;
|
|
222
|
+
|
|
223
|
+
const nonTerminalNode = statementNode, ///
|
|
224
|
+
childNodes = nonTerminalNode.getChildNodes(), ///
|
|
225
|
+
descended = this.descend(childNodes,context);
|
|
226
|
+
|
|
227
|
+
if (descended) {
|
|
228
|
+
success = true;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
return success;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
static maps = [
|
|
235
|
+
{
|
|
236
|
+
nodeQuery: statementNodeQuery,
|
|
237
|
+
run: (statementNode, context) => {
|
|
238
|
+
let success = false;
|
|
239
|
+
|
|
240
|
+
const statement = statementFromStatementNode(statementNode, context),
|
|
241
|
+
assignments = null,
|
|
242
|
+
stated = false,
|
|
243
|
+
statementValidates = statement.validate(assignments, stated, context);
|
|
244
|
+
|
|
245
|
+
if (statementValidates) {
|
|
246
|
+
success = true;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
return success;
|
|
250
|
+
}
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
nodeQuery: termNodeQuery,
|
|
254
|
+
run: (termNode, context) => {
|
|
255
|
+
let success = false;
|
|
256
|
+
|
|
257
|
+
const term = termFromTermNode(termNode, context),
|
|
258
|
+
termValidates = term.validate(context, () => {
|
|
259
|
+
const verifiesAhead = true;
|
|
260
|
+
|
|
261
|
+
return verifiesAhead;
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
if (termValidates) {
|
|
265
|
+
success = true;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
return success;
|
|
269
|
+
}
|
|
270
|
+
},
|
|
271
|
+
{
|
|
272
|
+
nodeQuery: typeNodeQuery,
|
|
273
|
+
run: (typeNode, context) => {
|
|
274
|
+
let success = false;
|
|
275
|
+
|
|
276
|
+
const nominalTypeName = typeNode.getNominalTypeName(),
|
|
277
|
+
typePresent = context.isTypePresentByNominalTypeName(nominalTypeName);
|
|
278
|
+
|
|
279
|
+
if (typePresent) {
|
|
280
|
+
success = true;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
return success;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
];
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
const termPass = new TermPass(),
|
|
290
|
+
statementPass = new StatementPass();
|
|
291
|
+
|
|
292
|
+
export function validateTerm(termNode, context) {
|
|
293
|
+
let termValidates = false;
|
|
294
|
+
|
|
295
|
+
const node = termNode, ///
|
|
296
|
+
sucess = termPass.run(node, context);
|
|
297
|
+
|
|
298
|
+
if (sucess) {
|
|
299
|
+
termValidates = true;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
return termValidates;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
export function validateStatement(statementNode, context) {
|
|
306
|
+
let statementValidates = false;
|
|
307
|
+
|
|
308
|
+
const node = statementNode, ///
|
|
309
|
+
sucess = statementPass.run(node, context);
|
|
310
|
+
|
|
311
|
+
if (sucess) {
|
|
312
|
+
statementValidates = true;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
return statementValidates;
|
|
316
|
+
}
|