occam-verify-cli 0.0.269 → 0.0.271

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/premise.js CHANGED
@@ -2,8 +2,14 @@
2
2
 
3
3
  const MetaSubstitution = require("./metaSubstitution");
4
4
 
5
- const { METAVARIABLE_RULE_NAME } = require("./ruleNames"),
6
- { metavariableNameFromMetavariableNode } = require("./utilities/query");
5
+ const { first, second } = require("./utilities/array"),
6
+ { nodeQuery, nodesQuery } = require("./utilities/query"),
7
+ { metavariableNameFromMetavariableNode } = require("./utilities/query"),
8
+ { METAVARIABLE_RULE_NAME, METASTATEMENT_RULE_NAME } = require("./ruleNames");
9
+
10
+ const metastatementNodesQuery = nodesQuery("/metaSubproofAssertion/metastatement"),
11
+ metaSubproofAssertionNodeQuery = nodeQuery("/metastatement/metaSubproofAssertion!"),
12
+ qualifiedOrUnqualifiedMetastatementMetastatementNodesQuery = nodesQuery("/metaSubproof/qualifiedMetastatement|unqualifiedMetastatement/metastatement!");
7
13
 
8
14
  class Premise {
9
15
  constructor(metastatementNode) {
@@ -14,12 +20,43 @@ class Premise {
14
20
  return this.metastatementNode;
15
21
  }
16
22
 
17
- matchNonTerminalNode(nonTerminalNode, metaSubstitutions) {
18
- const premiseNonTerminalNode = this.metastatementNode, ///
23
+ matchMetaSubproofNode(metaSubproofNode, metaSubstitutions) {
24
+ let metaSubproofNodeMatches = false;
25
+
26
+ const metaSubproofAssertionNode = metaSubproofAssertionNodeQuery(this.metastatementNode);
27
+
28
+ if (metaSubproofAssertionNode !== null) {
29
+ const metaSubproofAssertionMetastatementNodes = metastatementNodesQuery(metaSubproofAssertionNode),
30
+ firstMetaSubproofAssertionMetastatementNode = first(metaSubproofAssertionMetastatementNodes),
31
+ qualifiedOrUnqualifiedMetastatementMetastatementNodes = qualifiedOrUnqualifiedMetastatementMetastatementNodesQuery(metaSubproofNode),
32
+ firstQualifiedOrUnqualifiedMetastatementMetastatementNode = first(qualifiedOrUnqualifiedMetastatementMetastatementNodes);
33
+
34
+ const nonTerminalNode = firstQualifiedOrUnqualifiedMetastatementMetastatementNode, ///
35
+ premiseNonTerminalNode = firstMetaSubproofAssertionMetastatementNode, ///
36
+ premiseNonTerminalNodeMatches = matchPremiseNonTerminalNode(premiseNonTerminalNode, nonTerminalNode, metaSubstitutions);
37
+
38
+ if (premiseNonTerminalNodeMatches) {
39
+ const secondMetaSubproofAssertionMetastatementNode = second(metaSubproofAssertionMetastatementNodes),
40
+ secondQualifiedOrUnqualifiedMetastatementMetastatementNode = second(qualifiedOrUnqualifiedMetastatementMetastatementNodes);
41
+
42
+ const nonTerminalNode = secondQualifiedOrUnqualifiedMetastatementMetastatementNode, ///
43
+ premiseNonTerminalNode = secondMetaSubproofAssertionMetastatementNode, ///
44
+ premiseNonTerminalNodeMatches = matchPremiseNonTerminalNode(premiseNonTerminalNode, nonTerminalNode, metaSubstitutions);
45
+
46
+ metaSubproofNodeMatches = premiseNonTerminalNodeMatches; ///
47
+ }
48
+ }
49
+
50
+ return metaSubproofNodeMatches;
51
+ }
52
+
53
+ matchMetastatementNode(metastatementNode, metaSubstitutions) {
54
+ const nonTerminalNode = metastatementNode, ///
55
+ premiseNonTerminalNode = this.metastatementNode, ///
19
56
  premiseNonTerminalNodeMatches = matchPremiseNonTerminalNode(premiseNonTerminalNode, nonTerminalNode, metaSubstitutions),
20
- nonTerminalNodeMatches = premiseNonTerminalNodeMatches; ///
57
+ metastatementNodeMatches = premiseNonTerminalNodeMatches; ///
21
58
 
22
- return nonTerminalNodeMatches;
59
+ return metastatementNodeMatches;
23
60
  }
24
61
 
25
62
  static fromMetastatementNode(metastatementNode) {
@@ -56,47 +93,45 @@ function matchPremiseNode(premiseNode, node, metaSubstitutions) {
56
93
  return premiseNodeMatches;
57
94
  }
58
95
 
59
- function matchPremiseChildNodes(premiseChildNodes, childNodes, metaSubstitutions) {
60
- let premiseChildNodesMatches = false;
96
+ function matchPremiseNodes(premiseNodes, nodes, metaSubstitutions) {
97
+ let premiseNodesMatches = false;
61
98
 
62
- const childNodesLength = childNodes.length,
63
- premiseChildNodesLength = premiseChildNodes.length;
99
+ const nodesLength = nodes.length,
100
+ premiseNodesLength = premiseNodes.length;
64
101
 
65
- if (childNodesLength === premiseChildNodesLength) {
66
- premiseChildNodesMatches = childNodes.every((childNode, index) => {
67
- const premiseChildNode = premiseChildNodes[index],
68
- premiseNode = premiseChildNode, ///
69
- node = childNode, ///
102
+ if (nodesLength === premiseNodesLength) {
103
+ premiseNodesMatches = nodes.every((node, index) => {
104
+ const premiseNode = premiseNodes[index],
70
105
  premiseNodeMatches = matchPremiseNode(premiseNode, node, metaSubstitutions);
71
106
 
72
107
  if (premiseNodeMatches) {
73
108
  return true;
74
109
  }
75
- })
110
+ });
76
111
  }
77
112
 
78
- return premiseChildNodesMatches;
113
+ return premiseNodesMatches;
79
114
  }
80
115
 
81
- function matchPremiseMetavariable(premiseMetavariableNode, nonTerminalNode, metaSubstitutions) {
116
+ function matchPremiseMetavariable(premiseMetavariableNode, nodes, metaSubstitutions) {
82
117
  let premiseMetavariableMatches;
83
118
 
84
119
  const premiseMetavariableName = metavariableNameFromMetavariableNode(premiseMetavariableNode),
85
120
  metaSubstitution = metaSubstitutions.find((metaSubstitution) => {
86
- const metavariableName = metaSubstitution.getMetavariableName();
121
+ const metavariableName = metaSubstitution.getMetavariableName();
87
122
 
88
- if (metavariableName === premiseMetavariableName) {
89
- return true;
90
- }
91
- }) || null;
123
+ if (metavariableName === premiseMetavariableName) {
124
+ return true;
125
+ }
126
+ }) || null;
92
127
 
93
128
  if (metaSubstitution !== null) {
94
- const nonTerminalNodeMatches = metaSubstitution.matchNonTerminalNode(nonTerminalNode);
129
+ const metaSubstitutionNodesMatch = metaSubstitution.matchNodes(nodes);
95
130
 
96
- premiseMetavariableMatches = nonTerminalNodeMatches; ///
131
+ premiseMetavariableMatches = metaSubstitutionNodesMatch; ///
97
132
  } else {
98
133
  const metavariableName = premiseMetavariableName, ///
99
- metaSubstitution = MetaSubstitution.fromMetavariableNameAndNonTerminalNode(metavariableName, nonTerminalNode);
134
+ metaSubstitution = MetaSubstitution.fromMetavariableNameAndNodes(metavariableName, nodes);
100
135
 
101
136
  metaSubstitutions.push(metaSubstitution);
102
137
 
@@ -107,13 +142,8 @@ function matchPremiseMetavariable(premiseMetavariableNode, nonTerminalNode, meta
107
142
  }
108
143
 
109
144
  function matchPremiseTerminalNode(premiseTerminalNode, terminalNode, metaSubstitutions) {
110
- let premiseTerminalNodeMatches = false;
111
-
112
- const matches = premiseTerminalNode.match(terminalNode);
113
-
114
- if (matches) {
115
- premiseTerminalNodeMatches = true;
116
- }
145
+ const matches = premiseTerminalNode.match(terminalNode),
146
+ premiseTerminalNodeMatches = matches;
117
147
 
118
148
  return premiseTerminalNodeMatches;
119
149
  }
@@ -121,30 +151,62 @@ function matchPremiseTerminalNode(premiseTerminalNode, terminalNode, metaSubstit
121
151
  function matchPremiseNonTerminalNode(premiseNonTerminalNode, nonTerminalNode, metaSubstitutions) {
122
152
  let premiseNonTerminalNodeMatches = false;
123
153
 
124
- const premiseRuleName = premiseNonTerminalNode.getRuleName(); ///
154
+ const ruleName = nonTerminalNode.getRuleName(),
155
+ premiseRuleName = premiseNonTerminalNode.getRuleName(); ///
156
+
157
+ if (ruleName === premiseRuleName) {
158
+ const childNodes = nonTerminalNode.getChildNodes(),
159
+ premiseChildNodes = premiseNonTerminalNode.getChildNodes(),
160
+ nodes = childNodes, ///
161
+ premiseNodes = premiseChildNodes, ///
162
+ premiseChildNodesMatches = matchPremiseNodes(premiseNodes, nodes, metaSubstitutions);
163
+
164
+ premiseNonTerminalNodeMatches = premiseChildNodesMatches; ///
125
165
 
126
- switch (premiseRuleName) {
127
- case METAVARIABLE_RULE_NAME: {
128
- const premiseMetavariableNode = premiseNonTerminalNode, ///
129
- premiseMetavariableMatches = matchPremiseMetavariable(premiseMetavariableNode, nonTerminalNode, metaSubstitutions);
166
+ if (!premiseNonTerminalNodeMatches) {
167
+ const ruleNameMetastatementRuleName = (ruleName === METASTATEMENT_RULE_NAME);
130
168
 
131
- premiseNonTerminalNodeMatches = premiseMetavariableMatches;
169
+ if (ruleNameMetastatementRuleName) {
170
+ const metastatementNode = nonTerminalNode, ///
171
+ premiseMetastatementNode = premiseNonTerminalNode, ///
172
+ premiseMetastatementNodeMatches = matchPremiseMetastatementNode(premiseMetastatementNode, metastatementNode, metaSubstitutions);
132
173
 
133
- break;
174
+ premiseNonTerminalNodeMatches = premiseMetastatementNodeMatches; ///
175
+ }
134
176
  }
177
+ }
135
178
 
136
- default: {
137
- const ruleName = nonTerminalNode.getRuleName();
179
+ return premiseNonTerminalNodeMatches;
180
+ }
181
+
182
+ function matchPremiseMetastatementNode(premiseMetastatementNode, metastatementNode, metaSubstitutions) {
183
+ let premiseMetastatementNodeMatches = false;
184
+
185
+ const premiseNonTerminalNode = premiseMetastatementNode, ///
186
+ premiseChildNodes = premiseNonTerminalNode.getChildNodes(),
187
+ premiseChildNodesLength = premiseChildNodes.length;
138
188
 
139
- if (ruleName === premiseRuleName) {
140
- const childNodes = nonTerminalNode.getChildNodes(),
141
- premiseChildNodes = premiseNonTerminalNode.getChildNodes(),
142
- premiseChildNodesMatches = matchPremiseChildNodes(premiseChildNodes, childNodes, metaSubstitutions);
189
+ if (premiseChildNodesLength === 1) {
190
+ const firstPremiseChildNode = first(premiseChildNodes),
191
+ premiseChildNode = firstPremiseChildNode, ///
192
+ premiseChildNodeNonTerminalNode = premiseChildNode.isNonTerminalNode();
143
193
 
144
- premiseNonTerminalNodeMatches = premiseChildNodesMatches; ///
194
+ if (premiseChildNodeNonTerminalNode) {
195
+ const premiseNonTerminalChildNode = premiseChildNode, ///
196
+ premiseNonTerminalChildNodeRuleName = premiseNonTerminalChildNode.getRuleName(),
197
+ premiseNonTerminalChildNodeRuleNameMetavariableRuleName = (premiseNonTerminalChildNodeRuleName === METAVARIABLE_RULE_NAME);
198
+
199
+ if (premiseNonTerminalChildNodeRuleNameMetavariableRuleName) {
200
+ const premiseMetavariableNode = premiseNonTerminalChildNode, ///
201
+ nonTerminalNode = metastatementNode, ///
202
+ childNodes = nonTerminalNode.getChildNodes(),
203
+ nodes = childNodes, ///
204
+ premiseMetaVariableMatches = matchPremiseMetavariable(premiseMetavariableNode, nodes, metaSubstitutions);
205
+
206
+ premiseMetastatementNodeMatches = premiseMetaVariableMatches; ///
145
207
  }
146
208
  }
147
209
  }
148
210
 
149
- return premiseNonTerminalNodeMatches;
211
+ return premiseMetastatementNodeMatches;
150
212
  }
package/bin/rule.js CHANGED
@@ -1,7 +1,8 @@
1
1
  "use strict";
2
2
 
3
- const { labelsAsString } = require("./utilities/string"),
4
- { prune, someCombination } = require("./utilities/array");
3
+ const { prune } = require("./utilities/array"),
4
+ { someSubArray } = require("./utilities/array"),
5
+ { labelsAsString } = require("./utilities/string");
5
6
 
6
7
  class Rule {
7
8
  constructor(labels, premises, conclusion) {
@@ -23,20 +24,15 @@ class Rule {
23
24
  }
24
25
 
25
26
  matchMetastatement(metastatementNode, context) {
26
- let metastatementNodes = context.getMetastatementNodes();
27
+ const metaAssertions = context.getMetaAssertions(),
28
+ premisesLength = this.premises.length,
29
+ matchesMetastatement = someSubArray(metaAssertions, premisesLength, (metaAssertions) => {
30
+ const premisesMatchConclusion = matchPremisesAndConclusion(this.premises, this.conclusion, metaAssertions, metastatementNode);
27
31
 
28
- const premisesLength = this.premises.length,
29
- start = -premisesLength;
30
-
31
- metastatementNodes = metastatementNodes.slice(start); ///
32
-
33
- const matchesMetastatement = someCombination(metastatementNodes, (metastatementNodes) => {
34
- const premisesMatchConclusion = matchPremisesAndConclusion(this.premises, this.conclusion, metastatementNodes, metastatementNode);
35
-
36
- if (premisesMatchConclusion) {
37
- return true;
38
- }
39
- });
32
+ if (premisesMatchConclusion) {
33
+ return true;
34
+ }
35
+ });
40
36
 
41
37
  return matchesMetastatement;
42
38
  }
@@ -56,24 +52,37 @@ class Rule {
56
52
 
57
53
  module.exports = Rule;
58
54
 
59
- function matchPremise(premise, metastatementNodes, metaSubstitutions) {
60
- const metastatementNode = prune(metastatementNodes, (metastatementNode) => {
61
- const nonTerminalNode = metastatementNode, ///
62
- nonTerminalNodeMatches = premise.matchNonTerminalNode(nonTerminalNode, metaSubstitutions);
55
+ function matchPremise(premise, metaAssertions, metaSubstitutions) {
56
+ const metaAssertion = prune(metaAssertions, (metaAssertion) => {
57
+ const metaSubproofNode = metaAssertion.getMetaSubproofNode(),
58
+ metastatementNode = metaAssertion.getMetastatementNode()
63
59
 
64
- if (!nonTerminalNodeMatches) { ///
65
- return true;
60
+ if (metaSubproofNode !== null) {
61
+ const metaSubProofMatches = premise.matchMetaSubproofNode(metaSubproofNode, metaSubstitutions);
62
+
63
+ if (!metaSubProofMatches) { ///
64
+ return true;
65
+ }
66
66
  }
67
+
68
+ if (metastatementNode !== null) {
69
+ const metastatementMatches = premise.matchMetastatementNode(metastatementNode, metaSubstitutions);
70
+
71
+ if (!metastatementMatches) { ///
72
+ return true;
73
+ }
74
+ }
75
+
67
76
  }) || null;
68
77
 
69
- const premiseMatches = (metastatementNode !== null);
78
+ const premiseMatches = (metaAssertion !== null);
70
79
 
71
80
  return premiseMatches;
72
81
  }
73
82
 
74
- function matchPremises(premise, metastatementNodes, metaSubstitutions) {
83
+ function matchPremises(premise, metaAssertions, metaSubstitutions) {
75
84
  const premisesMatches = premise.every((premise) => {
76
- const premiseMatches = matchPremise(premise, metastatementNodes, metaSubstitutions);
85
+ const premiseMatches = matchPremise(premise, metaAssertions, metaSubstitutions);
77
86
 
78
87
  if (premiseMatches) {
79
88
  return true;
@@ -84,18 +93,17 @@ function matchPremises(premise, metastatementNodes, metaSubstitutions) {
84
93
  }
85
94
 
86
95
  function matchConclusion(conclusion, metastatementNode, metaSubstitutions) {
87
- const nonTerminalNode = metastatementNode, ///
88
- nonTerminalNodeMatches = conclusion.matchNonTerminalNode(nonTerminalNode, metaSubstitutions),
96
+ const nonTerminalNodeMatches = conclusion.matchMetastatementNode(metastatementNode, metaSubstitutions),
89
97
  conclusionMatches = nonTerminalNodeMatches; ///
90
98
 
91
99
  return conclusionMatches;
92
100
  }
93
101
 
94
- function matchPremisesAndConclusion(premises, conclusion, metastatementNodes, metastatementNode) {
102
+ function matchPremisesAndConclusion(premises, conclusion, metaAssertions, metastatementNode) {
95
103
  let premisesMatchConclusion = false;
96
104
 
97
105
  const metaSubstitutions = [],
98
- premisesMatches = matchPremises(premises, metastatementNodes, metaSubstitutions);
106
+ premisesMatches = matchPremises(premises, metaAssertions, metaSubstitutions);
99
107
 
100
108
  if (premisesMatches) {
101
109
  const conclusionMatches = matchConclusion(conclusion, metastatementNode, metaSubstitutions);
package/bin/ruleNames.js CHANGED
@@ -4,7 +4,9 @@ const TERM_RULE_NAME = "term",
4
4
  TYPE_RULE_NAME = "type",
5
5
  ARGUMENT_RULE_NAME = "argument",
6
6
  METAVARIABLE_RULE_NAME = "metavariable",
7
+ METASTATEMENT_RULE_NAME = "metastatement",
7
8
  META_SUBPROOF_RULE_NAME = "metaSubproof",
9
+ META_SUBPROOF_ASSERTION_RULE_NAME = "metaSubproofAssertion",
8
10
  QUALIFIED_METASTATEMENT_RULE_NAME = "qualifiedMetastatement",
9
11
  UNQUALIFIED_METASTATEMENT_RULE_NAME = "unqualifiedMetastatement";
10
12
 
@@ -13,7 +15,9 @@ module.exports = {
13
15
  TYPE_RULE_NAME,
14
16
  ARGUMENT_RULE_NAME,
15
17
  METAVARIABLE_RULE_NAME,
18
+ METASTATEMENT_RULE_NAME,
16
19
  META_SUBPROOF_RULE_NAME,
20
+ META_SUBPROOF_ASSERTION_RULE_NAME,
17
21
  QUALIFIED_METASTATEMENT_RULE_NAME,
18
22
  UNQUALIFIED_METASTATEMENT_RULE_NAME
19
23
  };
@@ -2,7 +2,49 @@
2
2
 
3
3
  const { arrayUtilities } = require("necessary");
4
4
 
5
- const { push, prune, first, second, filter } = arrayUtilities;
5
+ const permutationsMatrix = require("../permutationsMatrix");
6
+
7
+ const { MAXIMUM_INDEXES_LENGTH, MAXIMUM_PERMUTATION_LENGTH } = require("../constants");
8
+
9
+ const { push, last, prune, first, third, second, filter } = arrayUtilities;
10
+
11
+ function someSubArray(array, subArrayLength, callback) {
12
+ let found = false;
13
+
14
+ const arrayLength = array.length,
15
+ indexesLength = arrayLength, ///
16
+ permutationLength = subArrayLength; ///
17
+
18
+ if (permutationLength <= MAXIMUM_PERMUTATION_LENGTH) {
19
+ const offset = (indexesLength <= MAXIMUM_INDEXES_LENGTH) ?
20
+ 0 :
21
+ indexesLength - MAXIMUM_INDEXES_LENGTH,
22
+ permutations = permutationsMatrix[indexesLength][permutationLength];
23
+
24
+ if (permutations !== null) {
25
+ found = permutations.some((permutation) => {
26
+ if (permutation !== null) {
27
+ const subArray = [];
28
+
29
+ for (let position = 0; position < permutationLength; position++) {
30
+ const index = permutation[position] + offset,
31
+ element = array[index];
32
+
33
+ subArray.push(element);
34
+ }
35
+
36
+ const passed = callback(subArray);
37
+
38
+ if (passed) {
39
+ return true;
40
+ }
41
+ }
42
+ });
43
+ }
44
+ }
45
+
46
+ return found;
47
+ }
6
48
 
7
49
  function leftDifference(arrayA, arrayB) {
8
50
  filter(arrayA, (elementA) => {
@@ -14,84 +56,25 @@ function leftDifference(arrayA, arrayB) {
14
56
  });
15
57
  }
16
58
 
17
- function someCombination(array, callback) {
18
- const combinations = combinationsFromArray(array),
19
- found = combinations.some((combination) => {
20
- const array = combination, ///
21
- passed = callback(array);
59
+ function rightDifference(arrayA, arrayB) {
60
+ filter(arrayB, (elementB) => {
61
+ const arrayAIncludesElementB = arrayA.includes(elementB);
22
62
 
23
- if (passed) {
24
- return true;
25
- }
26
- });
27
-
28
- return found;
63
+ if (!arrayAIncludesElementB) {
64
+ return true;
65
+ }
66
+ });
29
67
  }
30
68
 
31
69
  module.exports = {
32
70
  push,
71
+ last,
33
72
  prune,
34
73
  first,
74
+ third,
35
75
  second,
36
76
  filter,
77
+ someSubArray,
37
78
  leftDifference,
38
- someCombination
79
+ rightDifference
39
80
  };
40
-
41
- function combinationsFromArray(array) {
42
- const arrayLength = array.length,
43
- indexCombinations = indexCombinationsFromArrayLength(arrayLength),
44
- combinations = indexCombinations.map((indexCombination) => {
45
- const elements = [];
46
-
47
- for (let position = 0; position < arrayLength; position++) {
48
- const index = indexCombination[position],
49
- element = array[index];
50
-
51
- elements.push(element);
52
- }
53
-
54
- const combination = elements; ///
55
-
56
- return combination;
57
- });
58
-
59
- return combinations;
60
- }
61
-
62
- function indexCombinationsFromArrayLength(arrayLength) {
63
- let indexCombinations;
64
-
65
- if (arrayLength === 0) {
66
- indexCombinations = [];
67
- } else if (arrayLength === 1) {
68
- const indexCombination = [
69
- 0
70
- ];
71
-
72
- indexCombinations = [
73
- indexCombination
74
- ];
75
- } else {
76
- const innerArrayLength = arrayLength - 1,
77
- innerIndexCombinations = indexCombinationsFromArrayLength(innerArrayLength);
78
-
79
- indexCombinations = [];
80
-
81
- innerIndexCombinations.forEach((innerIndexCombination) => {
82
- const outerIndex = innerArrayLength; ///
83
-
84
- for (let position = innerArrayLength; position >= 0; position--) {
85
- const indexCombination = innerIndexCombination.slice(),
86
- start = position, ///
87
- deleteCount = 0;
88
-
89
- indexCombination.splice(start, deleteCount, outerIndex);
90
-
91
- indexCombinations.push(indexCombination);
92
- }
93
- });
94
- }
95
-
96
- return indexCombinations;
97
- }
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+
3
+ const { first, second, third } = require("../utilities/array"),
4
+ { METASTATEMENT_RULE_NAME } = require("../ruleNames"),
5
+ { LEFT_BRACKET, RIGHT_BRACKET, BRACKETED_METASTATEMENT_CHILD_NODES_LENGTH } = require("../constants");
6
+
7
+ function matchBracketedMetastatementChildNode(childNodes, callback) {
8
+ let bracketedMetastatementChildNodeMatches = false;
9
+
10
+ const childNodesLength = childNodes.length;
11
+
12
+ if (childNodesLength === BRACKETED_METASTATEMENT_CHILD_NODES_LENGTH) {
13
+ const firstChildNode = first(childNodes),
14
+ thirdChildNode = third(childNodes),
15
+ secondChildNode = second(childNodes),
16
+ firstChildNodeTerminalNode = firstChildNode.isTerminalNode(),
17
+ thirdChildNodeTerminalNode = thirdChildNode.isTerminalNode(),
18
+ secondChildNodeNonTerminalNode = secondChildNode.isNonTerminalNode();
19
+
20
+ if (firstChildNodeTerminalNode && secondChildNodeNonTerminalNode && thirdChildNodeTerminalNode) {
21
+ const nonTerminalNode = secondChildNode, ///
22
+ firstTerminalNode = firstChildNode, ///
23
+ secondTerminalNode = thirdChildNode, ///
24
+ nonTerminalNodeRuleName = nonTerminalNode.getRuleName(),
25
+ firstTerminalNodeContent = firstTerminalNode.getContent(),
26
+ secondTerminalNodeContent = secondTerminalNode.getContent(),
27
+ firstTerminalNodeContentLeftBracket = (firstTerminalNodeContent === LEFT_BRACKET),
28
+ secondTerminalNodeContentRightBracket = (secondTerminalNodeContent === RIGHT_BRACKET),
29
+ nonTerminalNodeRuleNameMetastatementRuleName = (nonTerminalNodeRuleName === METASTATEMENT_RULE_NAME);
30
+
31
+ if (firstTerminalNodeContentLeftBracket && nonTerminalNodeRuleNameMetastatementRuleName && secondTerminalNodeContentRightBracket) {
32
+ const bracketedMetastatementChildNode = nonTerminalNode; ///
33
+
34
+ bracketedMetastatementChildNodeMatches = callback(bracketedMetastatementChildNode);
35
+ }
36
+ }
37
+ }
38
+
39
+ return bracketedMetastatementChildNodeMatches;
40
+ }
41
+
42
+ module.exports = {
43
+ matchBracketedMetastatementChildNode
44
+ };