occam-verify-cli 0.0.1065 → 0.0.1067

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.
Files changed (87) hide show
  1. package/lib/assertion/contained.js +2 -1
  2. package/lib/assertion/defined.js +2 -1
  3. package/lib/combinator/bracketed.js +135 -0
  4. package/lib/conclusion.js +6 -2
  5. package/lib/consequent.js +6 -2
  6. package/lib/constants.js +3 -3
  7. package/lib/constructor/bracketed.js +30 -11
  8. package/lib/context/file.js +45 -9
  9. package/lib/context/local.js +67 -28
  10. package/lib/metavariable.js +15 -54
  11. package/lib/mixins/statement/unify.js +18 -3
  12. package/lib/mixins/statement/verify.js +2 -11
  13. package/lib/premise.js +6 -2
  14. package/lib/proofStep.js +22 -13
  15. package/lib/rule.js +6 -2
  16. package/lib/ruleNames.js +1 -5
  17. package/lib/statement/qualified.js +30 -17
  18. package/lib/statement/unqualified.js +5 -5
  19. package/lib/statement.js +41 -24
  20. package/lib/subproof.js +1 -1
  21. package/lib/substitution/frameForMetavariable.js +44 -21
  22. package/lib/substitution/statementForMetavariable.js +93 -54
  23. package/lib/substitution/termForVariable.js +38 -21
  24. package/lib/substitution.js +48 -13
  25. package/lib/substitutions.js +22 -19
  26. package/lib/supposition.js +6 -2
  27. package/lib/unifier/metaLevel.js +14 -12
  28. package/lib/unify/metavariableWithFrame.js +2 -2
  29. package/lib/utilities/brackets.js +5 -10
  30. package/lib/utilities/node.js +29 -15
  31. package/lib/utilities/string.js +34 -16
  32. package/lib/utilities/tokens.js +16 -8
  33. package/lib/variable.js +10 -10
  34. package/package.json +2 -2
  35. package/src/assertion/contained.js +2 -0
  36. package/src/assertion/defined.js +2 -0
  37. package/src/combinator/bracketed.js +49 -0
  38. package/src/conclusion.js +8 -1
  39. package/src/consequent.js +8 -1
  40. package/src/constants.js +2 -2
  41. package/src/constructor/bracketed.js +32 -9
  42. package/src/context/file.js +41 -13
  43. package/src/context/local.js +71 -35
  44. package/src/metavariable.js +24 -74
  45. package/src/mixins/statement/unify.js +25 -2
  46. package/src/mixins/statement/verify.js +1 -14
  47. package/src/premise.js +8 -1
  48. package/src/proofStep.js +28 -12
  49. package/src/rule.js +7 -1
  50. package/src/ruleNames.js +0 -1
  51. package/src/statement/qualified.js +38 -21
  52. package/src/statement/unqualified.js +4 -4
  53. package/src/statement.js +62 -41
  54. package/src/subproof.js +0 -1
  55. package/src/substitution/frameForMetavariable.js +62 -32
  56. package/src/substitution/statementForMetavariable.js +102 -61
  57. package/src/substitution/termForVariable.js +52 -32
  58. package/src/substitution.js +40 -11
  59. package/src/substitutions.js +32 -25
  60. package/src/supposition.js +8 -1
  61. package/src/unifier/metaLevel.js +23 -18
  62. package/src/unify/metavariableWithFrame.js +2 -2
  63. package/src/utilities/brackets.js +2 -3
  64. package/src/utilities/node.js +30 -22
  65. package/src/utilities/string.js +39 -23
  66. package/src/utilities/tokens.js +17 -8
  67. package/src/variable.js +7 -7
  68. package/lib/node/statement/bracketed.js +0 -16
  69. package/lib/node/statement/combinator/bracketed.js +0 -25
  70. package/lib/node/term/bracketed.js +0 -16
  71. package/lib/node/term/constructor/bracketed.js +0 -25
  72. package/lib/ocmbinator/bracketed.js +0 -157
  73. package/lib/resolve/complexSubstitutionAgainstSimpleSubstitution.js +0 -62
  74. package/lib/resolve/substitution.js +0 -27
  75. package/lib/resolve/substitutions.js +0 -37
  76. package/lib/substitution/statement.js +0 -163
  77. package/lib/verifier/substitution.js +0 -161
  78. package/src/node/statement/bracketed.js +0 -9
  79. package/src/node/statement/combinator/bracketed.js +0 -10
  80. package/src/node/term/bracketed.js +0 -9
  81. package/src/node/term/constructor/bracketed.js +0 -10
  82. package/src/ocmbinator/bracketed.js +0 -26
  83. package/src/resolve/complexSubstitutionAgainstSimpleSubstitution.js +0 -79
  84. package/src/resolve/substitution.js +0 -19
  85. package/src/resolve/substitutions.js +0 -31
  86. package/src/substitution/statement.js +0 -81
  87. package/src/verifier/substitution.js +0 -75
@@ -6,16 +6,18 @@ import Substitution from "../substitution";
6
6
  import { nodeQuery } from "../utilities/query";
7
7
  import { stripBracketsFromTerm } from "../utilities/brackets";
8
8
 
9
- const termVariableNodeQuery = nodeQuery("/term/variable!"),
9
+ const substitutionNodeQuery = nodeQuery("/statement/substitution"),
10
+ termVariableNodeQuery = nodeQuery("/term/variable!"),
10
11
  substitutionTermNodeQuery = nodeQuery("/substitution/term!"),
11
12
  substitutionsVariableNodeQuery = nodeQuery("/substitution/variable!");
12
13
 
13
14
  export default class TermForVariableSubstitution extends Substitution {
14
- constructor(string, termNode, variableNode) {
15
+ constructor(string, termNode, variableNode, substitutionNode) {
15
16
  super(string);
16
17
 
17
18
  this.termNode = termNode;
18
19
  this.variableNode = variableNode;
20
+ this.substitutionNode = substitutionNode;
19
21
  }
20
22
 
21
23
  getTermNode() {
@@ -26,7 +28,11 @@ export default class TermForVariableSubstitution extends Substitution {
26
28
  return this.variableNode;
27
29
  }
28
30
 
29
- transformed(substitutions) {
31
+ getSubstitutionNode() {
32
+ return this.substitutionNode;
33
+ }
34
+
35
+ transformed(substitutions, localContext) {
30
36
  let transformedSubstitution = null;
31
37
 
32
38
  const transformedTermNode = transformTermNode(this.termNode, substitutions),
@@ -35,7 +41,11 @@ export default class TermForVariableSubstitution extends Substitution {
35
41
  if ((transformedTermNode !== null) && (transformedVariableNode !== null)) {
36
42
  const termNode = transformedTermNode, ///
37
43
  variableNode = transformedVariableNode, ///
38
- termForVariableSubstitution = new TermForVariableSubstitution(termNode, variableNode);
44
+ termString = localContext.nodeAsString(termNode),
45
+ variableString = localContext.nodeAsString(variableNode),
46
+ string = `[${termString} for ${variableString}]`,
47
+ substitutionNode = null,
48
+ termForVariableSubstitution = new TermForVariableSubstitution(string, termNode, variableNode, substitutionNode);
39
49
 
40
50
  transformedSubstitution = termForVariableSubstitution; ///
41
51
  }
@@ -44,11 +54,17 @@ export default class TermForVariableSubstitution extends Substitution {
44
54
  }
45
55
 
46
56
  isEqualTo(substitution) {
57
+ let equalTo = false;
58
+
47
59
  const termNode = substitution.getTermNode(),
48
- variableNode = substitution.getVariableNode(),
49
- termNodeMatches = this.matchTermNode(termNode),
50
- variableNodeMatches = this.matchVariableNode(variableNode),
51
- equalTo = (termNodeMatches && variableNodeMatches);
60
+ variableNode = substitution.getVariableNode();
61
+
62
+ if ((termNode !== null) && (variableNode !== null)) {
63
+ const termNodeMatches = this.matchTermNode(termNode),
64
+ variableNodeMatches = this.matchVariableNode(variableNode);
65
+
66
+ equalTo = (termNodeMatches && variableNodeMatches);
67
+ }
52
68
 
53
69
  return equalTo;
54
70
  }
@@ -67,6 +83,12 @@ export default class TermForVariableSubstitution extends Substitution {
67
83
  return variableNodeMatches;
68
84
  }
69
85
 
86
+ matchSubstitutionNode(substitutionNode) {
87
+ const substitutionNodeMatches = this.substitutionNode.match(substitutionNode);
88
+
89
+ return substitutionNodeMatches;
90
+ }
91
+
70
92
  unifyWithEquivalence(equivalence, substitutions, localContextA, localContextB) {
71
93
  let unifiedWithEquivalence;
72
94
 
@@ -83,42 +105,39 @@ export default class TermForVariableSubstitution extends Substitution {
83
105
  return unifiedWithEquivalence;
84
106
  }
85
107
 
86
- static fromSubstitution(substitution, localContext) {
108
+ static fromStatementNode(statementNode, localContext) {
87
109
  let termForVariableSubstitution = null;
88
110
 
89
- const substitutionNode = substitution.getNode();
90
-
91
- let substitutionTermNode = substitutionTermNodeQuery(substitutionNode);
92
-
93
- if (substitutionTermNode !== null) {
94
- let termNode;
111
+ const substitutionNode = substitutionNodeQuery(statementNode);
95
112
 
96
- const substitutionVariableNode = substitutionsVariableNodeQuery(substitutionNode),
97
- variableNode = substitutionVariableNode; ///
113
+ if (substitutionNode !== null) {
114
+ let substitutionTermNode = substitutionTermNodeQuery(substitutionNode);
98
115
 
99
- termNode = substitutionTermNode; ///
116
+ if (substitutionTermNode !== null) {
117
+ const { Term, Variable } = shim,
118
+ substitutionVariableNode = substitutionsVariableNodeQuery(substitutionNode),
119
+ variableNode = substitutionVariableNode, ///
120
+ termNode = substitutionTermNode, ///
121
+ term = Term.fromTermNode(termNode, localContext),
122
+ variable = Variable.fromVariableNode(variableNode, localContext),
123
+ string = stringFromTermAndVariable(term, variable, localContext);
100
124
 
101
- termNode = stripBracketsFromTerm(termNode); ///
102
-
103
- const { Term, Variable } = shim,
104
- term = Term.fromTermNode(termNode, localContext),
105
- variable = Variable.fromVariableNode(variableNode, localContext),
106
- string = stringFromTermAndVariable(term, variable);
107
-
108
- termForVariableSubstitution = new TermForVariableSubstitution(string, termNode, variableNode);
125
+ termForVariableSubstitution = new TermForVariableSubstitution(string, termNode, variableNode, substitutionNode);
126
+ }
109
127
  }
110
128
 
111
129
  return termForVariableSubstitution;
112
130
  }
113
131
 
114
- static fromTernAndVariable(term, variable) {
132
+ static fromTernAndVariable(term, variable, localContext) {
115
133
  let termNode = term.getNode();
116
134
 
117
135
  termNode = stripBracketsFromTerm(termNode); ///
118
136
 
119
- const variableNode = variable.getNode(),
120
- string = stringFromTermAndVariable(term, variable),
121
- termForVariableSubstitution = new TermForVariableSubstitution(string, termNode, variableNode);
137
+ const string = stringFromTermAndVariable(term, variable, localContext),
138
+ variableNode = variable.getNode(),
139
+ substitutionNode = null,
140
+ termForVariableSubstitution = new TermForVariableSubstitution(string, termNode, variableNode, substitutionNode);
122
141
 
123
142
  return termForVariableSubstitution;
124
143
  }
@@ -169,8 +188,9 @@ function transformVariableNode(variableNode, substitutions) {
169
188
  return transformedVariableNode;
170
189
  }
171
190
 
172
- function stringFromTermAndVariable(term, variable) {
173
- const termString = term.getString(),
191
+ function stringFromTermAndVariable(term, variable, localContext) {
192
+ const termNode = term.getNode(),
193
+ termString = localContext.nodeAsString(termNode),
174
194
  variableString = variable.getString(),
175
195
  string = `[${termString} for ${variableString}]`;
176
196
 
@@ -9,24 +9,22 @@ export default class Substitution {
9
9
  return this.string;
10
10
  }
11
11
 
12
- isSimple() {
13
- const simple = true;
12
+ getTermNode() {
13
+ const termNode = null;
14
14
 
15
- return simple;
15
+ return termNode;
16
16
  }
17
17
 
18
- isComplex() {
19
- const simple = this.isSimple(),
20
- complex = !simple;
18
+ getFrameNode() {
19
+ const frameNode = null;
21
20
 
22
- return complex;
21
+ return frameNode;
23
22
  }
24
23
 
25
- isResolved() {
26
- const simple = this.isSimple(),
27
- resolved = simple; ///
24
+ getStatementNode() {
25
+ const statementNode = null;
28
26
 
29
- return resolved;
27
+ return statementNode;
30
28
  }
31
29
 
32
30
  getVariableNode() {
@@ -41,18 +39,49 @@ export default class Substitution {
41
39
  return metavariableNode;
42
40
  }
43
41
 
42
+ getSubstitutionNode() {
43
+ const substitutionNode = null;
44
+
45
+ return substitutionNode;
46
+ }
47
+
48
+ isSimple() {
49
+ const simple = true;
50
+
51
+ return simple;
52
+ }
53
+
54
+ isComplex() {
55
+ const simple = this.isSimple(),
56
+ complex = !simple;
57
+
58
+ return complex;
59
+ }
60
+
44
61
  isEqualTo(substitution) {
45
62
  const equalTo = false;
46
63
 
47
64
  return equalTo;
48
65
  }
49
66
 
67
+ resolve(substitutions, localContext) {
68
+ const resolved = true;
69
+
70
+ return resolved;
71
+ }
72
+
50
73
  matchTermNode(termNode) {
51
74
  const termNodeMatches = false;
52
75
 
53
76
  return termNodeMatches;
54
77
  }
55
78
 
79
+ matchFrameNode(frameNode) {
80
+ const frameNodeMatches = false;
81
+
82
+ return frameNodeMatches;
83
+ }
84
+
56
85
  matchVariableNode(variableNode) {
57
86
  const variableNodeMatches = false;
58
87
 
@@ -113,6 +113,7 @@ export default class Substitutions {
113
113
 
114
114
  return substitution;
115
115
  }
116
+
116
117
  findSubstitutionsByMetavariableNode(metavariableNode) {
117
118
  const substitutions = this.findSubstitutions((substitution) => {
118
119
  const metavariableNodeMatches = substitution.matchMetavariableNode(metavariableNode);
@@ -153,31 +154,25 @@ export default class Substitutions {
153
154
  return complexSubstitutions;
154
155
  }
155
156
 
156
- findSubstitutionsByMetavariableNodeAndSubstitutionNode(metavariableNode, substitutionNode) {
157
+ findSubstitutionByMetavariableNodeAndSubstitutionNode(metavariableNode, substitutionNode) {
157
158
  const substitutions = this.findSubstitutions((substitution) => {
158
- const metavariableNodeAndSubstitutionNodeMatch = substitution.matchMetavariableNodeAndSubstitutionNode(metavariableNode, substitutionNode);
159
-
160
- if (metavariableNodeAndSubstitutionNodeMatch) {
161
- return true;
162
- }
163
- });
164
-
165
- return substitutions;
166
- }
167
-
168
- findComplexSubstitutionByMetavariableNodeAndSubstitutionNode(metavariableNode, substitutionNode) {
169
- const substitutions = this.findSubstitutionsByMetavariableNodeAndSubstitutionNode(metavariableNode, substitutionNode),
170
- complexSubstitutions = substitutions.filterSubstitution((substitution) => {
171
- const substitutionComplex = substitution.isComplex();
159
+ const metavariableNodeAndSubstitutionNodeMatch = substitution.matchMetavariableNodeAndSubstitutionNode(metavariableNode, substitutionNode);
172
160
 
173
- if (substitutionComplex) {
161
+ if (metavariableNodeAndSubstitutionNodeMatch) {
174
162
  return true;
175
163
  }
176
164
  }),
177
- firstComplexSubstitution = complexSubstitutions.getFirstSubstitution(),
178
- complexSubstitution = firstComplexSubstitution; ///
165
+ firstSubstitution = substitutions.getFirstSubstitution(),
166
+ substitution = firstSubstitution; ///
167
+
168
+ return substitution;
169
+ }
170
+
171
+ isSubstitutionPresentByMetavariableNodeAndSubstitutionNode(metavariableNode, substitutionNode) {
172
+ const substitution = this.findSubstitutionByMetavariableNodeAndSubstitutionNode(metavariableNode, substitutionNode),
173
+ substitutionPresent = (substitution !== null);
179
174
 
180
- return complexSubstitution;
175
+ return substitutionPresent;
181
176
  }
182
177
 
183
178
  addSubstitution(substitution, localContext) {
@@ -218,12 +213,24 @@ export default class Substitutions {
218
213
  return unifiedWithEquivalences;
219
214
  }
220
215
 
221
- areResolved() {
222
- const resolved = this.everySubstitution((substitution) => {
223
- const substitutionResolved = substitution.isResolved();
224
-
225
- return substitutionResolved;
226
- });
216
+ resolve(localContext) {
217
+ const metavariableNodes = this.getMetavariableNodes(),
218
+ resolved = metavariableNodes.every((metavariableNode) => {
219
+ const complexSubstitutions = this.findComplexSubstitutionsByMetavariableNode(metavariableNode),
220
+ complexSubstitutionsResolved = complexSubstitutions.everySubstitution((complexSubstitution) => {
221
+ const substitution = complexSubstitution, ///
222
+ substitutions = this, ///
223
+ substitutionResolved = substitution.resolve(substitutions, localContext);
224
+
225
+ if (substitutionResolved) {
226
+ return true;
227
+ }
228
+ });
229
+
230
+ if (complexSubstitutionsResolved) {
231
+ return true;
232
+ }
233
+ });
227
234
 
228
235
  return resolved;
229
236
  }
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  import shim from "./shim";
4
+ import LocalContext from "./context/local";
4
5
  import SubproofAssertion from "./assertion/subproof";
5
6
  import UnqualifiedStatement from "./statement/unqualified";
6
7
 
@@ -114,7 +115,13 @@ export default class Supposition {
114
115
 
115
116
  localContext.trace(`Unifying the '${statementString}' statement with the '${suppositionString}' supposition...`);
116
117
 
117
- statementUnified = this.unqualifiedStatement.unifyStatement(statement, substitutions, this.fileContext, localContext);
118
+ const localContextB = localContext;
119
+
120
+ localContext = LocalContext.fromFileContext(this.fileContext);
121
+
122
+ const localContextA = localContext; ///
123
+
124
+ statementUnified = this.unqualifiedStatement.unifyStatement(statement, substitutions, localContextA, localContextB);
118
125
 
119
126
  if (statementUnified) {
120
127
  localContext.debug(`...unified the '${statementString}' statement with the '${suppositionString}' supposition.`);
@@ -2,7 +2,8 @@
2
2
 
3
3
  import shim from "../shim";
4
4
  import Unifier from "../unifier";
5
- import unifyMetavariableWithFrame from "../unify/metavariableWithFrame";
5
+ import TermForVariableSubstitution from "../substitution/termForVariable";
6
+ import FrameForMetavariableSubstitution from "../substitution/frameForMetavariable";
6
7
 
7
8
  import { nodeQuery } from "../utilities/query";
8
9
  import { variableNameFromVariableNode, metavariableNameFromMetavariableNode } from "../utilities/name";
@@ -39,26 +40,32 @@ class MetaLevelUnifier extends Unifier {
39
40
  if (matches) {
40
41
  statementUnified = true;
41
42
  } else {
42
- const statementNode = statementNodeA, ///
43
- statementMetavariableNode = statementMetavariableNodeQuery(statementNode);
43
+ let localContext,
44
+ statementNode;
45
+
46
+ localContext = localContextA; ///
47
+
48
+ statementNode = statementNodeA; ///
49
+
50
+ const statementMetavariableNode = statementMetavariableNodeQuery(statementNode);
44
51
 
45
52
  if (statementMetavariableNode !== null) {
53
+ const substitution = FrameForMetavariableSubstitution.fromStatementNode(statementNode, localContext) ||
54
+ TermForVariableSubstitution.fromStatementNode(statementNode, localContext) ||
55
+ null;
56
+
46
57
  const { Statement } = shim,
47
58
  metavariableNode = statementMetavariableNode, ///
48
59
  metavariableName = metavariableNameFromMetavariableNode(metavariableNode),
49
- metavariable = localContextA.findMetavariableByMetavariableName(metavariableName),
50
- substitution = substitutionA, ///
51
- localContext = localContextB, ///
52
- statementNode = statementNodeB, ///
53
- statement = Statement.fromStatementNode(statementNode, localContext);
54
-
55
- if (substitution === null) {
56
- statementUnified = metavariable.unifyStatement(statement, substitutions, localContext);
57
- } else {
58
- const statementUnifiedGivenSubstitution = metavariable.unifyStatementGivenSubstitution(statement, substitution, substitutions, localContext);
59
-
60
- statementUnified = statementUnifiedGivenSubstitution; ///
61
- }
60
+ metavariable = localContextA.findMetavariableByMetavariableName(metavariableName);
61
+
62
+ localContext = localContextB; ///
63
+
64
+ statementNode = statementNodeB; ///
65
+
66
+ const statement = Statement.fromStatementNode(statementNode, localContext);
67
+
68
+ statementUnified = metavariable.unifyStatement(statement, substitution, substitutions, localContext);
62
69
  } else {
63
70
  statementUnified = unifyStatementWithStatement(statementNodeA, statementNodeB, substitutions, localContextA, localContextB);
64
71
  }
@@ -109,8 +116,6 @@ const metaLevelUnifier = new MetaLevelUnifier();
109
116
  export default metaLevelUnifier;
110
117
 
111
118
  function unifyStatementWithStatement(statementNodeA, statementNodeB, substitutions, localContextA, localContextB) {
112
- substitutionA = null;
113
-
114
119
  const nonTerminalNodeA = statementNodeA, ///
115
120
  nonTerminalNodeB = statementNodeB, ///
116
121
  nonTerminalNodeAChildNodes = nonTerminalNodeA.getChildNodes(),
@@ -26,8 +26,8 @@ export default function unifyMetavariableWithFrame(metavariableNodeA, frameNodeB
26
26
  metavariableUnifiedWithFrame = true;
27
27
  } else {
28
28
  const frameNode = frameNodeB, ///
29
- metavariableNode = metavariableNodeA, ///
30
- frameForMetavariableSubstitution = FrameForMetavariableSubstitution.fromFrameNodeAndMetavariableNode(frameNode, metavariableNode, localContextA, localContextB),
29
+ metavariable = metavariableA, ///
30
+ frameForMetavariableSubstitution = FrameForMetavariableSubstitution.fromFrameAndMetavariable(frame, metavariable, localContextA, localContextB),
31
31
  substitution = frameForMetavariableSubstitution; ///
32
32
 
33
33
  substitutions.addSubstitution(substitution, localContextA, localContextB);
@@ -1,9 +1,8 @@
1
1
  "use strict";
2
2
 
3
- import bracketedTermNode from "../node/term/bracketed";
4
- import bracketedStatementNode from "../node/statement/bracketed";
5
-
6
3
  import { nodeQuery } from "../utilities/query";
4
+ import { bracketedTermNode } from "../constructor/bracketed";
5
+ import { bracketedStatementNode } from "../combinator/bracketed";
7
6
  import { BRACKETED_TERM_DEPTH, BRACKETED_STATEMENT_DEPTH } from "../constants";
8
7
 
9
8
  const bracketedTermChildNodeQuery = nodeQuery("/term/argument/term!"),
@@ -6,12 +6,10 @@ import { nodeQuery } from "../utilities/query";
6
6
  import { combinedCustomGrammarFromNothing } from "./customGrammar";
7
7
  import { VARIABLE_RULE_NAME,
8
8
  METAVARIABLE_RULE_NAME,
9
- SUBSTITUTION_RULE_NAME,
10
9
  UNQUALIFIED_STATEMENT_RULE_NAME,
11
10
  CONSTRUCTOR_DECLARATION_RULE_NAME } from "../ruleNames";
12
11
  import { variableTokensFromVariableString,
13
12
  metavariableTokensFromMetavariableString,
14
- substitutionTokensFromSubstitutionString,
15
13
  unqualifiedStatementTokensFromUnqualifiedStatementString,
16
14
  constructorDeclarationTokensFromConstructorDeclarationString } from "../utilities/tokens";
17
15
 
@@ -24,11 +22,10 @@ const termNodeQuery = nodeQuery("/constructorDeclaration/term"),
24
22
  statementNodeQuery = nodeQuery("/unqualifiedStatement/statement");
25
23
 
26
24
  export function termNodeFromTermString(termString, lexer, parser) {
27
- const constructorDeclarationString = `Constructor ${termString}
28
- `,
25
+ const constructorDeclarationString = constructorDeclarationStringFromTermString(termString),
29
26
  constructorDeclarationTokens = constructorDeclarationTokensFromConstructorDeclarationString(constructorDeclarationString, lexer),
30
27
  constructorDeclarationNode = constructorDeclarationNodeFromConstructorDeclarationTokens(constructorDeclarationTokens, parser),
31
- termNode = termNodeQuery(constructorDeclarationNode, constructorDeclarationNode);
28
+ termNode = termNodeFromConstructorDeclarationNode(constructorDeclarationNode);
32
29
 
33
30
  return termNode;
34
31
  }
@@ -41,15 +38,40 @@ export function variableNodeFromVariableString(variableString, lexer, parser) {
41
38
  }
42
39
 
43
40
  export function statementNodeFromStatementString(statementString, lexer, parser) {
44
- const unqualifiedStatementString = `${statementString}
45
- `,
41
+ const unqualifiedStatementString =unqualifiedStatementStringFromStatementString(statementString),
46
42
  unqualifiedStatementTokens = unqualifiedStatementTokensFromUnqualifiedStatementString(unqualifiedStatementString, lexer),
47
43
  unqualifiedStatementNode = unqualifiedStatementNodeFromUnqualifiedStatementTokens(unqualifiedStatementTokens, parser),
48
- statementNode = statementNodeQuery(unqualifiedStatementNode);
44
+ statementNode = statementNodeFromUnqualifiedStatementNode(unqualifiedStatementNode);
45
+
46
+ return statementNode;
47
+ }
48
+
49
+ export function termNodeFromConstructorDeclarationNode(constructorDeclarationNode) {
50
+ const termNode = termNodeQuery(constructorDeclarationNode, constructorDeclarationNode);
51
+
52
+ return termNode;
53
+ }
54
+
55
+ export function statementNodeFromUnqualifiedStatementNode(unqualifiedStatementNode) {
56
+ const statementNode = statementNodeQuery(unqualifiedStatementNode);
49
57
 
50
58
  return statementNode;
51
59
  }
52
60
 
61
+ export function constructorDeclarationStringFromTermString(termString) {
62
+ const constructorDeclarationString = `Constructor ${termString}
63
+ `;
64
+
65
+ return constructorDeclarationString;
66
+ }
67
+
68
+ export function unqualifiedStatementStringFromStatementString(statementString) {
69
+ const unqualifiedStatementString = `${statementString}
70
+ `;
71
+
72
+ return unqualifiedStatementString;
73
+ }
74
+
53
75
  export function metavariableNodeFromMetavariableString(metavariableString, lexer, parser) {
54
76
  const metavariableTokens = metavariableTokensFromMetavariableString(metavariableString, lexer),
55
77
  metavariableNode = metavariableNodeFromMetavariableTokens(metavariableTokens, parser);
@@ -57,13 +79,6 @@ export function metavariableNodeFromMetavariableString(metavariableString, lexer
57
79
  return metavariableNode;
58
80
  }
59
81
 
60
- export function substitutionNodeFromSubstitutionString(substitutionString, lexer, parser) {
61
- const substitutionTokens = substitutionTokensFromSubstitutionString(substitutionString, lexer),
62
- substitutionNode = substitutionNodeFromSubstitutionTokens(substitutionTokens, parser);
63
-
64
- return substitutionNode;
65
- }
66
-
67
82
  export function variableNodeFromVariableTokens(variableTokens, parser) {
68
83
  const ruleName = VARIABLE_RULE_NAME,
69
84
  variableNode = nodeFromTokensRuleNameAndParser(variableTokens, ruleName, parser);
@@ -78,13 +93,6 @@ export function metavariableNodeFromMetavariableTokens(metavariableTokens, parse
78
93
  return metavariableNode;
79
94
  }
80
95
 
81
- export function substitutionNodeFromSubstitutionTokens(substitutionTokens, parser) {
82
- const ruleName = SUBSTITUTION_RULE_NAME,
83
- substitutionNode = nodeFromTokensRuleNameAndParser(substitutionTokens, ruleName, parser);
84
-
85
- return substitutionNode;
86
- }
87
-
88
96
  export function unqualifiedStatementNodeFromUnqualifiedStatementTokens(unqualifiedStatementTokens, parser) {
89
97
  const tokens = unqualifiedStatementTokens, ///
90
98
  ruleName = UNQUALIFIED_STATEMENT_RULE_NAME,
@@ -11,17 +11,9 @@ export function trim(string) {
11
11
  export function nodeAsString(node, tokens) {
12
12
  let string;
13
13
 
14
- const nodeTerminalNode = node.isTerminalNode();
15
-
16
- if (nodeTerminalNode) {
17
- const terminalNode = node; ///
18
-
19
- string = terminalNodeAsString(terminalNode);
20
- } else {
21
- const nonTerminalNode = node; ///
14
+ tokens = nodeAsTokens(node, tokens); ///
22
15
 
23
- string = nonTerminalNodeAsString(nonTerminalNode, tokens);
24
- }
16
+ string = tokensAsString(tokens);
25
17
 
26
18
  return string;
27
19
  }
@@ -40,14 +32,46 @@ export function nodesAsString(nodes, tokens) {
40
32
  return string;
41
33
  }
42
34
 
43
- function terminalNodeAsString(terminalNode) {
44
- const content = terminalNode.getContent(),
45
- string = content; ///
35
+ export function tokensAsString(tokens) {
36
+ const string = tokens.reduce((string, token) => {
37
+ const content = token.getContent();
38
+
39
+ string = `${string}${content}`;
40
+
41
+ return string;
42
+ }, EMPTY_STRING);
46
43
 
47
44
  return string;
48
45
  }
49
46
 
50
- function nonTerminalNodeAsString(nonTerminalNode, tokens) {
47
+ export function nodeAsTokens(node, tokens) {
48
+ const nodeTerminalNode = node.isTerminalNode();
49
+
50
+ if (nodeTerminalNode) {z
51
+ const terminalNode = node; ///
52
+
53
+ tokens = terminalNodeAsTokens(terminalNode, tokens);
54
+ } else {
55
+ const nonTerminalNode = node; ///
56
+
57
+ tokens = nonTerminalNodeAsTokens(nonTerminalNode, tokens);
58
+ }
59
+
60
+ return tokens;
61
+ }
62
+
63
+ function terminalNodeAsTokens(terminalNode, tokens) {
64
+ const significantToken = terminalNode.getSignificantToken(),
65
+ token = significantToken; ///
66
+
67
+ tokens = [ ///
68
+ token
69
+ ];
70
+
71
+ return tokens;
72
+ }
73
+
74
+ function nonTerminalNodeAsTokens(nonTerminalNode, tokens) {
51
75
  const lastSignificantTokenIndex = nonTerminalNode.getLastSignificantTokenIndex(tokens),
52
76
  firstSignificantTokenIndex = nonTerminalNode.getFirstSignificantTokenIndex(tokens),
53
77
  start = firstSignificantTokenIndex, ///
@@ -55,13 +79,5 @@ function nonTerminalNodeAsString(nonTerminalNode, tokens) {
55
79
 
56
80
  tokens = tokens.slice(start, end); ///
57
81
 
58
- const string = tokens.reduce((string, token) => {
59
- const content = token.getContent();
60
-
61
- string = `${string}${content}`;
62
-
63
- return string;
64
- }, EMPTY_STRING);
65
-
66
- return string;
82
+ return tokens;
67
83
  }
@@ -1,10 +1,12 @@
1
1
  "use strict";
2
2
 
3
+ import { arrayUtilities } from "necessary";
3
4
  import { lexersUtilities } from "occam-custom-grammars";
4
5
 
5
6
  import { combinedCustomGrammarFromNothing } from "./customGrammar";
6
7
 
7
- const { nominalLexerFromCombinedCustomGrammar } = lexersUtilities;
8
+ const { front } = arrayUtilities,
9
+ { nominalLexerFromCombinedCustomGrammar } = lexersUtilities;
8
10
 
9
11
  const combinedCustomGrammar = combinedCustomGrammarFromNothing(),
10
12
  nominalLexer = nominalLexerFromCombinedCustomGrammar(combinedCustomGrammar);
@@ -23,13 +25,6 @@ export function metavariableTokensFromMetavariableString(metavariableString, lex
23
25
  return metavariableTokens;
24
26
  }
25
27
 
26
- export function substitutionTokensFromSubstitutionString(substitutionString, lexer) {
27
- const substitutionContent = `${substitutionString}`,
28
- substitutionTokens = tokensFromContentAndLexer(substitutionContent, lexer);
29
-
30
- return substitutionTokens;
31
- }
32
-
33
28
  export function unqualifiedStatementTokensFromUnqualifiedStatementString(unqualifiedStatementString, lexer) {
34
29
  const content = unqualifiedStatementString, ///
35
30
  unqualifiedStatementTokens = tokensFromContentAndLexer(content, lexer);
@@ -44,6 +39,20 @@ export function constructorDeclarationTokensFromConstructorDeclarationString(con
44
39
  return constructorDeclarationTokens;
45
40
  }
46
41
 
42
+ export function termTokensFromConstructorDeclarationTokens(constructorDeclarationTokens) {
43
+ const frontConstructorDeclarationTokens = front(constructorDeclarationTokens),
44
+ termTokens = frontConstructorDeclarationTokens; ///
45
+
46
+ return termTokens;
47
+ }
48
+
49
+ export function statementTokensFromUnqualifiedStatementTokens(unqualifiedStatementTokens) {
50
+ const frontUnqualifiedStatementTokens = front(unqualifiedStatementTokens),
51
+ statementTokens = frontUnqualifiedStatementTokens; ///
52
+
53
+ return statementTokens;
54
+ }
55
+
47
56
  function tokensFromContentAndLexer(content, lexer = nominalLexer) {
48
57
  const tokens = lexer.tokenise(content);
49
58