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.
- package/README.md +0 -11
- package/lib/constants.js +29 -1
- package/lib/context/block.js +15 -1
- package/lib/context/file.js +127 -50
- package/lib/element/assignment/array.js +186 -0
- package/lib/element/assignment/object.js +244 -0
- package/lib/element/assignment/variable.js +144 -0
- package/lib/element/assignments/variable.js +158 -0
- package/lib/element/block/return.js +198 -0
- package/lib/element/comparison.js +179 -0
- package/lib/element/declaration/procedure.js +139 -0
- package/lib/{dom → element}/error.js +12 -4
- package/lib/element/every.js +179 -0
- package/lib/element/expression/bitwise.js +186 -0
- package/lib/element/expression/bracketed.js +149 -0
- package/lib/element/expression/negated.js +166 -0
- package/lib/element/expression.js +578 -0
- package/lib/element/expressions.js +210 -0
- package/lib/{dom → element}/label.js +4 -4
- package/lib/element/parameter/named.js +198 -0
- package/lib/element/parameter.js +165 -0
- package/lib/element/parameters/named.js +220 -0
- package/lib/element/parameters.js +198 -0
- package/lib/element/procedure/anonymous.js +181 -0
- package/lib/element/procedure.js +212 -0
- package/lib/element/procedureCall.js +166 -0
- package/lib/element/query/node.js +186 -0
- package/lib/element/query/nodes.js +179 -0
- package/lib/element/reduce.js +181 -0
- package/lib/element/reference.js +138 -0
- package/lib/element/some.js +179 -0
- package/lib/element/statement/return.js +138 -0
- package/lib/element/step.js +154 -0
- package/lib/element/ternary.js +171 -0
- package/lib/element/variable.js +279 -0
- package/lib/elements.js +27 -0
- package/lib/index.js +10 -2
- package/lib/log.js +202 -0
- package/lib/preamble.js +32 -32
- package/lib/process/verify.js +289 -0
- package/lib/utilities/context.js +46 -5
- package/package.json +3 -1
- package/src/constants.js +16 -0
- package/src/context/block.js +10 -0
- package/src/context/file.js +96 -54
- package/src/{dom → element}/assignment/array.js +6 -6
- package/src/{dom → element}/assignment/object.js +8 -8
- package/src/{dom → element}/assignment/variable.js +4 -4
- package/src/{dom → element}/assignments/variable.js +5 -5
- package/src/{dom → element}/block/return.js +5 -5
- package/src/{dom → element}/comparison.js +5 -5
- package/src/{dom → element}/declaration/procedure.js +22 -4
- package/src/{dom → element}/error.js +13 -4
- package/src/{dom → element}/every.js +6 -6
- package/src/{dom → element}/expression/bitwise.js +5 -5
- package/src/{dom → element}/expression/bracketed.js +4 -4
- package/src/{dom → element}/expression/negated.js +5 -5
- package/src/{dom → element}/expression.js +4 -4
- package/src/{dom → element}/expressions.js +6 -6
- package/src/{dom → element}/label.js +4 -4
- package/src/{dom → element}/parameter/named.js +4 -4
- package/src/{dom → element}/parameter.js +4 -4
- package/src/{dom → element}/parameters/named.js +5 -5
- package/src/{dom → element}/parameters.js +5 -5
- package/src/{dom → element}/procedure/anonymous.js +4 -4
- package/src/{dom → element}/procedure.js +5 -5
- package/src/{dom → element}/procedureCall.js +4 -4
- package/src/{dom → element}/query/node.js +5 -5
- package/src/{dom → element}/query/nodes.js +5 -5
- package/src/{dom → element}/reduce.js +5 -5
- package/src/{dom → element}/reference.js +4 -4
- package/src/{dom → element}/some.js +6 -6
- package/src/{dom → element}/statement/return.js +4 -4
- package/src/{dom → element}/step.js +4 -4
- package/src/{dom → element}/ternary.js +4 -4
- package/src/{dom → element}/variable.js +5 -5
- package/src/elements.js +13 -0
- package/src/index.js +5 -1
- package/src/log.js +139 -0
- package/src/preamble.js +31 -31
- package/src/process/verify.js +157 -0
- package/src/utilities/context.js +45 -2
- package/test/Free and bound variables.ftl +112 -0
- package/test/context/file.js +127 -0
- package/{src/example → test}/context/release.js +60 -12
- package/test/helpers/constants.js +17 -0
- package/{src/example/utilities → test/helpers}/expressions.js +8 -4
- package/{src/example/utilities → test/helpers}/furtle.js +8 -4
- package/{src/example/utilities → test/helpers}/grammar.js +8 -4
- package/{src/example/utilities → test/helpers}/nominal.js +10 -5
- package/{src/example/utilities → test/helpers}/procedure.js +6 -2
- package/test/main.js +55 -0
- package/example/Free and bound variables.ftl +0 -75
- package/lib/dom/assignment/array.js +0 -186
- package/lib/dom/assignment/object.js +0 -244
- package/lib/dom/assignment/variable.js +0 -144
- package/lib/dom/assignments/variable.js +0 -158
- package/lib/dom/block/return.js +0 -198
- package/lib/dom/comparison.js +0 -179
- package/lib/dom/declaration/procedure.js +0 -125
- package/lib/dom/every.js +0 -179
- package/lib/dom/expression/bitwise.js +0 -186
- package/lib/dom/expression/bracketed.js +0 -149
- package/lib/dom/expression/negated.js +0 -166
- package/lib/dom/expression.js +0 -578
- package/lib/dom/expressions.js +0 -210
- package/lib/dom/parameter/named.js +0 -198
- package/lib/dom/parameter.js +0 -165
- package/lib/dom/parameters/named.js +0 -220
- package/lib/dom/parameters.js +0 -198
- package/lib/dom/procedure/anonymous.js +0 -181
- package/lib/dom/procedure.js +0 -212
- package/lib/dom/procedureCall.js +0 -166
- package/lib/dom/query/node.js +0 -186
- package/lib/dom/query/nodes.js +0 -179
- package/lib/dom/reduce.js +0 -181
- package/lib/dom/reference.js +0 -138
- package/lib/dom/some.js +0 -179
- package/lib/dom/statement/return.js +0 -138
- package/lib/dom/step.js +0 -154
- package/lib/dom/ternary.js +0 -171
- package/lib/dom/variable.js +0 -279
- package/lib/dom.js +0 -27
- package/lib/example/context/file.js +0 -130
- package/lib/example/context/release.js +0 -160
- package/lib/example/utilities/expressions.js +0 -29
- package/lib/example/utilities/furtle.js +0 -19
- package/lib/example/utilities/grammar.js +0 -26
- package/lib/example/utilities/nominal.js +0 -25
- package/lib/example/utilities/procedure.js +0 -18
- package/src/dom.js +0 -13
- package/src/example/context/file.js +0 -69
- /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
|
-
|
|
4
|
-
import { arrayUtilities } from "necessary";
|
|
3
|
+
const { arrayUtilities } =require("necessary");
|
|
5
4
|
|
|
6
|
-
const {
|
|
5
|
+
const { Log, FileContext } =require("../../lib/index"); ///
|
|
7
6
|
|
|
8
|
-
|
|
9
|
-
|
|
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
|
|
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
|
-
|
|
99
|
+
this.writeToLog(level, message, filePath, lineIndex);
|
|
100
|
+
}
|
|
78
101
|
|
|
79
|
-
|
|
102
|
+
warning(message, filePath = null, lineIndex = null) {
|
|
103
|
+
const level = WARNING_LEVEL;
|
|
80
104
|
|
|
81
|
-
|
|
105
|
+
this.writeToLog(level, message, filePath, lineIndex);
|
|
106
|
+
}
|
|
82
107
|
|
|
83
|
-
error(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
|
|
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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
|
|
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
|
-
|
|
4
|
-
|
|
3
|
+
const { File } = require("occam-entities"),
|
|
4
|
+
{ fileSystemUtilities } = require("necessary");
|
|
5
5
|
|
|
6
6
|
const { readFile } = fileSystemUtilities;
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
const filePath = "/
|
|
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
|
-
|
|
4
|
-
|
|
3
|
+
const { fileSystemUtilities } = require("necessary"),
|
|
4
|
+
{ CustomGrammar, CombinedCustomGrammar } = require("occam-custom-grammars");
|
|
5
5
|
|
|
6
6
|
const { readFile } = fileSystemUtilities;
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
const filePath = "
|
|
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
|
-
|
|
3
|
+
const { lexersUtilities, parsersUtilities } = require("occam-custom-grammars");
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
const FileContext = require("../context/file");
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
const { combinedCustomGrammarFromNothing } = require("../helpers/grammar");
|
|
8
8
|
|
|
9
9
|
const { nominalLexerFromCombinedCustomGrammar } = lexersUtilities,
|
|
10
10
|
{ nominalParserFromStartRuleNameAndCombinedCustomGrammar } = parsersUtilities;
|
|
11
11
|
|
|
12
|
-
|
|
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
|
-
|
|
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
|
-
|
|
3
|
+
const { arrayUtilities } = require("necessary");
|
|
4
4
|
|
|
5
5
|
const { first } = arrayUtilities;
|
|
6
6
|
|
|
7
|
-
|
|
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
|
-
}
|