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
@@ -1,15 +1,15 @@
1
1
  "use strict";
2
2
 
3
- import dom from "../dom";
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 domAssigned(class Reduce {
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 } = dom;
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 } = dom,
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 dom from "../dom";
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 domAssigned(class Reference {
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 } = dom,
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 dom from "../dom";
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 domAssigned(class Some {
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 } = dom;
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 } = dom;
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 } = dom,
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 dom from "../../dom";
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 domAssigned(class ReturnStatement {
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 } = dom,
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 dom from "../dom";
3
+ import elements from "../elements";
4
4
 
5
- import { domAssigned } from "../dom";
5
+ import { define } from "../elements";
6
6
  import { EMPTY_STRING } from "../constants";
7
7
 
8
- export default domAssigned(class Step {
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 } = dom,
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 dom from "../dom";
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 domAssigned(class Ternary {
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 } = dom,
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 dom from "../dom";
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 domAssigned(class Variable {
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 } = dom,
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 } = dom,
234
+ const { Variable } = elements,
235
235
  type = null,
236
236
  name = nameFromVariableNode(variableNode),
237
237
  expression = null,
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ const elements = {};
4
+
5
+ export function define(Class) {
6
+ const { name } = Class;
7
+
8
+ elements[name] = Class;
9
+
10
+ return Class;
11
+ }
12
+
13
+ export default elements;
package/src/index.js CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  import "./preamble";
4
4
 
5
- export { default as Expressions } from "./dom/expressions";
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 "./dom/step";
4
- import Some from "./dom/some";
5
- import Label from "./dom/label";
6
- import Error from "./dom/error";
7
- import Every from "./dom/every";
8
- import Reduce from "./dom/reduce";
9
- import Ternary from "./dom/ternary";
10
- import Variable from "./dom/variable";
11
- import Reference from "./dom/reference";
12
- import Procedure from "./dom/procedure";
13
- import NodeQuery from "./dom/query/node";
14
- import Parameter from "./dom/parameter";
15
- import Parameters from "./dom/parameters";
16
- import NodesQuery from "./dom/query/nodes";
17
- import Comparison from "./dom/comparison";
18
- import Expression from "./dom/expression";
19
- import Expressions from "./dom/expressions";
20
- import ReturnBlock from "./dom/block/return";
21
- import ProcedureCall from "./dom/procedureCall";
22
- import NamedParameter from "./dom/parameter/named";
23
- import ArrayAssigment from "./dom/assignment/array";
24
- import ReturnStatement from "./dom/statement/return";
25
- import NamedParameters from "./dom/parameters/named";
26
- import ObjectAssignment from "./dom/assignment/object";
27
- import NegatedExpression from "./dom/expression/negated";
28
- import BitwiseExpression from "./dom/expression/bitwise";
29
- import AnonymousProcedure from "./dom/procedure/anonymous";
30
- import VariableAssignment from "./dom/assignment/variable";
31
- import BracketedExpression from "./dom/expression/bracketed";
32
- import VariableAssignments from "./dom/assignments/variable";
33
- import ProcedureDeclaration from "./dom/declaration/procedure";
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
+ }
@@ -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.context,
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
+ };