occam-furtle 2.0.297 → 2.0.300
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/element/assignment/array.js +1 -24
- package/lib/element/assignment/object.js +1 -24
- package/lib/element/assignment/variable.js +2 -59
- package/lib/element/assignments/variable.js +2 -81
- package/lib/element/declaration/procedure.js +2 -59
- package/lib/element/step.js +3 -2
- package/lib/node/assignments/variable.js +29 -2
- package/lib/node/step.js +25 -2
- package/lib/process/verify.js +3 -2
- package/lib/tokenTypes.js +13 -0
- package/lib/utilities/element.js +97 -1
- package/lib/utilities/string.js +53 -0
- package/package.json +4 -4
- package/src/element/assignment/array.js +0 -35
- package/src/element/assignment/object.js +0 -35
- package/src/element/assignment/variable.js +0 -26
- package/src/element/assignments/variable.js +0 -66
- package/src/element/declaration/procedure.js +0 -24
- package/src/element/step.js +5 -4
- package/src/node/assignments/variable.js +31 -0
- package/src/node/step.js +23 -0
- package/src/process/verify.js +3 -2
- package/src/tokenTypes.js +3 -0
- package/src/utilities/element.js +111 -0
- package/src/utilities/string.js +47 -0
- package/test/Free and bound variables.ftl +25 -25
|
@@ -2,6 +2,37 @@
|
|
|
2
2
|
|
|
3
3
|
import AssignmentsNode from "../../node/assignment";
|
|
4
4
|
|
|
5
|
+
import { TYPE_TOKEN_TYPE } from "../../tokenTypes";
|
|
6
|
+
import { VARIABLE_ASSIGNMENT_RULE_NAME } from "../../ruleNames";
|
|
7
|
+
|
|
5
8
|
export default class VariableAssignmentsNode extends AssignmentsNode {
|
|
9
|
+
getType() {
|
|
10
|
+
let type = null;
|
|
11
|
+
|
|
12
|
+
this.someChildNode((childNode, index) => {
|
|
13
|
+
const terminalNode = childNode, ///
|
|
14
|
+
terminalNodeType = terminalNode.getType();
|
|
15
|
+
|
|
16
|
+
if (terminalNodeType === TYPE_TOKEN_TYPE) {
|
|
17
|
+
const content = terminalNode.getContent();
|
|
18
|
+
|
|
19
|
+
type = content; ///
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if (index === 0) {
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
return type;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
getVariableAssignmentNodes() {
|
|
31
|
+
const ruleName = VARIABLE_ASSIGNMENT_RULE_NAME,
|
|
32
|
+
variableAssingnmentNodss = this.getNodesByRuleName(ruleName);
|
|
33
|
+
|
|
34
|
+
return variableAssingnmentNodss;
|
|
35
|
+
}
|
|
36
|
+
|
|
6
37
|
static fromRuleNameChildNodesOpacityAndPrecedence(ruleName, childNodes, opacity, precedence) { return AssignmentsNode.fromRuleNameChildNodesOpacityAndPrecedence(VariableAssignmentsNode, ruleName, childNodes, opacity, precedence); }
|
|
7
38
|
}
|
package/src/node/step.js
CHANGED
|
@@ -2,6 +2,29 @@
|
|
|
2
2
|
|
|
3
3
|
import NonTerminalNode from "../nonTerminalNode";
|
|
4
4
|
|
|
5
|
+
import { ARRAY_ASSIGNMENT_RULE_NAME, OBJECT_ASSIGNMENT_RULE_NAME, VARIABLE_ASSIGNMENTS_RULE_NAME } from "../ruleNames"
|
|
6
|
+
|
|
5
7
|
export default class StepNode extends NonTerminalNode {
|
|
8
|
+
getArrayAssignmentNode() {
|
|
9
|
+
const ruleName = ARRAY_ASSIGNMENT_RULE_NAME,
|
|
10
|
+
arrayAssignmentNode = this.getNodeByRuleName(ruleName);
|
|
11
|
+
|
|
12
|
+
return arrayAssignmentNode;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
getObjectAssignmentNode() {
|
|
16
|
+
const ruleName = OBJECT_ASSIGNMENT_RULE_NAME,
|
|
17
|
+
objectAssignmentNode = this.getNodeByRuleName(ruleName);
|
|
18
|
+
|
|
19
|
+
return objectAssignmentNode;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
getVariableAssignmentsNode() {
|
|
23
|
+
const ruleName = VARIABLE_ASSIGNMENTS_RULE_NAME,
|
|
24
|
+
variableAssignmentsNode = this.getNodeByRuleName(ruleName);
|
|
25
|
+
|
|
26
|
+
return variableAssignmentsNode;
|
|
27
|
+
}
|
|
28
|
+
|
|
6
29
|
static fromRuleNameChildNodesOpacityAndPrecedence(ruleName, childNodes, opacity, precedence) { return NonTerminalNode.fromRuleNameChildNodesOpacityAndPrecedence(StepNode, ruleName, childNodes, opacity, precedence); }
|
|
7
30
|
}
|
package/src/process/verify.js
CHANGED
|
@@ -4,6 +4,8 @@ import { nodeQuery } from "../utilities/query";
|
|
|
4
4
|
|
|
5
5
|
import elements from "../elements";
|
|
6
6
|
|
|
7
|
+
import { procedureDeclarationFromProcedureDeclarationNode } from "../utilities/element";
|
|
8
|
+
|
|
7
9
|
const nonTerminalNodeQuery = nodeQuery("/*");
|
|
8
10
|
|
|
9
11
|
const errorNodeQuery = nodeQuery("/error"),
|
|
@@ -128,8 +130,7 @@ class TopLevelPass extends Pass {
|
|
|
128
130
|
run: (procedureDeclarationNode, context) => {
|
|
129
131
|
let success = false;
|
|
130
132
|
|
|
131
|
-
const
|
|
132
|
-
procedureDeclaration = ProcedureDeclaration.fromProcedureDeclarationNode(procedureDeclarationNode, context),
|
|
133
|
+
const procedureDeclaration = procedureDeclarationFromProcedureDeclarationNode(procedureDeclarationNode, context),
|
|
133
134
|
procedureDeclarationVerifies = procedureDeclaration.verify(context);
|
|
134
135
|
|
|
135
136
|
if (procedureDeclarationVerifies) {
|
package/src/utilities/element.js
CHANGED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import elements from "../elements";
|
|
4
|
+
|
|
5
|
+
import { procedureDeclarationStringFromProcedure,
|
|
6
|
+
arrayAssignmentStringFromVariableAndParameters,
|
|
7
|
+
variableAssignmentStringFromExpressionAndVariable,
|
|
8
|
+
objectAssignmentStringFromVariableAndNamedParameters,
|
|
9
|
+
varaibleAssignmentsStringFromVariableAssignmentsArray } from "../utilities/string";
|
|
10
|
+
|
|
11
|
+
export function arrayAssignmentFromArrayAssignmentNode(arrayAssignmentNode, context) {
|
|
12
|
+
const { Variable, Parameters, ArrayAssignment } = elements,
|
|
13
|
+
parameters = Parameters.fromArrayAssignmentNode(arrayAssignmentNode, context),
|
|
14
|
+
variable = Variable.fromArrayAssignmentNode(arrayAssignmentNode, context),
|
|
15
|
+
arrayAssignmentString = arrayAssignmentStringFromVariableAndParameters(variable, parameters),
|
|
16
|
+
string = arrayAssignmentString, ///
|
|
17
|
+
arrayAssignment = new ArrayAssignment(string, variable, parameters);
|
|
18
|
+
|
|
19
|
+
return arrayAssignment;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function objectAssignmentFromObjectAssignmentNode(objectAssignmentNode, context) {
|
|
23
|
+
const { Variable, NamedParameters, ObjectAssigment } = elements,
|
|
24
|
+
namedParameters = NamedParameters.fromObjectAssignmentNode(objectAssignmentNode, context),
|
|
25
|
+
variable = Variable.fromObjectAssignmentNode(objectAssignmentNode, context),
|
|
26
|
+
objectAssignmentString = objectAssignmentStringFromVariableAndNamedParameters(variable, namedParameters, context),
|
|
27
|
+
string = objectAssignmentString, ///
|
|
28
|
+
objectAssignment = new ObjectAssigment(string, variable, namedParameters);
|
|
29
|
+
|
|
30
|
+
return objectAssignment;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function variableAssignmentsFromVariableAssignmentsNode(variableAssignmentsNode, context) {
|
|
34
|
+
const { VariableAssignments } = elements,
|
|
35
|
+
variableAssignmentsArray = variableAssignmentsArrayFromVariableAssignmentsNode(variableAssignmentsNode, context),
|
|
36
|
+
variableAssignmentsString = varaibleAssignmentsStringFromVariableAssignmentsArray(variableAssignmentsArray, context),
|
|
37
|
+
string = variableAssignmentsString, ///
|
|
38
|
+
array = variableAssignmentsArray, ///
|
|
39
|
+
variableAssignments = new VariableAssignments(string, array);
|
|
40
|
+
|
|
41
|
+
return variableAssignments;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function arrayAssignmentFromStepNode(stepNode, context) {
|
|
45
|
+
let arrayAssignment = null;
|
|
46
|
+
|
|
47
|
+
const arrayAssignmentNode = stepNode.getArrayAssignmentNode();
|
|
48
|
+
|
|
49
|
+
if (arrayAssignmentNode !== null) {
|
|
50
|
+
arrayAssignment = arrayAssignmentFromArrayAssignmentNode(arrayAssignmentNode, context);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return arrayAssignment;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function objectAssignmentFromStepNode(stepNode, context) {
|
|
57
|
+
let objectAssignment = null;
|
|
58
|
+
|
|
59
|
+
const objectAssignmentNode = stepNode.getObjectAssignmentNode();
|
|
60
|
+
|
|
61
|
+
if (objectAssignmentNode !== null) {
|
|
62
|
+
objectAssignment = objectAssignmentFromObjectAssignmentNode(objectAssignmentNode, context);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return objectAssignment;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export function variableAssignmentsFromStepNode(stepNode, context) {
|
|
69
|
+
let variableAssignments = null;
|
|
70
|
+
|
|
71
|
+
const variableAssignmentsNode = stepNode.getVariableAssignmentsNode();
|
|
72
|
+
|
|
73
|
+
if (variableAssignmentsNode !== null) {
|
|
74
|
+
variableAssignments = variableAssignmentsFromVariableAssignmentsNode(variableAssignmentsNode, context);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return variableAssignments;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export function procedureDeclarationFromProcedureDeclarationNode(procedureDeclarationNode, context) {
|
|
81
|
+
const { Procedure, ProcedureDeclaration } = elements,
|
|
82
|
+
procedure = Procedure.fromProcedureDeclarationNode(procedureDeclarationNode, context),
|
|
83
|
+
procedureDeclarationString = procedureDeclarationStringFromProcedure(procedure),
|
|
84
|
+
string = procedureDeclarationString, ///
|
|
85
|
+
procedureDeclaration = new ProcedureDeclaration(string, procedure);
|
|
86
|
+
|
|
87
|
+
return procedureDeclaration;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export function variableAssignmentsArrayFromVariableAssignmentsNode(variableAssignmentsNode, context) {
|
|
91
|
+
const type = variableAssignmentsNode.getType(),
|
|
92
|
+
variableAssignmentNodes = variableAssignmentsNode.getVariableAssignmentNodes(),
|
|
93
|
+
variableAssignmentsArray = variableAssignmentNodes.map((variableAssignmentNode) => {
|
|
94
|
+
const variableAssignment = variableAssignmentFromTypeAndVariableAssignmentNode(type, variableAssignmentNode, context);
|
|
95
|
+
|
|
96
|
+
return variableAssignment;
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
return variableAssignmentsArray;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export function variableAssignmentFromTypeAndVariableAssignmentNode(type, variableAssignmentNode, context) {
|
|
103
|
+
const { Variable, Expression, VariableAssignment } = elements,
|
|
104
|
+
expression = Expression.fromVariableAssignmentNode(variableAssignmentNode, context),
|
|
105
|
+
variable = Variable.fromTypeAndVariableAssignmentNode(type, variableAssignmentNode, context),
|
|
106
|
+
variableAssignmentString = variableAssignmentStringFromExpressionAndVariable(expression, variable, context),
|
|
107
|
+
string = variableAssignmentString, ///
|
|
108
|
+
assignment = new VariableAssignment(string, variable, expression);
|
|
109
|
+
|
|
110
|
+
return assignment;
|
|
111
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
export function procedureDeclarationStringFromProcedure(procedure) {
|
|
4
|
+
const procedureString = procedure.getString(),
|
|
5
|
+
procedureDeclarationString = `${procedureString};`;
|
|
6
|
+
|
|
7
|
+
return procedureDeclarationString;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function arrayAssignmentStringFromVariableAndParameters(variable, parameters) {
|
|
11
|
+
const variableString = variable.getString(),
|
|
12
|
+
parametersString = parameters.getString(),
|
|
13
|
+
arrayAssignmentString = `[ ${parametersString} ] = ${variableString};`;
|
|
14
|
+
|
|
15
|
+
return arrayAssignmentString;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function variableAssignmentStringFromExpressionAndVariable(expression, variable, context) {
|
|
19
|
+
const variableString = variable.getString(),
|
|
20
|
+
expressionString = expression.asString(context),
|
|
21
|
+
variableAssignmentString = `${variableString} = ${expressionString};`;
|
|
22
|
+
|
|
23
|
+
return variableAssignmentString;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function objectAssignmentStringFromVariableAndNamedParameters(variable, namedParameters) {
|
|
27
|
+
const variableString = variable.getString(),
|
|
28
|
+
namedParametersString = namedParameters.getString(),
|
|
29
|
+
objectAssignmentString = `{ ${namedParametersString} } = ${variableString};`;
|
|
30
|
+
|
|
31
|
+
return objectAssignmentString;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function varaibleAssignmentsStringFromVariableAssignmentsArray(variableAssignmentsArray) {
|
|
35
|
+
const variableAssignmentsString = variableAssignmentsArray.reduce((variableAssignmentsString, variableAssignment) => {
|
|
36
|
+
const variableAssignmentString = variableAssignment.getString();
|
|
37
|
+
|
|
38
|
+
variableAssignmentsString = (variableAssignmentsString === null) ?
|
|
39
|
+
variableAssignmentString :
|
|
40
|
+
`${variableAssignmentsString}, ${variableAssignmentString}`;
|
|
41
|
+
|
|
42
|
+
return variableAssignmentsString;
|
|
43
|
+
}, null),
|
|
44
|
+
string = variableAssignmentsString; ///
|
|
45
|
+
|
|
46
|
+
return string;
|
|
47
|
+
}
|
|
@@ -3,7 +3,7 @@ Boolean isVariableFree(Node termNode, Node statementNode) {
|
|
|
3
3
|
|
|
4
4
|
Boolean variableFree = !variableBound;
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
return variableFree;
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
Boolean isVariableBound(Node termNode, Node statementNode) {
|
|
@@ -11,14 +11,14 @@ Boolean isVariableBound(Node termNode, Node statementNode) {
|
|
|
11
11
|
|
|
12
12
|
Boolean variableBound =
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
if (variableIdentitifer != "")
|
|
15
15
|
variableBoundFromVariableIdentifierAndStatementNode(variableIdentitifer, statementNode)
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
else
|
|
18
18
|
false
|
|
19
19
|
;
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
return variableBound;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
String variableIdentitiferFromTermNode(Node termNode) {
|
|
@@ -26,21 +26,21 @@ String variableIdentitiferFromTermNode(Node termNode) {
|
|
|
26
26
|
|
|
27
27
|
String variableIdentitifer =
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
{ String content
|
|
29
|
+
if (variableIdentifierTerminalNode != null) {
|
|
30
|
+
{ String content as variableIdentitifer } = variableIdentifierTerminalNode;
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
return variableIdentitifer;
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
else
|
|
36
36
|
""
|
|
37
37
|
;
|
|
38
38
|
|
|
39
|
-
|
|
39
|
+
return variableIdentitifer;
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
String boundVariableIdentifierFromStatementNode(Node statementNode) {
|
|
43
|
-
{ Nodes childNodes
|
|
43
|
+
{ Nodes childNodes as statementChildNodes } = statementNode;
|
|
44
44
|
|
|
45
45
|
[ Node firstStatementChildNode ] = statementChildNodes;
|
|
46
46
|
|
|
@@ -48,14 +48,14 @@ String boundVariableIdentifierFromStatementNode(Node statementNode) {
|
|
|
48
48
|
|
|
49
49
|
String boundVariableIdentifier =
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
if (terminal)
|
|
52
52
|
boundVariableIdentifierFromStatementChildNodes(statementChildNodes)
|
|
53
53
|
|
|
54
|
-
|
|
54
|
+
else
|
|
55
55
|
""
|
|
56
56
|
;
|
|
57
57
|
|
|
58
|
-
|
|
58
|
+
return boundVariableIdentifier;
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
String boundVariableIdentifierFromStatementChildNodes(Nodes statementChildNodes) {
|
|
@@ -65,18 +65,18 @@ String boundVariableIdentifierFromStatementChildNodes(Nodes statementChildNodes)
|
|
|
65
65
|
|
|
66
66
|
String boundVariableIdentifier =
|
|
67
67
|
|
|
68
|
-
|
|
68
|
+
if ((content == "∀") || (content == "∃")) {
|
|
69
69
|
[ _, Node argumentNode ] = statementChildNodes;
|
|
70
70
|
|
|
71
71
|
String boundVariableIdentifier = boundVariableIdentifierFromArgumentNode(argumentNode);
|
|
72
72
|
|
|
73
|
-
|
|
73
|
+
return boundVariableIdentifier;
|
|
74
74
|
}
|
|
75
|
-
|
|
75
|
+
else
|
|
76
76
|
""
|
|
77
77
|
;
|
|
78
78
|
|
|
79
|
-
|
|
79
|
+
return boundVariableIdentifier;
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
String boundVariableIdentifierFromArgumentNode(Node argumentNode) {
|
|
@@ -84,29 +84,29 @@ String boundVariableIdentifierFromArgumentNode(Node argumentNode) {
|
|
|
84
84
|
|
|
85
85
|
String boundVariableIdentifier =
|
|
86
86
|
|
|
87
|
-
|
|
88
|
-
{ String content
|
|
87
|
+
if (boundVariableIdentityTerminalNode != null) {
|
|
88
|
+
{ String content as boundVariableIdentifier } = boundVariableIdentityTerminalNode;
|
|
89
89
|
|
|
90
|
-
|
|
90
|
+
return boundVariableIdentifier;
|
|
91
91
|
}
|
|
92
92
|
|
|
93
|
-
|
|
93
|
+
else
|
|
94
94
|
""
|
|
95
95
|
;
|
|
96
96
|
|
|
97
|
-
|
|
97
|
+
return boundVariableIdentifier;
|
|
98
98
|
}
|
|
99
99
|
|
|
100
100
|
Boolean variableBoundFromVariableIdentifierAndStatementNode(String variableIdentitifer, Node statementNode) {
|
|
101
101
|
Nodes statementNodes = nodesQuery(statementNode, "//statement");
|
|
102
102
|
|
|
103
|
-
Boolean variableBound =
|
|
103
|
+
Boolean variableBound = some(statementNodes, Boolean (Node statementNode) {
|
|
104
104
|
String boundVariableIdentifier = boundVariableIdentifierFromStatementNode(statementNode);
|
|
105
105
|
|
|
106
106
|
Boolean variableBound = (boundVariableIdentifier == variableIdentitifer);
|
|
107
107
|
|
|
108
|
-
|
|
108
|
+
return variableBound;
|
|
109
109
|
});
|
|
110
110
|
|
|
111
|
-
|
|
111
|
+
return variableBound;
|
|
112
112
|
}
|