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
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import elements from "../elements";
|
|
4
4
|
import Exception from "../exception";
|
|
5
5
|
|
|
6
|
+
import { define } from "../elements";
|
|
6
7
|
import { nodeQuery } from "../utilities/query";
|
|
7
8
|
import { NODES_TYPE } from "../types";
|
|
8
|
-
import { domAssigned } from "../dom";
|
|
9
9
|
|
|
10
10
|
const expressionReduceNodeQuery = nodeQuery("/expression/reduce");
|
|
11
11
|
|
|
12
|
-
export default
|
|
12
|
+
export default define(class Reduce {
|
|
13
13
|
constructor(string, variable, initialExpression, anonymousProcedure) {
|
|
14
14
|
this.string = string;
|
|
15
15
|
this.variable = variable;
|
|
@@ -58,7 +58,7 @@ export default domAssigned(class Reduce {
|
|
|
58
58
|
expression = nodes.reduce((currentExpression, node) => {
|
|
59
59
|
let expression;
|
|
60
60
|
|
|
61
|
-
const { Expression, Expressions } =
|
|
61
|
+
const { Expression, Expressions } = elements;
|
|
62
62
|
|
|
63
63
|
expression = currentExpression; ///
|
|
64
64
|
|
|
@@ -96,7 +96,7 @@ export default domAssigned(class Reduce {
|
|
|
96
96
|
});
|
|
97
97
|
|
|
98
98
|
function reduceFromReduceNode(reduceNode, context) {
|
|
99
|
-
const { Reduce, Variable, Expression, AnonymousProcedure } =
|
|
99
|
+
const { Reduce, Variable, Expression, AnonymousProcedure } = elements,
|
|
100
100
|
expression = Expression.fromReduceNode(reduceNode, context),
|
|
101
101
|
variable = Variable.fromReduceNode(reduceNode, context),
|
|
102
102
|
initialExpression = expression, ///
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import elements from "../elements";
|
|
4
4
|
|
|
5
|
+
import { define } from "../elements";
|
|
5
6
|
import { nodeQuery } from "../utilities/query";
|
|
6
|
-
import { domAssigned } from "../dom";
|
|
7
7
|
|
|
8
8
|
const procedureCallReferenceNodeQuery = nodeQuery("/procedureCall/reference!"),
|
|
9
9
|
referenceNameTerminalNodeQuery = nodeQuery("/reference/@name");
|
|
10
10
|
|
|
11
|
-
export default
|
|
11
|
+
export default define(class Reference {
|
|
12
12
|
constructor(string, name) {
|
|
13
13
|
this.string = string;
|
|
14
14
|
this.name = name;
|
|
@@ -40,7 +40,7 @@ export default domAssigned(class Reference {
|
|
|
40
40
|
});
|
|
41
41
|
|
|
42
42
|
function referenceFromReferenceNode(referenceNode, context) {
|
|
43
|
-
const { Reference } =
|
|
43
|
+
const { Reference } = elements,
|
|
44
44
|
name = nameFromReferenceNode(referenceNode, context),
|
|
45
45
|
string = stringFromName(name, context),
|
|
46
46
|
reference = new Reference(string, name);
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import elements from "../elements";
|
|
4
4
|
import Exception from "../exception";
|
|
5
5
|
|
|
6
|
+
import { define } from "../elements";
|
|
6
7
|
import { nodeQuery } from "../utilities/query";
|
|
7
|
-
import { domAssigned } from "../dom";
|
|
8
8
|
import { NODES_TYPE, BOOLEAN_TYPE } from "../types";
|
|
9
9
|
|
|
10
10
|
const expressionSomeNodeQuery = nodeQuery("/expression/some");
|
|
11
11
|
|
|
12
|
-
export default
|
|
12
|
+
export default define(class Some {
|
|
13
13
|
constructor(string, variable, anonymousProcedure) {
|
|
14
14
|
this.string = string;
|
|
15
15
|
this.variable = variable;
|
|
@@ -51,7 +51,7 @@ export default domAssigned(class Some {
|
|
|
51
51
|
boolean = nodes.some((node) => {
|
|
52
52
|
let expression;
|
|
53
53
|
|
|
54
|
-
const { Expression, Expressions } =
|
|
54
|
+
const { Expression, Expressions } = elements;
|
|
55
55
|
|
|
56
56
|
expression = Expression.fromNode(node, context);
|
|
57
57
|
|
|
@@ -74,7 +74,7 @@ export default domAssigned(class Some {
|
|
|
74
74
|
return boolean;
|
|
75
75
|
});
|
|
76
76
|
|
|
77
|
-
const { Expression } =
|
|
77
|
+
const { Expression } = elements;
|
|
78
78
|
|
|
79
79
|
expression = Expression.fromBoolean(boolean, context);
|
|
80
80
|
|
|
@@ -101,7 +101,7 @@ export default domAssigned(class Some {
|
|
|
101
101
|
});
|
|
102
102
|
|
|
103
103
|
function someFromSomeNode(someNode, context) {
|
|
104
|
-
const { Some, Variable, AnonymousProcedure } =
|
|
104
|
+
const { Some, Variable, AnonymousProcedure } = elements,
|
|
105
105
|
anonymousProcedure = AnonymousProcedure.fromSomeNode(someNode, context),
|
|
106
106
|
variable = Variable.fromSomeNode(someNode, context),
|
|
107
107
|
string = stringFromVariableAndAnonymousProcedure(variable, anonymousProcedure, context),
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import elements from "../../elements";
|
|
4
4
|
|
|
5
|
+
import { define } from "../../elements";
|
|
5
6
|
import { nodeQuery } from "../../utilities/query";
|
|
6
|
-
import { domAssigned } from "../../dom";
|
|
7
7
|
|
|
8
8
|
const returnBlockReturnStatementNodeQuery = nodeQuery("/returnBlock/returnStatement");
|
|
9
9
|
|
|
10
|
-
export default
|
|
10
|
+
export default define(class ReturnStatement {
|
|
11
11
|
constructor(string, expression) {
|
|
12
12
|
this.string = string;
|
|
13
13
|
this.expression = expression;
|
|
@@ -47,7 +47,7 @@ export default domAssigned(class ReturnStatement {
|
|
|
47
47
|
});
|
|
48
48
|
|
|
49
49
|
function returnStatementFromReturnStatementNode(returnStatementNode, context) {
|
|
50
|
-
const { Expression, ReturnStatement } =
|
|
50
|
+
const { Expression, ReturnStatement } = elements,
|
|
51
51
|
expression = Expression.fromReturnStatementNode(returnStatementNode, context),
|
|
52
52
|
string = stringFromExpression(expression, context),
|
|
53
53
|
returnStatement = new ReturnStatement(string, expression);
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import elements from "../elements";
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { define } from "../elements";
|
|
6
6
|
import { EMPTY_STRING } from "../constants";
|
|
7
7
|
|
|
8
|
-
export default
|
|
8
|
+
export default define(class Step {
|
|
9
9
|
constructor(string, arrayAssignment, objectAssigment, variablesDeclaration) {
|
|
10
10
|
this.string = string;
|
|
11
11
|
this.arrayAssignment = arrayAssignment;
|
|
@@ -51,7 +51,7 @@ export default domAssigned(class Step {
|
|
|
51
51
|
});
|
|
52
52
|
|
|
53
53
|
function stepFromStepNode(stepNode, context) {
|
|
54
|
-
const { Step, ArrayAssignment, ObjectAssigment, VariableAssignments } =
|
|
54
|
+
const { Step, ArrayAssignment, ObjectAssigment, VariableAssignments } = elements,
|
|
55
55
|
string = stringFromNothing(context),
|
|
56
56
|
arrayAssignment = ArrayAssignment.fromStepNode(stepNode, context),
|
|
57
57
|
objectAssigment = ObjectAssigment.fromStepNode(stepNode, context),
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import elements from "../elements";
|
|
4
4
|
import Exception from "../exception";
|
|
5
5
|
|
|
6
|
+
import { define } from "../elements";
|
|
6
7
|
import { nodeQuery } from "../utilities/query";
|
|
7
|
-
import { domAssigned } from "../dom";
|
|
8
8
|
import { BOOLEAN_TYPE } from "../types";
|
|
9
9
|
|
|
10
10
|
const ifExpressionNodeQuery = nodeQuery("/ternary/expression[1]"),
|
|
11
11
|
elseExpressionNodeQuery = nodeQuery("/ternary/expression[2]"),
|
|
12
12
|
expressionTernaryNodeQuery = nodeQuery("/expression/ternary");
|
|
13
13
|
|
|
14
|
-
export default
|
|
14
|
+
export default define(class Ternary {
|
|
15
15
|
constructor(string, expression, ifExpression, elseExpression) {
|
|
16
16
|
this.string = string;
|
|
17
17
|
this.expression = expression;
|
|
@@ -83,7 +83,7 @@ export default domAssigned(class Ternary {
|
|
|
83
83
|
});
|
|
84
84
|
|
|
85
85
|
function ternaryFromTernaryNode(ternaryNode, context) {
|
|
86
|
-
const { Expression, Ternary } =
|
|
86
|
+
const { Expression, Ternary } = elements,
|
|
87
87
|
ifExpressionNode = ifExpressionNodeQuery(ternaryNode),
|
|
88
88
|
elseExpressionNode = elseExpressionNodeQuery(ternaryNode),
|
|
89
89
|
expression = Expression.fromTernaryNode(ternaryNode, context),
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import elements from "../elements";
|
|
4
4
|
import Exception from "../exception";
|
|
5
5
|
|
|
6
|
+
import { define } from "../elements";
|
|
6
7
|
import { nodeQuery } from "../utilities/query";
|
|
7
|
-
import { domAssigned } from "../dom";
|
|
8
8
|
|
|
9
9
|
const someVariableNodeQuery = nodeQuery("/some/variable"),
|
|
10
10
|
everyVariableNodeQuery = nodeQuery("/every/variable"),
|
|
@@ -17,7 +17,7 @@ const someVariableNodeQuery = nodeQuery("/some/variable"),
|
|
|
17
17
|
objectAssignmentVariableNodeQuery = nodeQuery("/objectAssignment/variable"),
|
|
18
18
|
variableAssignmentVariableNodeQuery = nodeQuery("/variableAssignment/variable");
|
|
19
19
|
|
|
20
|
-
export default
|
|
20
|
+
export default define(class Variable {
|
|
21
21
|
constructor(string, type, name, expression) {
|
|
22
22
|
this.string = string;
|
|
23
23
|
this.type = type;
|
|
@@ -221,7 +221,7 @@ export default domAssigned(class Variable {
|
|
|
221
221
|
});
|
|
222
222
|
|
|
223
223
|
function variableFromTypeAndVariableNode(type, variableNode, context) {
|
|
224
|
-
const { Variable } =
|
|
224
|
+
const { Variable } = elements,
|
|
225
225
|
name = nameFromVariableNode(variableNode),
|
|
226
226
|
expression = null,
|
|
227
227
|
string = stringFromName(name, context),
|
|
@@ -231,7 +231,7 @@ function variableFromTypeAndVariableNode(type, variableNode, context) {
|
|
|
231
231
|
}
|
|
232
232
|
|
|
233
233
|
function variableFromVariableNode(variableNode, context) {
|
|
234
|
-
const { Variable } =
|
|
234
|
+
const { Variable } = elements,
|
|
235
235
|
type = null,
|
|
236
236
|
name = nameFromVariableNode(variableNode),
|
|
237
237
|
expression = null,
|
package/src/elements.js
ADDED
package/src/index.js
CHANGED
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
import "./preamble";
|
|
4
4
|
|
|
5
|
-
export { default as Expressions } from "./
|
|
5
|
+
export { default as Expressions } from "./element/expressions";
|
|
6
|
+
|
|
7
|
+
export { default as Log } from "./log";
|
|
6
8
|
export { default as FileContext } from "./context/file";
|
|
9
|
+
|
|
7
10
|
export { default as stringUtilities } from "./utilities/string";
|
|
11
|
+
export { default as contextUtilities } from "./utilities/context";
|
package/src/log.js
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { LEVELS, SINGLE_SPACE, EMPTY_STRING, LEVEL_MAXIMUM_LENGTH, LINE_INDEX_MAXIMUM_LENGTH } from "./constants";
|
|
4
|
+
|
|
5
|
+
const [ TRACE_LEVEL, DEBUG_LEVEL, INFO_LEVEL, WARNING_LEVEL, ERROR_LEVEL ] = LEVELS;
|
|
6
|
+
|
|
7
|
+
export default class Log {
|
|
8
|
+
constructor(messages, logLevel, follow) {
|
|
9
|
+
this.messages = messages;
|
|
10
|
+
this.logLevel = logLevel;
|
|
11
|
+
this.follow = follow;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
getMessages() {
|
|
15
|
+
return this.messages;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
getLogLevel() {
|
|
19
|
+
return this.logLevel;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
getFollow() {
|
|
23
|
+
return this.follow;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
trace(message, filePath = null, lineIndex = null) {
|
|
27
|
+
const level = TRACE_LEVEL;
|
|
28
|
+
|
|
29
|
+
this.write(level, message, filePath, lineIndex);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
debug(message, filePath = null, lineIndex = null) {
|
|
33
|
+
const level = DEBUG_LEVEL;
|
|
34
|
+
|
|
35
|
+
this.write(level, message, filePath, lineIndex);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
info(message, filePath = null, lineIndex = null) {
|
|
39
|
+
const level = INFO_LEVEL;
|
|
40
|
+
|
|
41
|
+
this.write(level, message, filePath, lineIndex);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
warning(message, filePath = null, lineIndex = null) {
|
|
45
|
+
const level = WARNING_LEVEL;
|
|
46
|
+
|
|
47
|
+
this.write(level, message, filePath, lineIndex);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
error(message, filePath = null, lineIndex = null) {
|
|
51
|
+
const level = ERROR_LEVEL;
|
|
52
|
+
|
|
53
|
+
this.write(level, message, filePath, lineIndex);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
write(level, message, filePath, lineIndex) {
|
|
57
|
+
const levelIndex = LEVELS.indexOf(level),
|
|
58
|
+
logLevelIndex = LEVELS.indexOf(this.logLevel);
|
|
59
|
+
|
|
60
|
+
if (levelIndex < logLevelIndex) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
message = formatMessage(level, message, filePath, lineIndex); ///
|
|
65
|
+
|
|
66
|
+
this.follow ?
|
|
67
|
+
console.log(message) :
|
|
68
|
+
this.messages.push(message);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
static fromNothing() {
|
|
72
|
+
const messages = null,
|
|
73
|
+
logLevel = TRACE_LEVEL,
|
|
74
|
+
follow = true,
|
|
75
|
+
log = new Log(messages, logLevel, follow);
|
|
76
|
+
|
|
77
|
+
return log;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
static fromFollowAndLogLevel(follow, logLevel) {
|
|
81
|
+
const messages = follow ?
|
|
82
|
+
null :
|
|
83
|
+
[],
|
|
84
|
+
log = new Log(messages, logLevel, follow);
|
|
85
|
+
|
|
86
|
+
return log;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function formatMessage(level, message, filePath, lineIndex) {
|
|
91
|
+
let formattedMessage = EMPTY_STRING;
|
|
92
|
+
|
|
93
|
+
const leftPaddedLevel = leftPadLevel(level),
|
|
94
|
+
upperCaseLeftPaddedLevel = leftPaddedLevel.toUpperCase();
|
|
95
|
+
|
|
96
|
+
formattedMessage += `${upperCaseLeftPaddedLevel}:`;
|
|
97
|
+
|
|
98
|
+
if (filePath !== null) {
|
|
99
|
+
formattedMessage += ` ${filePath}`;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (lineIndex !== null) {
|
|
103
|
+
const leftPaddedLineIndex = leftPadLineIndex(lineIndex);
|
|
104
|
+
|
|
105
|
+
formattedMessage += ` [${leftPaddedLineIndex}]`;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
formattedMessage += ` - ${message}`;
|
|
109
|
+
|
|
110
|
+
message = formattedMessage; ///
|
|
111
|
+
|
|
112
|
+
return message;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function leftPadLineIndex(lineIndex) {
|
|
116
|
+
lineIndex = `${lineIndex}`;
|
|
117
|
+
|
|
118
|
+
const maximumLength = LINE_INDEX_MAXIMUM_LENGTH,
|
|
119
|
+
leftPaddedLineIndex = leftPad(lineIndex, maximumLength);
|
|
120
|
+
|
|
121
|
+
return leftPaddedLineIndex;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function leftPadLevel(level) {
|
|
125
|
+
const maximumLength = LEVEL_MAXIMUM_LENGTH,
|
|
126
|
+
leftPaddedLevel = leftPad(level, maximumLength);
|
|
127
|
+
|
|
128
|
+
return leftPaddedLevel;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function leftPad(string, maximumLength) {
|
|
132
|
+
const stringLength = string.length,
|
|
133
|
+
length = maximumLength - stringLength,
|
|
134
|
+
indent = SINGLE_SPACE.repeat(length),
|
|
135
|
+
leftPaddedString = `${indent}${string}`;
|
|
136
|
+
|
|
137
|
+
return leftPaddedString;
|
|
138
|
+
}
|
|
139
|
+
|
package/src/preamble.js
CHANGED
|
@@ -1,33 +1,33 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import Step from "./
|
|
4
|
-
import Some from "./
|
|
5
|
-
import Label from "./
|
|
6
|
-
import Error from "./
|
|
7
|
-
import Every from "./
|
|
8
|
-
import Reduce from "./
|
|
9
|
-
import Ternary from "./
|
|
10
|
-
import Variable from "./
|
|
11
|
-
import Reference from "./
|
|
12
|
-
import Procedure from "./
|
|
13
|
-
import NodeQuery from "./
|
|
14
|
-
import Parameter from "./
|
|
15
|
-
import Parameters from "./
|
|
16
|
-
import NodesQuery from "./
|
|
17
|
-
import Comparison from "./
|
|
18
|
-
import Expression from "./
|
|
19
|
-
import Expressions from "./
|
|
20
|
-
import ReturnBlock from "./
|
|
21
|
-
import ProcedureCall from "./
|
|
22
|
-
import NamedParameter from "./
|
|
23
|
-
import ArrayAssigment from "./
|
|
24
|
-
import ReturnStatement from "./
|
|
25
|
-
import NamedParameters from "./
|
|
26
|
-
import ObjectAssignment from "./
|
|
27
|
-
import NegatedExpression from "./
|
|
28
|
-
import BitwiseExpression from "./
|
|
29
|
-
import AnonymousProcedure from "./
|
|
30
|
-
import VariableAssignment from "./
|
|
31
|
-
import BracketedExpression from "./
|
|
32
|
-
import VariableAssignments from "./
|
|
33
|
-
import ProcedureDeclaration from "./
|
|
3
|
+
import Step from "./element/step";
|
|
4
|
+
import Some from "./element/some";
|
|
5
|
+
import Label from "./element/label";
|
|
6
|
+
import Error from "./element/error";
|
|
7
|
+
import Every from "./element/every";
|
|
8
|
+
import Reduce from "./element/reduce";
|
|
9
|
+
import Ternary from "./element/ternary";
|
|
10
|
+
import Variable from "./element/variable";
|
|
11
|
+
import Reference from "./element/reference";
|
|
12
|
+
import Procedure from "./element/procedure";
|
|
13
|
+
import NodeQuery from "./element/query/node";
|
|
14
|
+
import Parameter from "./element/parameter";
|
|
15
|
+
import Parameters from "./element/parameters";
|
|
16
|
+
import NodesQuery from "./element/query/nodes";
|
|
17
|
+
import Comparison from "./element/comparison";
|
|
18
|
+
import Expression from "./element/expression";
|
|
19
|
+
import Expressions from "./element/expressions";
|
|
20
|
+
import ReturnBlock from "./element/block/return";
|
|
21
|
+
import ProcedureCall from "./element/procedureCall";
|
|
22
|
+
import NamedParameter from "./element/parameter/named";
|
|
23
|
+
import ArrayAssigment from "./element/assignment/array";
|
|
24
|
+
import ReturnStatement from "./element/statement/return";
|
|
25
|
+
import NamedParameters from "./element/parameters/named";
|
|
26
|
+
import ObjectAssignment from "./element/assignment/object";
|
|
27
|
+
import NegatedExpression from "./element/expression/negated";
|
|
28
|
+
import BitwiseExpression from "./element/expression/bitwise";
|
|
29
|
+
import AnonymousProcedure from "./element/procedure/anonymous";
|
|
30
|
+
import VariableAssignment from "./element/assignment/variable";
|
|
31
|
+
import BracketedExpression from "./element/expression/bracketed";
|
|
32
|
+
import VariableAssignments from "./element/assignments/variable";
|
|
33
|
+
import ProcedureDeclaration from "./element/declaration/procedure";
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { nodeQuery } from "../utilities/query";
|
|
4
|
+
|
|
5
|
+
import elements from "../elements";
|
|
6
|
+
|
|
7
|
+
const nonTerminalNodeQuery = nodeQuery("/*"),
|
|
8
|
+
errorNodeQuery = nodeQuery("/error"),
|
|
9
|
+
procedureDeclarationNodeQuery = nodeQuery("/procedureDeclaration");
|
|
10
|
+
|
|
11
|
+
class Pass {
|
|
12
|
+
run(node, ...remainingArguments) {
|
|
13
|
+
let success;
|
|
14
|
+
|
|
15
|
+
const visited = this.visitNode(node, ...remainingArguments);
|
|
16
|
+
|
|
17
|
+
success = visited; ///
|
|
18
|
+
|
|
19
|
+
return success;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
descend(childNodes, ...remainingArguments) {
|
|
23
|
+
let descended = false;
|
|
24
|
+
|
|
25
|
+
const visited = childNodes.every((childNode) => {
|
|
26
|
+
const node = childNode, ///
|
|
27
|
+
visited = this.visitNode(node, ...remainingArguments);
|
|
28
|
+
|
|
29
|
+
if (visited) {
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
if (visited) {
|
|
35
|
+
descended = true;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return descended;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
visitNode(node, ...remainingArguments) {
|
|
42
|
+
let visited;
|
|
43
|
+
|
|
44
|
+
const nodeTerminalNode = node.isTerminalNode();
|
|
45
|
+
|
|
46
|
+
if (nodeTerminalNode) {
|
|
47
|
+
const terminalNode = node; ///
|
|
48
|
+
|
|
49
|
+
visited = this.visitTerminalNode(terminalNode, ...remainingArguments);
|
|
50
|
+
} else {
|
|
51
|
+
const nonTerminalNode = node; ///
|
|
52
|
+
|
|
53
|
+
visited = this.visitNonTerminalNode(nonTerminalNode, ...remainingArguments);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return visited;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
visitTerminalNode(terminalNode, ...remainingArguments) {
|
|
60
|
+
const visited = true;
|
|
61
|
+
|
|
62
|
+
return visited;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
visitNonTerminalNode(nonTerminalNode, ...remainingArguments) {
|
|
66
|
+
let visited = false;
|
|
67
|
+
|
|
68
|
+
let { maps } = this.constructor;
|
|
69
|
+
|
|
70
|
+
maps = [ ///
|
|
71
|
+
...maps,
|
|
72
|
+
{
|
|
73
|
+
nodeQuery: nonTerminalNodeQuery,
|
|
74
|
+
run: (node, ...remainingArguments) => {
|
|
75
|
+
let visited = false;
|
|
76
|
+
|
|
77
|
+
const childNodes = nonTerminalNode.getChildNodes(), ///
|
|
78
|
+
descended = this.descend(childNodes, ...remainingArguments);
|
|
79
|
+
|
|
80
|
+
if (descended) {
|
|
81
|
+
visited = true;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return visited;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
]
|
|
88
|
+
|
|
89
|
+
maps.some((map) => {
|
|
90
|
+
const { nodeQuery, run } = map;
|
|
91
|
+
|
|
92
|
+
const node = nodeQuery(nonTerminalNode);
|
|
93
|
+
|
|
94
|
+
if (node !== null) {
|
|
95
|
+
const success = run(node, ...remainingArguments);
|
|
96
|
+
|
|
97
|
+
visited = success;
|
|
98
|
+
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
return visited;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
class TopLevelPass extends Pass {
|
|
108
|
+
static maps = [
|
|
109
|
+
{
|
|
110
|
+
nodeQuery: errorNodeQuery,
|
|
111
|
+
run: (errorNode, context) => {
|
|
112
|
+
let success = false;
|
|
113
|
+
|
|
114
|
+
const { Error } = elements,
|
|
115
|
+
error = Error.fromErrorNode(errorNode, context),
|
|
116
|
+
errorVerifies = error.verify(context);
|
|
117
|
+
|
|
118
|
+
if (errorVerifies) {
|
|
119
|
+
success = true;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
return success;
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
nodeQuery: procedureDeclarationNodeQuery,
|
|
127
|
+
run: (procedureDeclarationNode, context) => {
|
|
128
|
+
let success = false;
|
|
129
|
+
|
|
130
|
+
const { ProcedureDeclaration } = elements,
|
|
131
|
+
procedureDeclaration = ProcedureDeclaration.fromProcedureDeclarationNode(procedureDeclarationNode, context),
|
|
132
|
+
procedureDeclarationVerifies = procedureDeclaration.verify(context);
|
|
133
|
+
|
|
134
|
+
if (procedureDeclarationVerifies) {
|
|
135
|
+
success = true;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return success;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
];
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
const topLevelPass = new TopLevelPass();
|
|
145
|
+
|
|
146
|
+
export function verifyFile(fileNode, context) {
|
|
147
|
+
let fileVerifies = false;
|
|
148
|
+
|
|
149
|
+
const node = fileNode, ///
|
|
150
|
+
sucess = topLevelPass.run(node, context);
|
|
151
|
+
|
|
152
|
+
if (sucess) {
|
|
153
|
+
fileVerifies = true;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
return fileVerifies;
|
|
157
|
+
}
|
package/src/utilities/context.js
CHANGED
|
@@ -1,15 +1,31 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import { FUNCTION } from "../constants";
|
|
3
|
+
import { LEVELS, FUNCTION, DOUBLE_SPACE } from "../constants";
|
|
4
4
|
|
|
5
5
|
export function chainContext(context) {
|
|
6
6
|
return new Proxy(context, {
|
|
7
7
|
get: (instance, name, receiver) => {
|
|
8
|
+
const levelsIncludeName = LEVELS.includes(name);
|
|
9
|
+
|
|
10
|
+
if (levelsIncludeName) {
|
|
11
|
+
return (message, node = null) => {
|
|
12
|
+
const level = name, ///
|
|
13
|
+
depth = instance.getDepth(),
|
|
14
|
+
indent = DOUBLE_SPACE.repeat(depth);
|
|
15
|
+
|
|
16
|
+
message = `${indent}${message}`;
|
|
17
|
+
|
|
18
|
+
const fileContext = instance.getFileContext();
|
|
19
|
+
|
|
20
|
+
fileContext.writeToLog(level, message, node);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
8
24
|
if (name in instance) {
|
|
9
25
|
return Reflect.get(instance, name, receiver);
|
|
10
26
|
}
|
|
11
27
|
|
|
12
|
-
const context = instance.
|
|
28
|
+
const context = instance.getContext(),
|
|
13
29
|
value = context[name];
|
|
14
30
|
|
|
15
31
|
return (typeof value === FUNCTION) ?
|
|
@@ -18,3 +34,30 @@ export function chainContext(context) {
|
|
|
18
34
|
}
|
|
19
35
|
});
|
|
20
36
|
}
|
|
37
|
+
|
|
38
|
+
export function lineIndexFromNodeAndTokens(node, tokens, lineIndex) {
|
|
39
|
+
if (node !== null) {
|
|
40
|
+
lineIndex = 0;
|
|
41
|
+
|
|
42
|
+
const firstSignificantTokenIndex = node.getFirstSignificantTokenIndex(tokens);
|
|
43
|
+
|
|
44
|
+
tokens.some((token, tokenIndex) => {
|
|
45
|
+
const tokenEndOfLineToken = token.isEndOfLineToken();
|
|
46
|
+
|
|
47
|
+
if (tokenEndOfLineToken) {
|
|
48
|
+
lineIndex += 1;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (tokenIndex === firstSignificantTokenIndex) {
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return lineIndex;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export default {
|
|
61
|
+
chainContext,
|
|
62
|
+
lineIndexFromNodeAndTokens
|
|
63
|
+
};
|