occam-furtle 2.0.279 → 2.0.282

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 (133) hide show
  1. package/README.md +0 -11
  2. package/lib/constants.js +29 -1
  3. package/lib/context/block.js +15 -1
  4. package/lib/context/file.js +127 -50
  5. package/lib/element/assignment/array.js +186 -0
  6. package/lib/element/assignment/object.js +244 -0
  7. package/lib/element/assignment/variable.js +144 -0
  8. package/lib/element/assignments/variable.js +158 -0
  9. package/lib/element/block/return.js +198 -0
  10. package/lib/element/comparison.js +179 -0
  11. package/lib/element/declaration/procedure.js +139 -0
  12. package/lib/{dom → element}/error.js +12 -4
  13. package/lib/element/every.js +179 -0
  14. package/lib/element/expression/bitwise.js +186 -0
  15. package/lib/element/expression/bracketed.js +149 -0
  16. package/lib/element/expression/negated.js +166 -0
  17. package/lib/element/expression.js +578 -0
  18. package/lib/element/expressions.js +210 -0
  19. package/lib/{dom → element}/label.js +4 -4
  20. package/lib/element/parameter/named.js +198 -0
  21. package/lib/element/parameter.js +165 -0
  22. package/lib/element/parameters/named.js +220 -0
  23. package/lib/element/parameters.js +198 -0
  24. package/lib/element/procedure/anonymous.js +181 -0
  25. package/lib/element/procedure.js +212 -0
  26. package/lib/element/procedureCall.js +166 -0
  27. package/lib/element/query/node.js +186 -0
  28. package/lib/element/query/nodes.js +179 -0
  29. package/lib/element/reduce.js +181 -0
  30. package/lib/element/reference.js +138 -0
  31. package/lib/element/some.js +179 -0
  32. package/lib/element/statement/return.js +138 -0
  33. package/lib/element/step.js +154 -0
  34. package/lib/element/ternary.js +171 -0
  35. package/lib/element/variable.js +279 -0
  36. package/lib/elements.js +27 -0
  37. package/lib/index.js +10 -2
  38. package/lib/log.js +202 -0
  39. package/lib/preamble.js +32 -32
  40. package/lib/process/verify.js +289 -0
  41. package/lib/utilities/context.js +46 -5
  42. package/package.json +3 -1
  43. package/src/constants.js +16 -0
  44. package/src/context/block.js +10 -0
  45. package/src/context/file.js +96 -54
  46. package/src/{dom → element}/assignment/array.js +6 -6
  47. package/src/{dom → element}/assignment/object.js +8 -8
  48. package/src/{dom → element}/assignment/variable.js +4 -4
  49. package/src/{dom → element}/assignments/variable.js +5 -5
  50. package/src/{dom → element}/block/return.js +5 -5
  51. package/src/{dom → element}/comparison.js +5 -5
  52. package/src/{dom → element}/declaration/procedure.js +22 -4
  53. package/src/{dom → element}/error.js +13 -4
  54. package/src/{dom → element}/every.js +6 -6
  55. package/src/{dom → element}/expression/bitwise.js +5 -5
  56. package/src/{dom → element}/expression/bracketed.js +4 -4
  57. package/src/{dom → element}/expression/negated.js +5 -5
  58. package/src/{dom → element}/expression.js +4 -4
  59. package/src/{dom → element}/expressions.js +6 -6
  60. package/src/{dom → element}/label.js +4 -4
  61. package/src/{dom → element}/parameter/named.js +4 -4
  62. package/src/{dom → element}/parameter.js +4 -4
  63. package/src/{dom → element}/parameters/named.js +5 -5
  64. package/src/{dom → element}/parameters.js +5 -5
  65. package/src/{dom → element}/procedure/anonymous.js +4 -4
  66. package/src/{dom → element}/procedure.js +5 -5
  67. package/src/{dom → element}/procedureCall.js +4 -4
  68. package/src/{dom → element}/query/node.js +5 -5
  69. package/src/{dom → element}/query/nodes.js +5 -5
  70. package/src/{dom → element}/reduce.js +5 -5
  71. package/src/{dom → element}/reference.js +4 -4
  72. package/src/{dom → element}/some.js +6 -6
  73. package/src/{dom → element}/statement/return.js +4 -4
  74. package/src/{dom → element}/step.js +4 -4
  75. package/src/{dom → element}/ternary.js +4 -4
  76. package/src/{dom → element}/variable.js +5 -5
  77. package/src/elements.js +13 -0
  78. package/src/index.js +5 -1
  79. package/src/log.js +139 -0
  80. package/src/preamble.js +31 -31
  81. package/src/process/verify.js +157 -0
  82. package/src/utilities/context.js +45 -2
  83. package/test/Free and bound variables.ftl +112 -0
  84. package/test/context/file.js +127 -0
  85. package/{src/example → test}/context/release.js +60 -12
  86. package/test/helpers/constants.js +17 -0
  87. package/{src/example/utilities → test/helpers}/expressions.js +8 -4
  88. package/{src/example/utilities → test/helpers}/furtle.js +8 -4
  89. package/{src/example/utilities → test/helpers}/grammar.js +8 -4
  90. package/{src/example/utilities → test/helpers}/nominal.js +10 -5
  91. package/{src/example/utilities → test/helpers}/procedure.js +6 -2
  92. package/test/main.js +55 -0
  93. package/example/Free and bound variables.ftl +0 -75
  94. package/lib/dom/assignment/array.js +0 -186
  95. package/lib/dom/assignment/object.js +0 -244
  96. package/lib/dom/assignment/variable.js +0 -144
  97. package/lib/dom/assignments/variable.js +0 -158
  98. package/lib/dom/block/return.js +0 -198
  99. package/lib/dom/comparison.js +0 -179
  100. package/lib/dom/declaration/procedure.js +0 -125
  101. package/lib/dom/every.js +0 -179
  102. package/lib/dom/expression/bitwise.js +0 -186
  103. package/lib/dom/expression/bracketed.js +0 -149
  104. package/lib/dom/expression/negated.js +0 -166
  105. package/lib/dom/expression.js +0 -578
  106. package/lib/dom/expressions.js +0 -210
  107. package/lib/dom/parameter/named.js +0 -198
  108. package/lib/dom/parameter.js +0 -165
  109. package/lib/dom/parameters/named.js +0 -220
  110. package/lib/dom/parameters.js +0 -198
  111. package/lib/dom/procedure/anonymous.js +0 -181
  112. package/lib/dom/procedure.js +0 -212
  113. package/lib/dom/procedureCall.js +0 -166
  114. package/lib/dom/query/node.js +0 -186
  115. package/lib/dom/query/nodes.js +0 -179
  116. package/lib/dom/reduce.js +0 -181
  117. package/lib/dom/reference.js +0 -138
  118. package/lib/dom/some.js +0 -179
  119. package/lib/dom/statement/return.js +0 -138
  120. package/lib/dom/step.js +0 -154
  121. package/lib/dom/ternary.js +0 -171
  122. package/lib/dom/variable.js +0 -279
  123. package/lib/dom.js +0 -27
  124. package/lib/example/context/file.js +0 -130
  125. package/lib/example/context/release.js +0 -160
  126. package/lib/example/utilities/expressions.js +0 -29
  127. package/lib/example/utilities/furtle.js +0 -19
  128. package/lib/example/utilities/grammar.js +0 -26
  129. package/lib/example/utilities/nominal.js +0 -25
  130. package/lib/example/utilities/procedure.js +0 -18
  131. package/src/dom.js +0 -13
  132. package/src/example/context/file.js +0 -69
  133. /package/{example → test}/customGrammars.json +0 -0
@@ -0,0 +1,112 @@
1
+ Boolean isVariableFree(Node termNode, Node statementNode) {
2
+ Boolean variableBound = isVariableBound(termNode, statementNode);
3
+
4
+ Boolean variableFree = !variableBound;
5
+
6
+ Return variableFree;
7
+ }
8
+
9
+ Boolean isVariableBound(Node termNode, Node statementNode) {
10
+ String variableIdentitifer = variableIdentitiferFromTermNode(termNode);
11
+
12
+ Boolean variableBound =
13
+
14
+ If (variableIdentitifer != "")
15
+ variableBoundFromVariableIdentifierAndStatementNode(variableIdentitifer, statementNode)
16
+
17
+ Else
18
+ false
19
+ ;
20
+
21
+ Return variableBound;
22
+ }
23
+
24
+ String variableIdentitiferFromTermNode(Node termNode) {
25
+ Node variableIdentifierTerminalNode = nodeQuery(termNode, "/term/variable!/@identifier");
26
+
27
+ String variableIdentitifer =
28
+
29
+ If (variableIdentifierTerminalNode != null) {
30
+ { String content As variableIdentitifer } = variableIdentifierTerminalNode;
31
+
32
+ Return variableIdentitifer;
33
+ }
34
+
35
+ Else
36
+ ""
37
+ ;
38
+
39
+ Return variableIdentitifer;
40
+ }
41
+
42
+ String boundVariableIdentifierFromStatementNode(Node statementNode) {
43
+ { Nodes childNodes As statementChildNodes } = statementNode;
44
+
45
+ [ Node firstStatementChildNode ] = statementChildNodes;
46
+
47
+ { Boolean terminal } = firstStatementChildNode;
48
+
49
+ String boundVariableIdentifier =
50
+
51
+ If (terminal)
52
+ boundVariableIdentifierFromStatementChildNodes(statementChildNodes)
53
+
54
+ Else
55
+ ""
56
+ ;
57
+
58
+ Return boundVariableIdentifier;
59
+ }
60
+
61
+ String boundVariableIdentifierFromStatementChildNodes(Nodes statementChildNodes) {
62
+ [ Node terminalNode ] = statementChildNodes;
63
+
64
+ { String content } = terminalNode;
65
+
66
+ String boundVariableIdentifier =
67
+
68
+ If ((content == "∀") || (content == "∃")) {
69
+ [ _, Node argumentNode ] = statementChildNodes;
70
+
71
+ String boundVariableIdentifier = boundVariableIdentifierFromArgumentNode(argumentNode);
72
+
73
+ Return boundVariableIdentifier;
74
+ }
75
+ Else
76
+ ""
77
+ ;
78
+
79
+ Return boundVariableIdentifier;
80
+ }
81
+
82
+ String boundVariableIdentifierFromArgumentNode(Node argumentNode) {
83
+ Node boundVariableIdentityTerminalNode = nodeQuery(argumentNode, "/argument/term/variable!/@identifier");
84
+
85
+ String boundVariableIdentifier =
86
+
87
+ If (boundVariableIdentityTerminalNode != null) {
88
+ { String content As boundVariableIdentifier } = boundVariableIdentityTerminalNode;
89
+
90
+ Return boundVariableIdentifier;
91
+ }
92
+
93
+ Else
94
+ ""
95
+ ;
96
+
97
+ Return boundVariableIdentifier;
98
+ }
99
+
100
+ Boolean variableBoundFromVariableIdentifierAndStatementNode(String variableIdentitifer, Node statementNode) {
101
+ Nodes statementNodes = nodesQuery(statementNode, "//statement");
102
+
103
+ Boolean variableBound = Some(statementNodes, Boolean (Node statementNode) {
104
+ String boundVariableIdentifier = boundVariableIdentifierFromStatementNode(statementNode);
105
+
106
+ Boolean variableBound = (boundVariableIdentifier == variableIdentitifer);
107
+
108
+ Return variableBound;
109
+ });
110
+
111
+ Return variableBound;
112
+ }
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+
3
+ const { stringUtilities, contextUtilities } = require("../../lib/index");
4
+
5
+ const { nodeAsString, nodesAsString } = stringUtilities,
6
+ { chainContext, lineIndexFromNodeAndTokens } = contextUtilities;
7
+
8
+ class FileContext {
9
+ constructor(context, filePath, lineIndex, node, tokens) {
10
+ this.context = context;
11
+ this.filePath = filePath;
12
+ this.lineIndex = lineIndex;
13
+ this.node = node;
14
+ this.tokens = tokens;
15
+
16
+ return chainContext(this);
17
+ }
18
+
19
+ getContext() {
20
+ return this.context;
21
+ }
22
+
23
+ getFilePath() {
24
+ return this.filePath;
25
+ }
26
+
27
+ getLineIndex() {
28
+ return this.lineIndex;
29
+ }
30
+
31
+ getNode() {
32
+ return this.node;
33
+ }
34
+
35
+ getTokens() {
36
+ return this.tokens;
37
+ }
38
+
39
+ getVariables() {
40
+ const variables = [];
41
+
42
+ return variables;
43
+ }
44
+
45
+ getProcedures() {
46
+ const procedures = [];
47
+
48
+ return procedures;
49
+ }
50
+
51
+ nodeAsString(node) {
52
+ const string = nodeAsString(node, this.tokens);
53
+
54
+ return string;
55
+ }
56
+
57
+ nodesAsString(nodes) {
58
+ const string = nodesAsString(nodes, this.tokens);
59
+
60
+ return string;
61
+ }
62
+
63
+ trace(message, node = null) {
64
+ const level = TRACE_LEVEL;
65
+
66
+ this.writeToLog(level, message, node);
67
+ }
68
+
69
+ debug(message, node = null) {
70
+ const level = DEBUG_LEVEL;
71
+
72
+ this.writeToLog(level, message, node);
73
+ }
74
+
75
+ info(message, node = null) {
76
+ const level = INFO_LEVEL;
77
+
78
+ this.writeToLog(level, message, node);
79
+ }
80
+
81
+ warning(message, node = null) {
82
+ const level = WARNING_LEVEL;
83
+
84
+ this.writeToLog(level, message, node);
85
+ }
86
+
87
+ error(message, node = null) {
88
+ const level = ERROR_LEVEL;
89
+
90
+ this.writeToLog(level, message, node);
91
+ }
92
+
93
+ writeToLog(level, message, node) {
94
+ const lineIndex = lineIndexFromNodeAndTokens(node, this.tokens, this.lineIndex),
95
+ filePath = (lineIndex === null) ?
96
+ this.filePath :
97
+ null;
98
+
99
+ this.context.writeToLog(level, message, filePath, lineIndex);
100
+
101
+ this.lineIndex = lineIndex;
102
+ }
103
+
104
+ getFileContext() {
105
+ const fileContext = this; ///
106
+
107
+ return fileContext;
108
+ }
109
+
110
+ getDepth() {
111
+ let depth = this.context.getDepth();
112
+
113
+ depth++;
114
+
115
+ return depth;
116
+ }
117
+
118
+ static fromNodeTokensAndFilePath(node, tokens, filePath, context) {
119
+ const lineIndex = null,
120
+ fileContext = new FileContext(context, filePath, lineIndex, node, tokens);
121
+
122
+ return fileContext;
123
+ }
124
+ }
125
+
126
+ module.exports = FileContext;
127
+
@@ -1,16 +1,25 @@
1
1
  "use strict";
2
2
 
3
- import { FileContext } from "../../index"; ///
4
- import { arrayUtilities } from "necessary";
3
+ const { arrayUtilities } =require("necessary");
5
4
 
6
- const { push } = arrayUtilities;
5
+ const { Log, FileContext } =require("../../lib/index"); ///
7
6
 
8
- export class ReleaseContext {
9
- constructor(files, fileContexts) {
7
+ const { LEVELS } =require("../helpers/constants");
8
+
9
+ const { push } = arrayUtilities,
10
+ [ TRACE_LEVEL, DEBUG_LEVEL, INFO_LEVEL, WARNING_LEVEL, ERROR_LEVEL ] = LEVELS;
11
+
12
+ class ReleaseContext {
13
+ constructor(log, files, fileContexts) {
14
+ this.log = log;
10
15
  this.files = files;
11
16
  this.fileContexts = fileContexts;
12
17
  }
13
18
 
19
+ getLog() {
20
+ return this.log;
21
+ }
22
+
14
23
  getFiles() {
15
24
  return this.files;
16
25
  }
@@ -72,15 +81,51 @@ export class ReleaseContext {
72
81
  return procedurePresent;
73
82
  }
74
83
 
75
- trace(message) { console.log(message); }
84
+ trace(message, filePath = null, lineIndex = null) {
85
+ const level = TRACE_LEVEL;
86
+
87
+ this.writeToLog(level, message, filePath, lineIndex);
88
+ }
89
+
90
+ debug(message, filePath = null, lineIndex = null) {
91
+ const level = DEBUG_LEVEL
92
+
93
+ this.writeToLog(level, message, filePath, lineIndex);
94
+ }
95
+
96
+ info(message, filePath = null, lineIndex = null) {
97
+ const level = INFO_LEVEL;
76
98
 
77
- debug(message) { console.log(message); }
99
+ this.writeToLog(level, message, filePath, lineIndex);
100
+ }
78
101
 
79
- info(message) { console.log(message); }
102
+ warning(message, filePath = null, lineIndex = null) {
103
+ const level = WARNING_LEVEL;
80
104
 
81
- warning(message) { console.log(message); }
105
+ this.writeToLog(level, message, filePath, lineIndex);
106
+ }
82
107
 
83
- error(message) { console.log(message); }
108
+ error(message, filePath = null, lineIndex = null) {
109
+ const level = ERROR_LEVEL;
110
+
111
+ this.writeToLog(level, message, filePath, lineIndex);
112
+ }
113
+
114
+ writeToLog(level, message, filePath, lineIndex) {
115
+ this.log.write(level, message, filePath, lineIndex);
116
+ }
117
+
118
+ getFileContext() {
119
+ const fileContext = null;
120
+
121
+ return fileContext;
122
+ }
123
+
124
+ getDepth() {
125
+ const depth = -1;
126
+
127
+ return depth;
128
+ }
84
129
 
85
130
  verify() {
86
131
  this.files.forEach((file) => {
@@ -94,10 +139,13 @@ export class ReleaseContext {
94
139
  }
95
140
 
96
141
  static fromNothing() {
97
- const files = [],
142
+ const log = Log.fromNothing(),
143
+ files = [],
98
144
  fileContexts = [],
99
- releaseContext = new ReleaseContext(files, fileContexts);
145
+ releaseContext = new ReleaseContext(log, files, fileContexts);
100
146
 
101
147
  return releaseContext;
102
148
  }
103
149
  }
150
+
151
+ module.exports = ReleaseContext;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ const { levels } = require("necessary");
4
+
5
+ const { TRACE_LEVEL, DEBUG_LEVEL, INFO_LEVEL, WARNING_LEVEL, ERROR_LEVEL } = levels;
6
+
7
+ const LEVELS = [
8
+ TRACE_LEVEL,
9
+ DEBUG_LEVEL,
10
+ INFO_LEVEL,
11
+ WARNING_LEVEL,
12
+ ERROR_LEVEL
13
+ ];
14
+
15
+ module.exports = {
16
+ LEVELS
17
+ };
@@ -1,15 +1,15 @@
1
1
  "use strict";
2
2
 
3
- import { Query } from "occam-query";
4
- import { Expressions } from "../../index"; ///
5
- import { arrayUtilities } from "necessary";
3
+ const { Query } = require("occam-query"),
4
+ { Expressions } = require("../../lib/index"), ///
5
+ { arrayUtilities } = require("necessary");
6
6
 
7
7
  const { first } = arrayUtilities;
8
8
 
9
9
  const freeTermNodeQuery = Query.fromExpressionString("//term[1]"),
10
10
  boundTermNodeQuery = Query.fromExpressionString("//term[0]");
11
11
 
12
- export function expressionsFromFileContext(fileContext, free = true) {
12
+ function expressionsFromFileContext(fileContext, free = true) {
13
13
  const context = fileContext, ///
14
14
  nodes = nodesFromFileContext(fileContext, free),
15
15
  expressions = Expressions.fromNodes(nodes, context);
@@ -17,6 +17,10 @@ export function expressionsFromFileContext(fileContext, free = true) {
17
17
  return expressions;
18
18
  }
19
19
 
20
+ module.exports = {
21
+ expressionsFromFileContext
22
+ };
23
+
20
24
  function nodesFromFileContext(fileContext, free) {
21
25
  const termNodeQuery = free ?
22
26
  freeTermNodeQuery :
@@ -1,12 +1,12 @@
1
1
  "use strict";
2
2
 
3
- import { File } from "occam-entities";
4
- import { fileSystemUtilities } from "necessary";
3
+ const { File } = require("occam-entities"),
4
+ { fileSystemUtilities } = require("necessary");
5
5
 
6
6
  const { readFile } = fileSystemUtilities;
7
7
 
8
- export function furtleFileFromNothing() {
9
- const filePath = "/Users/djalbat/Logic/first-order-logic/Functions/Free and bound variables.ftl",
8
+ function furtleFileFromNothing() {
9
+ const filePath = "test/Free and bound variables.ftl",
10
10
  fileContent = readFile(filePath),
11
11
  path = filePath, ///
12
12
  content = fileContent, ///
@@ -16,3 +16,7 @@ export function furtleFileFromNothing() {
16
16
 
17
17
  return furtleFile;
18
18
  }
19
+
20
+ module.exports = {
21
+ furtleFileFromNothing
22
+ };
@@ -1,12 +1,12 @@
1
1
  "use strict";
2
2
 
3
- import { fileSystemUtilities } from "necessary";
4
- import { CustomGrammar, CombinedCustomGrammar } from "occam-custom-grammars";
3
+ const { fileSystemUtilities } = require("necessary"),
4
+ { CustomGrammar, CombinedCustomGrammar } = require("occam-custom-grammars");
5
5
 
6
6
  const { readFile } = fileSystemUtilities;
7
7
 
8
- export function combinedCustomGrammarFromNothing() {
9
- const filePath = "example/customGrammars.json",
8
+ function combinedCustomGrammarFromNothing() {
9
+ const filePath = "test/customGrammars.json",
10
10
  fileContent = readFile(filePath),
11
11
  json = JSON.parse(fileContent),
12
12
  customGrammars = customGrammarsFromJSON(json),
@@ -16,6 +16,10 @@ export function combinedCustomGrammarFromNothing() {
16
16
  return combinedCustomGrammar;
17
17
  }
18
18
 
19
+ module.exports = {
20
+ combinedCustomGrammarFromNothing
21
+ };
22
+
19
23
  function customGrammarsFromJSON(json) {
20
24
  const customGrammarsJSON = json, ///
21
25
  customGrammars = customGrammarsJSON.map((customGrammarsJSON) => {
@@ -1,15 +1,15 @@
1
1
  "use strict";
2
2
 
3
- import { lexersUtilities, parsersUtilities } from "occam-custom-grammars";
3
+ const { lexersUtilities, parsersUtilities } = require("occam-custom-grammars");
4
4
 
5
- import FileContext from "../context/file";
5
+ const FileContext = require("../context/file");
6
6
 
7
- import { combinedCustomGrammarFromNothing } from "../utilities/grammar";
7
+ const { combinedCustomGrammarFromNothing } = require("../helpers/grammar");
8
8
 
9
9
  const { nominalLexerFromCombinedCustomGrammar } = lexersUtilities,
10
10
  { nominalParserFromStartRuleNameAndCombinedCustomGrammar } = parsersUtilities;
11
11
 
12
- export function nominalFileContextFromReleaseContext(releaseContext) {
12
+ function nominalFileContextFromReleaseContext(releaseContext) {
13
13
  const content = `∀n m = m`,
14
14
  startRuleName = "statement",
15
15
  combinedCustomGrammar = combinedCustomGrammarFromNothing(),
@@ -20,8 +20,13 @@ export function nominalFileContextFromReleaseContext(releaseContext) {
20
20
  tokens = lexer.tokenise(content),
21
21
  node = parser.parse(tokens),
22
22
  context = releaseContext, ///
23
- fileContext = FileContext.fromNodeAndTokens(node, tokens, context),
23
+ filePath = "lemmas.nml",
24
+ fileContext = FileContext.fromNodeTokensAndFilePath(node, tokens, filePath, context),
24
25
  nominalFileContext = fileContext; ///
25
26
 
26
27
  return nominalFileContext;
27
28
  }
29
+
30
+ module.exports = {
31
+ nominalFileContextFromReleaseContext
32
+ };
@@ -1,13 +1,17 @@
1
1
  "use strict";
2
2
 
3
- import { arrayUtilities } from "necessary";
3
+ const { arrayUtilities } = require("necessary");
4
4
 
5
5
  const { first } = arrayUtilities;
6
6
 
7
- export function procedureFromReleaseContext(releaseContext) {
7
+ function procedureFromReleaseContext(releaseContext) {
8
8
  const procedures = releaseContext.getProcedures(),
9
9
  firstProcedure = first(procedures),
10
10
  procedure = firstProcedure; ///
11
11
 
12
12
  return procedure;
13
13
  }
14
+
15
+ module.exports = {
16
+ procedureFromReleaseContext
17
+ };
package/test/main.js ADDED
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+
3
+ const { assert } = require("chai");
4
+
5
+ const ReleaseContext = require("./context/release");
6
+
7
+ const { furtleFileFromNothing } = require("./helpers/furtle"),
8
+ { expressionsFromFileContext } = require("./helpers/expressions"),
9
+ { procedureFromReleaseContext } = require("./helpers/procedure"),
10
+ { nominalFileContextFromReleaseContext } = require("./helpers/nominal");
11
+
12
+ describe("src/eliminateLeftRecursion", () => {
13
+ let fileContext,
14
+ releaseContext;
15
+
16
+ before(() => {
17
+ releaseContext = ReleaseContext.fromNothing();
18
+
19
+ const furtleFile = furtleFileFromNothing(),
20
+ file = furtleFile; ///
21
+
22
+ releaseContext.addFile(file);
23
+
24
+ releaseContext.verify();
25
+ });
26
+
27
+ before(() => {
28
+ const nominalFileContext = nominalFileContextFromReleaseContext(releaseContext);
29
+
30
+ fileContext = nominalFileContext; ///
31
+
32
+ releaseContext.addFileContext(fileContext);
33
+ });
34
+
35
+ it("returns true", () => {
36
+ const free = true,
37
+ procedure = procedureFromReleaseContext(releaseContext),
38
+ expressions = expressionsFromFileContext(fileContext, free);
39
+
40
+ // try {
41
+ const context = fileContext, ///
42
+ expression = procedure.call(expressions, context),
43
+ boolean = expression.getBoolean();
44
+
45
+ assert.isTrue(boolean);
46
+
47
+ console.log(boolean);
48
+ // } catch (exception) {
49
+ // const message = exception.getMessage();
50
+ //
51
+ // console.log(message);
52
+ // }
53
+
54
+ });
55
+ });
@@ -1,75 +0,0 @@
1
- Boolean isVariableFree(Node termNode, Node statementNode) {
2
- Boolean variableFree = true;
3
-
4
- Boolean variableBound = isVariableBound(termNode, statementNode);
5
-
6
- If (variableBound) {
7
- variableFree = false;
8
- }
9
-
10
- Return variableFree;
11
- }
12
-
13
- Boolean isVariableBound(Node termNode, Node statementNode) {
14
- Boolean variableBound = false;
15
-
16
- String variableName = variableNameFromTermNode(termNode);
17
-
18
- If (variableName != "") {
19
- Nodes statementNodes = nodesQuery(statementNode, //statement);
20
-
21
- ForEach(statementNodes, (Node statementNode) {
22
- If (!variableBound) {
23
- String boundVariableName = boundVariableNameFromStatementNode(statementNode);
24
-
25
- If (boundVariableName == variableName) {
26
- variableBound = true;
27
- }
28
- }
29
- });
30
- }
31
-
32
- Return variableBound;
33
- }
34
-
35
- String variableNameFromTermNode(Node termNode) {
36
- String variableName = "";
37
-
38
- Node variableIdentifierTerminalNode = nodeQuery(termNode, /term/variable/@identifier);
39
-
40
- If (variableIdentifierTerminalNode != null) {
41
- { String content } = variableIdentifierTerminalNode;
42
-
43
- variableName = content;
44
- }
45
-
46
- Return variableName;
47
- }
48
-
49
- String boundVariableNameFromStatementNode(Node statementNode) {
50
- String boundVariableName = "";
51
-
52
- { Nodes childNodes } = statementNode;
53
-
54
- [ Node firstChildNode ] = childNodes;
55
-
56
- { Boolean terminal } = firstChildNode;
57
-
58
- If (terminal) {
59
- { String content } = firstChildNode;
60
-
61
- If ((content == "∀") || (content == "∃")) {
62
- [ _, Node argumentNode ] = childNodes;
63
-
64
- Node boundVariableIdentifierTerminalNode = nodeQuery(argumentNode, /argument/term/variable!/@identifier);
65
-
66
- If (boundVariableIdentifierTerminalNode != null) {
67
- { String content } = boundVariableIdentifierTerminalNode;
68
-
69
- boundVariableName = content;
70
- }
71
- }
72
- }
73
-
74
- Return boundVariableName;
75
- }