@bikky/replication 1.0.1

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 (140) hide show
  1. package/Constants/Errors.d.ts +27 -0
  2. package/Constants/Errors.js +75 -0
  3. package/Constants/Logging.d.ts +17 -0
  4. package/Constants/Logging.js +97 -0
  5. package/Constants/ReplicableRegistry.d.ts +37 -0
  6. package/Constants/ReplicableRegistry.js +234 -0
  7. package/Constants/SerialisationTypes.d.ts +82 -0
  8. package/Constants/SerialisationTypes.js +160 -0
  9. package/Constants/SourceMaps.d.ts +10 -0
  10. package/Constants/SourceMaps.js +12 -0
  11. package/Constants/TraversalStep.d.ts +5 -0
  12. package/Constants/TraversalStep.js +2 -0
  13. package/Constants/Versions.d.ts +15 -0
  14. package/Constants/Versions.js +63 -0
  15. package/Expressions/Compiler/BuiltinGrammar.d.ts +234 -0
  16. package/Expressions/Compiler/BuiltinGrammar.js +446 -0
  17. package/Expressions/Compiler/ExpressionGrammar.d.ts +89 -0
  18. package/Expressions/Compiler/ExpressionGrammar.js +70 -0
  19. package/Expressions/Compiler/Parser.d.ts +56 -0
  20. package/Expressions/Compiler/Parser.js +314 -0
  21. package/Expressions/Compiler/Tokenizer.d.ts +52 -0
  22. package/Expressions/Compiler/Tokenizer.js +222 -0
  23. package/Expressions/Compiler/__tests__/Replicable.Expressions.Parser.test.d.ts +1 -0
  24. package/Expressions/Compiler/__tests__/Replicable.Expressions.Parser.test.js +516 -0
  25. package/Expressions/Compiler/__tests__/Replicable.Expressions.Tokenizer.test.d.ts +1 -0
  26. package/Expressions/Compiler/__tests__/Replicable.Expressions.Tokenizer.test.js +68 -0
  27. package/Expressions/CreateEvaluator.d.ts +4 -0
  28. package/Expressions/CreateEvaluator.js +85 -0
  29. package/Expressions/EvaluatorChain.d.ts +19 -0
  30. package/Expressions/EvaluatorChain.js +137 -0
  31. package/Expressions/EvaluatorSteps.d.ts +19 -0
  32. package/Expressions/EvaluatorSteps.js +12 -0
  33. package/Expressions/EvaluatorString.d.ts +21 -0
  34. package/Expressions/EvaluatorString.js +26 -0
  35. package/Expressions/Expression.d.ts +36 -0
  36. package/Expressions/Expression.js +147 -0
  37. package/Expressions/Traverser.d.ts +28 -0
  38. package/Expressions/Traverser.js +348 -0
  39. package/Expressions/TypeRegistry/Accessors.d.ts +26 -0
  40. package/Expressions/TypeRegistry/Accessors.js +58 -0
  41. package/Expressions/TypeRegistry/ChainCollections.d.ts +51 -0
  42. package/Expressions/TypeRegistry/ChainCollections.js +134 -0
  43. package/Expressions/TypeRegistry/ChainTypes.d.ts +23 -0
  44. package/Expressions/TypeRegistry/ChainTypes.js +46 -0
  45. package/Expressions/TypeRegistry/CustomAPI.d.ts +36 -0
  46. package/Expressions/TypeRegistry/CustomAPI.js +181 -0
  47. package/Expressions/TypeRegistry/Primitive.d.ts +19 -0
  48. package/Expressions/TypeRegistry/Primitive.js +47 -0
  49. package/Expressions/TypeRegistry/Registry.d.ts +27 -0
  50. package/Expressions/TypeRegistry/Registry.js +270 -0
  51. package/Expressions/TypeRegistry/ReplAPI.d.ts +41 -0
  52. package/Expressions/TypeRegistry/ReplAPI.js +220 -0
  53. package/Expressions/TypeRegistry/Scope.d.ts +24 -0
  54. package/Expressions/TypeRegistry/Scope.js +44 -0
  55. package/Expressions/TypeRegistry/Types.d.ts +23 -0
  56. package/Expressions/TypeRegistry/Types.js +1 -0
  57. package/Expressions/TypeRegistry/__tests__/Replicable.Expressions.Accessors.test.d.ts +1 -0
  58. package/Expressions/TypeRegistry/__tests__/Replicable.Expressions.Accessors.test.js +31 -0
  59. package/Expressions/__tests__/ExpressionExamples.d.ts +28 -0
  60. package/Expressions/__tests__/ExpressionExamples.js +50 -0
  61. package/Expressions/__tests__/Replicable.Expressions.Expressions.test.d.ts +1 -0
  62. package/Expressions/__tests__/Replicable.Expressions.Expressions.test.js +166 -0
  63. package/IDPool.d.ts +18 -0
  64. package/IDPool.data.d.ts +17 -0
  65. package/IDPool.js +139 -0
  66. package/License.txt +1 -0
  67. package/Main.d.ts +13 -0
  68. package/Main.js +13 -0
  69. package/Networking.d.ts +60 -0
  70. package/Networking.js +626 -0
  71. package/Replicatable.d.ts +66 -0
  72. package/Replicatable.js +123 -0
  73. package/Tracking/Buffable.d.ts +68 -0
  74. package/Tracking/Buffable.js +194 -0
  75. package/Tracking/Class.d.ts +97 -0
  76. package/Tracking/Class.js +221 -0
  77. package/Tracking/Functions.d.ts +14 -0
  78. package/Tracking/Functions.js +27 -0
  79. package/Tracking/GlobalGroup.d.ts +5 -0
  80. package/Tracking/GlobalGroup.js +39 -0
  81. package/Tracking/Property.d.ts +95 -0
  82. package/Tracking/Property.js +125 -0
  83. package/Tracking/Types.d.ts +33 -0
  84. package/Tracking/Types.js +1 -0
  85. package/Tracking/__tests__/Replicable.Tracking.Decorator.test.d.ts +1 -0
  86. package/Tracking/__tests__/Replicable.Tracking.Decorator.test.js +151 -0
  87. package/Tracking/__tests__/Replicable.Tracking.Deserialisation.test.d.ts +1 -0
  88. package/Tracking/__tests__/Replicable.Tracking.Deserialisation.test.js +253 -0
  89. package/Tracking/__tests__/Replicable.Tracking.MixinSchemaGeneration.test.d.ts +1 -0
  90. package/Tracking/__tests__/Replicable.Tracking.MixinSchemaGeneration.test.js +135 -0
  91. package/Tracking/__tests__/Replicable.Tracking.Struct.test.d.ts +1 -0
  92. package/Tracking/__tests__/Replicable.Tracking.Struct.test.js +66 -0
  93. package/Tracking/__tests__/Replicable.Tracking.Type.test.d.ts +1 -0
  94. package/Tracking/__tests__/Replicable.Tracking.Type.test.js +67 -0
  95. package/Transformers/Configurer.d.ts +39 -0
  96. package/Transformers/Configurer.js +415 -0
  97. package/Transformers/Constructor.d.ts +12 -0
  98. package/Transformers/Constructor.js +44 -0
  99. package/Transformers/Definitions.d.ts +102 -0
  100. package/Transformers/Definitions.js +626 -0
  101. package/Transformers/Loader.d.ts +45 -0
  102. package/Transformers/Loader.js +350 -0
  103. package/Transformers/Progress.d.ts +32 -0
  104. package/Transformers/Progress.js +429 -0
  105. package/Transformers/Reference.d.ts +37 -0
  106. package/Transformers/Reference.js +212 -0
  107. package/Transformers/SchemaGenerator.d.ts +102 -0
  108. package/Transformers/SchemaGenerator.js +564 -0
  109. package/Transformers/Serialiser.d.ts +31 -0
  110. package/Transformers/Serialiser.js +366 -0
  111. package/Transformers/Utils.d.ts +33 -0
  112. package/Transformers/Utils.js +287 -0
  113. package/Transformers/__tests__/Examples.d.ts +168 -0
  114. package/Transformers/__tests__/Examples.js +263 -0
  115. package/Transformers/__tests__/Replicable.Transformers.Definitions.test.d.ts +1 -0
  116. package/Transformers/__tests__/Replicable.Transformers.Definitions.test.js +457 -0
  117. package/Transformers/__tests__/Replicable.Transformers.Loader.test.d.ts +1 -0
  118. package/Transformers/__tests__/Replicable.Transformers.Loader.test.js +339 -0
  119. package/Transformers/__tests__/Replicable.Transformers.Progress.test.d.ts +1 -0
  120. package/Transformers/__tests__/Replicable.Transformers.Progress.test.js +256 -0
  121. package/Transformers/__tests__/Replicable.Transformers.Reference.test.d.ts +1 -0
  122. package/Transformers/__tests__/Replicable.Transformers.Reference.test.js +167 -0
  123. package/Transformers/__tests__/Replicable.Transformers.SchemaGenerator.test.d.ts +1 -0
  124. package/Transformers/__tests__/Replicable.Transformers.SchemaGenerator.test.js +400 -0
  125. package/Transformers/__tests__/Replicable.Transformers.SchemaGeneratorOutput.test.d.ts +1 -0
  126. package/Transformers/__tests__/Replicable.Transformers.SchemaGeneratorOutput.test.js +441 -0
  127. package/Transformers/__tests__/Replicable.Transformers.Serialiser.test.d.ts +1 -0
  128. package/Transformers/__tests__/Replicable.Transformers.Serialiser.test.js +320 -0
  129. package/Transformers/__tests__/Replicable.Transformers.Utils.test.d.ts +1 -0
  130. package/Transformers/__tests__/Replicable.Transformers.Utils.test.js +534 -0
  131. package/__tests__/Replicable.Expressions.test.d.ts +1 -0
  132. package/__tests__/Replicable.Expressions.test.js +166 -0
  133. package/__tests__/Replicable.IDPool.test.d.ts +1 -0
  134. package/__tests__/Replicable.IDPool.test.js +11 -0
  135. package/__tests__/Replicable.ReplicableRegistry.test.d.ts +1 -0
  136. package/__tests__/Replicable.ReplicableRegistry.test.js +154 -0
  137. package/__tests__/Replicable.Serialisation.test.d.ts +1 -0
  138. package/__tests__/Replicable.Serialisation.test.js +283 -0
  139. package/package.json +14 -0
  140. package/tsconfig.json +19 -0
@@ -0,0 +1,446 @@
1
+ import { Versions } from "../../Constants/Versions.js";
2
+ import { ExpressionGrammar } from "./ExpressionGrammar.js";
3
+ import { EAST_Tokens, TokenType } from "./Tokenizer.js";
4
+ export var ExpressionAST;
5
+ (function (ExpressionAST) {
6
+ var NodeType = ExpressionGrammar.NodeType;
7
+ var SpecialType = ExpressionGrammar.SpecialType;
8
+ const CONTROL_FLOW_STATEMENTS = [NodeType.FOR_LOOP, NodeType.WHILE_LOOP, NodeType.DOWHILE_LOOP, NodeType.IF];
9
+ const CONTROL_FLOW_LOOP = [NodeType.BREAK, NodeType.CONTINUE];
10
+ const CONTROL_FLOW_FUNCTION = [NodeType.RETURN];
11
+ //-------------------------------------------------LOOPS-----------------------------------------------
12
+ function IsLoopNode(node) {
13
+ return node.type === NodeType.FOR_LOOP || node.type === NodeType.WHILE_LOOP || node.type === NodeType.DOWHILE_LOOP;
14
+ }
15
+ ExpressionAST.IsLoopNode = IsLoopNode;
16
+ function IsControlFlowNode(node) {
17
+ return node.type === NodeType.CONTINUE || node.type === NodeType.BREAK || node.type === NodeType.RETURN;
18
+ }
19
+ ExpressionAST.IsControlFlowNode = IsControlFlowNode;
20
+ function IsContinueNode(node) {
21
+ return node.type === NodeType.CONTINUE;
22
+ }
23
+ ExpressionAST.IsContinueNode = IsContinueNode;
24
+ ExpressionGrammar.AddRule(Versions.v1_0_0, NodeType.CONTINUE, [
25
+ { type: TokenType.KEYWORD, value: "continue" },
26
+ { type: TokenType.OPERATOR, value: ";" }
27
+ ]);
28
+ function IsBreakNode(node) {
29
+ return node.type === NodeType.BREAK;
30
+ }
31
+ ExpressionAST.IsBreakNode = IsBreakNode;
32
+ ExpressionGrammar.AddRule(Versions.v1_0_0, NodeType.BREAK, [
33
+ { type: TokenType.KEYWORD, value: "break" },
34
+ { type: TokenType.OPERATOR, value: ";" }
35
+ ]);
36
+ function IsWhileNode(node) {
37
+ return node.type === NodeType.WHILE_LOOP;
38
+ }
39
+ ExpressionAST.IsWhileNode = IsWhileNode;
40
+ ExpressionGrammar.AddRule(Versions.v1_0_0, NodeType.WHILE_LOOP, [
41
+ { type: TokenType.KEYWORD, value: "while" },
42
+ { type: TokenType.OPERATOR, value: "(" },
43
+ { type: ExpressionGrammar.NodeType.EXPRESSION, name: "test" },
44
+ { type: TokenType.OPERATOR, value: ")" },
45
+ {
46
+ type: [ExpressionGrammar.NodeType.BLOCK, ExpressionGrammar.NodeType.STATEMENT],
47
+ input: [...CONTROL_FLOW_LOOP, ExpressionGrammar.SpecialType.INPUT_TYPES],
48
+ name: "body"
49
+ }
50
+ ]);
51
+ function IsForNode(node) {
52
+ return node.type === NodeType.FOR_LOOP;
53
+ }
54
+ ExpressionAST.IsForNode = IsForNode;
55
+ ExpressionGrammar.AddRule(Versions.v1_0_0, NodeType.FOR_LOOP, [
56
+ { type: TokenType.KEYWORD, value: "for" },
57
+ { type: TokenType.OPERATOR, value: "(" },
58
+ { type: NodeType.EXPRESSION, name: "initialiser" },
59
+ { type: TokenType.OPERATOR, value: ";" },
60
+ { type: NodeType.EXPRESSION, name: "test" },
61
+ { type: TokenType.OPERATOR, value: ";" },
62
+ { type: NodeType.EXPRESSION, name: "incrementer" },
63
+ { type: TokenType.OPERATOR, value: ")" },
64
+ {
65
+ type: [NodeType.BLOCK, NodeType.STATEMENT],
66
+ input: [...CONTROL_FLOW_LOOP, SpecialType.INPUT_TYPES],
67
+ name: "body"
68
+ }
69
+ ]);
70
+ function IsStatementNode(node) {
71
+ return node.type === NodeType.STATEMENT;
72
+ }
73
+ ExpressionAST.IsStatementNode = IsStatementNode;
74
+ ExpressionGrammar.AddRule(Versions.v1_0_0, NodeType.STATEMENT, [
75
+ { type: NodeType.EXPRESSION, unroll: true },
76
+ { type: TokenType.OPERATOR, value: ";" }
77
+ ]);
78
+ function IsExpressionNode(node) {
79
+ return node.type === NodeType.EXPRESSION;
80
+ }
81
+ ExpressionAST.IsExpressionNode = IsExpressionNode;
82
+ ExpressionGrammar.AddRule(Versions.v1_0_0, NodeType.EXPRESSION, [
83
+ {
84
+ type: [
85
+ NodeType.MEMBER_ACCESS,
86
+ NodeType.FORCE_CAST,
87
+ NodeType.ARRAY_ACCESS_SEQUENCE,
88
+ NodeType.FUNCTION_CALL,
89
+ NodeType.CAST,
90
+ NodeType.BINARY_EXPRESSION,
91
+ NodeType.PARENTHETISED_EXPRESSION,
92
+ NodeType.UNARY_EXPRESSION,
93
+ NodeType.ASSIGNMENT,
94
+ TokenType.BUILTIN,
95
+ NodeType.LITERAL,
96
+ TokenType.IDENTIFIER,
97
+ ],
98
+ name: "expression"
99
+ }
100
+ ]);
101
+ function IsMemberAccessNode(node) {
102
+ return node.type === NodeType.MEMBER_ACCESS;
103
+ }
104
+ ExpressionAST.IsMemberAccessNode = IsMemberAccessNode;
105
+ ExpressionGrammar.AddRule(Versions.v1_0_0, NodeType.MEMBER_ACCESS, [
106
+ {
107
+ type: [
108
+ NodeType.PARENTHETISED_EXPRESSION,
109
+ NodeType.FUNCTION_CALL,
110
+ NodeType.ARRAY_ACCESS_SEQUENCE,
111
+ NodeType.FORCE_CAST,
112
+ NodeType.CAST,
113
+ TokenType.IDENTIFIER
114
+ ],
115
+ name: "context"
116
+ },
117
+ { type: [TokenType.OPERATOR], value: "." },
118
+ {
119
+ type: [NodeType.MEMBER_ACCESS, NodeType.FORCE_CAST, NodeType.CAST, TokenType.IDENTIFIER],
120
+ name: "memberName"
121
+ }
122
+ ]);
123
+ function IsArrayAccessorNode(node) {
124
+ return node.type === NodeType.ARRAY_ACCESSOR;
125
+ }
126
+ ExpressionAST.IsArrayAccessorNode = IsArrayAccessorNode;
127
+ ExpressionGrammar.AddRule(Versions.v1_0_0, NodeType.ARRAY_ACCESSOR, [
128
+ { type: [TokenType.OPERATOR], value: "[" },
129
+ {
130
+ type: [NodeType.LITERAL, NodeType.EXPRESSION, TokenType.IDENTIFIER],
131
+ name: "index"
132
+ },
133
+ { type: [TokenType.OPERATOR], value: "]" }
134
+ ]);
135
+ function IsArrayAccessSequenceNode(node) {
136
+ return node.type === NodeType.ARRAY_ACCESS_SEQUENCE;
137
+ }
138
+ ExpressionAST.IsArrayAccessSequenceNode = IsArrayAccessSequenceNode;
139
+ ExpressionGrammar.AddRule(Versions.v1_0_0, NodeType.ARRAY_ACCESS_SEQUENCE, [
140
+ {
141
+ type: [TokenType.IDENTIFIER, NodeType.PARENTHETISED_EXPRESSION],
142
+ name: "identifier"
143
+ },
144
+ {
145
+ type: [NodeType.ARRAY_ACCESSOR],
146
+ name: "accessor",
147
+ repeat: [1, Number.POSITIVE_INFINITY]
148
+ }
149
+ ]);
150
+ function IsParenthetisedExpressionNode(node) {
151
+ return node.type === NodeType.PARENTHETISED_EXPRESSION;
152
+ }
153
+ ExpressionAST.IsParenthetisedExpressionNode = IsParenthetisedExpressionNode;
154
+ ExpressionGrammar.AddRule(Versions.v1_0_0, NodeType.PARENTHETISED_EXPRESSION, [
155
+ { type: TokenType.OPERATOR, value: "(" },
156
+ { type: NodeType.EXPRESSION, unroll: true },
157
+ { type: TokenType.OPERATOR, value: ")" }
158
+ ]);
159
+ function IsBinaryExpressionNode(node) {
160
+ return node.type === NodeType.BINARY_EXPRESSION;
161
+ }
162
+ ExpressionAST.IsBinaryExpressionNode = IsBinaryExpressionNode;
163
+ ExpressionGrammar.AddRule(Versions.v1_0_0, NodeType.BINARY_EXPRESSION, [
164
+ {
165
+ type: [
166
+ /* no recursion or assignments on the lhs */
167
+ NodeType.ARRAY_ACCESS_SEQUENCE,
168
+ NodeType.FUNCTION_CALL,
169
+ NodeType.PARENTHETISED_EXPRESSION,
170
+ NodeType.UNARY_EXPRESSION,
171
+ TokenType.BUILTIN,
172
+ NodeType.LITERAL,
173
+ TokenType.IDENTIFIER
174
+ ],
175
+ name: "lhs"
176
+ },
177
+ {
178
+ type: TokenType.OPERATOR,
179
+ values: ["==", "!=", ">", "<", ">=", "<=", "-", "+", "/", "*"],
180
+ name: "operator"
181
+ },
182
+ { type: NodeType.EXPRESSION, name: "rhs" }
183
+ ]);
184
+ function IsUnaryExpressionNode(node) {
185
+ return node.type === NodeType.UNARY_EXPRESSION;
186
+ }
187
+ ExpressionAST.IsUnaryExpressionNode = IsUnaryExpressionNode;
188
+ ExpressionGrammar.AddRule(Versions.v1_0_0, NodeType.UNARY_EXPRESSION, [
189
+ { type: TokenType.OPERATOR, values: ["!", "-"], name: "operator" },
190
+ { type: NodeType.EXPRESSION, name: "value" }
191
+ ]);
192
+ function IsLiteralNode(node) {
193
+ return node.type === NodeType.LITERAL;
194
+ }
195
+ ExpressionAST.IsLiteralNode = IsLiteralNode;
196
+ ExpressionGrammar.AddRule(Versions.v1_0_0, NodeType.LITERAL, [
197
+ {
198
+ type: [TokenType.FLOAT, TokenType.INTEGER, TokenType.HEX],
199
+ name: "value"
200
+ }
201
+ ]);
202
+ function IsAssignmentNode(node) {
203
+ return node.type === NodeType.ASSIGNMENT;
204
+ }
205
+ ExpressionAST.IsAssignmentNode = IsAssignmentNode;
206
+ ExpressionGrammar.AddRule(Versions.v1_0_0, NodeType.ASSIGNMENT, [
207
+ { type: [TokenType.IDENTIFIER, TokenType.BUILTIN], name: "lhs" },
208
+ { type: TokenType.OPERATOR, value: "=" },
209
+ { type: NodeType.EXPRESSION, name: "rhs" }
210
+ ]);
211
+ function IsStructNode(node) {
212
+ return node.type === NodeType.STRUCT;
213
+ }
214
+ ExpressionAST.IsStructNode = IsStructNode;
215
+ ExpressionGrammar.AddRule(Versions.v1_0_0, NodeType.STRUCT, [
216
+ { type: TokenType.KEYWORD, value: "struct" },
217
+ { type: TokenType.IDENTIFIER, name: "name" },
218
+ { type: TokenType.OPERATOR, value: "{" },
219
+ {
220
+ type: NodeType.PROPERTY_SIGNATURE,
221
+ name: "members",
222
+ repeat: [1, Number.POSITIVE_INFINITY],
223
+ repeatSeparator: { type: TokenType.OPERATOR, value: "," }
224
+ },
225
+ { type: TokenType.OPERATOR, value: "}" }
226
+ ]);
227
+ //------------------------------------------------DECLARATION--------------------------------------------
228
+ function IsIdentifierDeclarationNode(node) {
229
+ return node.type === NodeType.DECLARATION || node.type === NodeType.PROPERTY_SIGNATURE;
230
+ }
231
+ ExpressionAST.IsIdentifierDeclarationNode = IsIdentifierDeclarationNode;
232
+ function IsDeclarationTypeQualifierListNode(node) {
233
+ return node.type === NodeType.DECLARATION_ENTRY;
234
+ }
235
+ ExpressionAST.IsDeclarationTypeQualifierListNode = IsDeclarationTypeQualifierListNode;
236
+ {
237
+ let qualifiers = EAST_Tokens["Qualifiers"];
238
+ ExpressionGrammar.AddRule(Versions.v1_0_0, NodeType.DECLARATION_TYPE_QUALIFIER_LIST, [
239
+ {
240
+ type: TokenType.VAR_QUAL,
241
+ values: qualifiers ? [qualifiers] : [],
242
+ name: "qualifiers",
243
+ repeat: [1, Number.POSITIVE_INFINITY]
244
+ }
245
+ ]);
246
+ }
247
+ function IsDeclarationTypeNode(node) {
248
+ return node.type === NodeType.DECLARATION_TYPE;
249
+ }
250
+ ExpressionAST.IsDeclarationTypeNode = IsDeclarationTypeNode;
251
+ {
252
+ let types = EAST_Tokens["Types"];
253
+ ExpressionGrammar.AddRule(Versions.v1_0_0, NodeType.DECLARATION_TYPE, [
254
+ {
255
+ type: NodeType.DECLARATION_TYPE_QUALIFIER_LIST,
256
+ unroll: true,
257
+ optional: true
258
+ },
259
+ {
260
+ type: TokenType.VAR_TYPE,
261
+ values: types ? [types] : [],
262
+ name: "type"
263
+ }
264
+ ]);
265
+ }
266
+ function IsPropertySignatureNode(node) {
267
+ return node.type === NodeType.PROPERTY_SIGNATURE;
268
+ }
269
+ ExpressionAST.IsPropertySignatureNode = IsPropertySignatureNode;
270
+ ExpressionGrammar.AddRule(Versions.v1_0_0, NodeType.PROPERTY_SIGNATURE, [
271
+ { type: NodeType.DECLARATION_TYPE, unroll: true },
272
+ { type: TokenType.IDENTIFIER, value: "identifier" }
273
+ ]);
274
+ function IsDeclarationEntryNode(node) {
275
+ return node.type === NodeType.DECLARATION_ENTRY;
276
+ }
277
+ ExpressionAST.IsDeclarationEntryNode = IsDeclarationEntryNode;
278
+ ExpressionGrammar.AddRule(Versions.v1_0_0, NodeType.DECLARATION_ENTRY, [
279
+ { type: TokenType.IDENTIFIER, name: "name" },
280
+ { type: TokenType.OPERATOR, value: "=", optional: true },
281
+ { type: NodeType.EXPRESSION, name: "initialiser", optional: "previous" }
282
+ ]);
283
+ function IsDeclarationNode(node) {
284
+ return node.type === NodeType.DECLARATION;
285
+ }
286
+ ExpressionAST.IsDeclarationNode = IsDeclarationNode;
287
+ ExpressionGrammar.AddRule(Versions.v1_0_0, NodeType.DECLARATION, [
288
+ { type: NodeType.DECLARATION_TYPE, unroll: true },
289
+ {
290
+ type: NodeType.DECLARATION_ENTRY,
291
+ name: "declarations",
292
+ repeat: [1, Number.POSITIVE_INFINITY],
293
+ repeatSeparator: { type: TokenType.OPERATOR, value: "," }
294
+ },
295
+ { type: TokenType.OPERATOR, value: ";" }
296
+ ]);
297
+ function IsFileNode(node) {
298
+ return node.type === NodeType.FILE;
299
+ }
300
+ ExpressionAST.IsFileNode = IsFileNode;
301
+ ExpressionGrammar.AddRule(Versions.v1_0_0, NodeType.FILE, [
302
+ {
303
+ type: [NodeType.COMMENT, NodeType.PREPROCESSOR_COMMAND, NodeType.FUNCTION_DECLARATION, NodeType.DECLARATION, NodeType.EXPRESSION],
304
+ name: "lines",
305
+ repeat: [0, Number.POSITIVE_INFINITY]
306
+ }
307
+ ]);
308
+ function IsBlockNode(node) {
309
+ return node.type === NodeType.BLOCK;
310
+ }
311
+ ExpressionAST.IsBlockNode = IsBlockNode;
312
+ ExpressionGrammar.AddRule(Versions.v1_0_0, NodeType.BLOCK, [
313
+ { type: TokenType.OPERATOR, value: "{" },
314
+ {
315
+ type: [
316
+ NodeType.COMMENT,
317
+ NodeType.DECLARATION,
318
+ NodeType.STATEMENT,
319
+ ...CONTROL_FLOW_STATEMENTS,
320
+ SpecialType.INPUT_TYPES
321
+ ],
322
+ input: [SpecialType.INPUT_TYPES],
323
+ name: "lines",
324
+ repeat: [0, Number.POSITIVE_INFINITY]
325
+ },
326
+ { type: TokenType.OPERATOR, value: "}" }
327
+ ]);
328
+ function IsReturnNode(node) {
329
+ return node.type === NodeType.RETURN;
330
+ }
331
+ ExpressionAST.IsReturnNode = IsReturnNode;
332
+ ExpressionGrammar.AddRule(Versions.v1_0_0, NodeType.RETURN, [
333
+ { type: TokenType.KEYWORD, value: "return" },
334
+ { type: NodeType.EXPRESSION, unroll: true },
335
+ { type: TokenType.OPERATOR, value: ";" }
336
+ ]);
337
+ function IsCommentNode(node) {
338
+ return node.type === NodeType.COMMENT;
339
+ }
340
+ ExpressionAST.IsCommentNode = IsCommentNode;
341
+ ExpressionGrammar.AddRule(Versions.v1_0_0, NodeType.COMMENT, [
342
+ {
343
+ type: [TokenType.BLOCK_COMMENT, TokenType.LINE_COMMENT],
344
+ name: "comment",
345
+ repeat: [1, Number.POSITIVE_INFINITY]
346
+ }
347
+ ]);
348
+ function IsPreprocessorCommandNode(node) {
349
+ return node.type === NodeType.PREPROCESSOR_COMMAND;
350
+ }
351
+ ExpressionAST.IsPreprocessorCommandNode = IsPreprocessorCommandNode;
352
+ ExpressionGrammar.AddRule(Versions.v1_0_0, NodeType.PREPROCESSOR_COMMAND, [
353
+ {
354
+ type: [TokenType.PREPROCESSOR /*, NodeType.PRECISION_STATEMENT*/],
355
+ name: "command"
356
+ }
357
+ ]);
358
+ function IsFunctionParameterNode(node) {
359
+ return node.type === NodeType.FUNCTION_PARAMETER;
360
+ }
361
+ ExpressionAST.IsFunctionParameterNode = IsFunctionParameterNode;
362
+ ExpressionGrammar.AddRule(Versions.v1_0_0, NodeType.FUNCTION_PARAMETER, [
363
+ { type: NodeType.DECLARATION_TYPE, unroll: true },
364
+ { type: TokenType.IDENTIFIER, name: "identifier" }
365
+ ]);
366
+ function IsFunctionDeclarationNode(node) {
367
+ return node.type === NodeType.FUNCTION_DECLARATION;
368
+ }
369
+ ExpressionAST.IsFunctionDeclarationNode = IsFunctionDeclarationNode;
370
+ ExpressionGrammar.AddRule(Versions.v1_0_0, NodeType.FUNCTION_DECLARATION, [
371
+ { type: TokenType.VAR_TYPE, name: "returnType" },
372
+ { type: TokenType.IDENTIFIER, name: "name" },
373
+ { type: TokenType.OPERATOR, value: "(" },
374
+ {
375
+ type: NodeType.FUNCTION_PARAMETER,
376
+ name: "parameters",
377
+ repeat: [0, Number.POSITIVE_INFINITY],
378
+ repeatSeparator: { type: TokenType.OPERATOR, value: "," }
379
+ },
380
+ //Weird thing about glsl functions is that you can just pass void in for parameters instead, so... let's hack a way of doing that here!
381
+ { type: TokenType.VAR_TYPE, value: "void", optional: true },
382
+ { type: TokenType.OPERATOR, value: ")" },
383
+ { type: NodeType.BLOCK, input: [NodeType.RETURN], name: "body" }
384
+ ]);
385
+ function IsFunctionCallNode(node) {
386
+ return node.type === NodeType.FUNCTION_CALL;
387
+ }
388
+ ExpressionAST.IsFunctionCallNode = IsFunctionCallNode;
389
+ ExpressionGrammar.AddRule(Versions.v1_0_0, NodeType.FUNCTION_CALL, [
390
+ {
391
+ type: [TokenType.BUILTIN, TokenType.VAR_TYPE, NodeType.PARENTHETISED_EXPRESSION, TokenType.IDENTIFIER],
392
+ name: "name"
393
+ },
394
+ { type: TokenType.OPERATOR, value: "(" },
395
+ {
396
+ type: NodeType.EXPRESSION,
397
+ name: "arguments",
398
+ repeat: [0, Number.POSITIVE_INFINITY],
399
+ repeatSeparator: { type: TokenType.OPERATOR, value: "," }
400
+ },
401
+ { type: TokenType.OPERATOR, value: ")" }
402
+ ]);
403
+ function IsCastNode(node) {
404
+ return node.type === NodeType.CAST;
405
+ }
406
+ ExpressionAST.IsCastNode = IsCastNode;
407
+ ExpressionGrammar.AddRule(Versions.v1_0_0, NodeType.CAST, [
408
+ {
409
+ type: [
410
+ NodeType.ARRAY_ACCESS_SEQUENCE,
411
+ NodeType.FUNCTION_CALL,
412
+ NodeType.PARENTHETISED_EXPRESSION,
413
+ TokenType.BUILTIN,
414
+ NodeType.LITERAL,
415
+ TokenType.IDENTIFIER,
416
+ ],
417
+ name: "expression"
418
+ },
419
+ { type: TokenType.OPERATOR, value: ":" },
420
+ { type: [TokenType.IDENTIFIER],
421
+ name: "castType"
422
+ }
423
+ ]);
424
+ function IsForceCastNode(node) {
425
+ return node.type === NodeType.FORCE_CAST;
426
+ }
427
+ ExpressionAST.IsForceCastNode = IsForceCastNode;
428
+ ExpressionGrammar.AddRule(Versions.v1_0_0, NodeType.FORCE_CAST, [
429
+ {
430
+ type: [
431
+ NodeType.ARRAY_ACCESS_SEQUENCE,
432
+ NodeType.FUNCTION_CALL,
433
+ NodeType.PARENTHETISED_EXPRESSION,
434
+ TokenType.BUILTIN,
435
+ NodeType.LITERAL,
436
+ TokenType.IDENTIFIER
437
+ ],
438
+ name: "expression"
439
+ },
440
+ { type: TokenType.OPERATOR, value: ":" },
441
+ { type: TokenType.OPERATOR, value: "=" },
442
+ { type: [TokenType.IDENTIFIER],
443
+ name: "castType"
444
+ }
445
+ ]);
446
+ })(ExpressionAST || (ExpressionAST = {}));
@@ -0,0 +1,89 @@
1
+ import { ExpressionAST } from "./BuiltinGrammar.js";
2
+ import { Token, TokenCategory, TokenType } from "./Tokenizer.js";
3
+ export declare namespace ExpressionGrammar {
4
+ /**
5
+ * EAST = Expression AST.
6
+ */
7
+ interface EAST_Complex_Node {
8
+ type: NodeType;
9
+ file: ExpressionAST.FileNode;
10
+ position: number;
11
+ length: number;
12
+ line: number;
13
+ column: number;
14
+ values?: {
15
+ [name: string]: Token | EAST_Complex_Node | (Token | EAST_Complex_Node)[];
16
+ } | Token | EAST_Complex_Node | (Token | EAST_Complex_Node)[];
17
+ }
18
+ type Node = EAST_Complex_Node | EAST_Token;
19
+ enum NodeType {
20
+ COMMENT = 100,
21
+ PREPROCESSOR_COMMAND = 101,
22
+ PRECISION_STATEMENT = 102,
23
+ IDENTIFIER = 110,
24
+ LITERAL = 111,
25
+ DECLARATION = 112,
26
+ DECLARATION_ENTRY = 113,
27
+ DECLARATION_TYPE = 114,
28
+ DECLARATION_TYPE_QUALIFIER_LIST = 115,
29
+ STRUCT = 120,
30
+ PROPERTY_SIGNATURE = 121,
31
+ CAST = 122,
32
+ FORCE_CAST = 123,
33
+ MEMBER_ACCESS = 124,
34
+ FUNCTION_DECLARATION = 130,
35
+ FUNCTION_PARAMETER = 131,
36
+ FUNCTION_CALL = 132,
37
+ FUNCTION_ARGUMENT = 133,
38
+ FOR_LOOP = 140,
39
+ WHILE_LOOP = 141,
40
+ DOWHILE_LOOP = 142,
41
+ IF = 143,
42
+ ARRAY_TYPE = 150,
43
+ ARRAY_ACCESS_SEQUENCE = 151,
44
+ ARRAY_ACCESSOR = 152,
45
+ RETURN = 153,
46
+ BREAK = 154,
47
+ CONTINUE = 155,
48
+ DISCARD = 156,
49
+ EXPRESSION = 157,
50
+ STATEMENT = 158,
51
+ PARENTHETISED_EXPRESSION = 159,
52
+ BINARY_EXPRESSION = 160,
53
+ UNARY_EXPRESSION = 161,
54
+ ASSIGNMENT = 162,
55
+ BLOCK = 163,
56
+ FILE = 400
57
+ }
58
+ enum SpecialType {
59
+ /**
60
+ * Allow extra types to be input by the parent. Used as a placeholder for blocks so that the expression
61
+ * lines from the parent are used in the evaluation of this grammar rule.
62
+ **/
63
+ INPUT_TYPES = 1000
64
+ }
65
+ type NodeNames = keyof typeof NodeType;
66
+ interface Rule {
67
+ type: TokenType | NodeType | SpecialType | (TokenType | NodeType | SpecialType)[];
68
+ debug_name?: string;
69
+ value?: string;
70
+ values?: (TokenCategory | string)[];
71
+ name?: string;
72
+ excludeValues?: string[];
73
+ input?: (TokenType | NodeType | SpecialType)[];
74
+ repeat?: [number, number];
75
+ repeatSeparator?: Rule;
76
+ unroll?: boolean;
77
+ optional?: boolean | "previous";
78
+ }
79
+ type NodeDefinition = {
80
+ ID: NodeType;
81
+ debugName: string;
82
+ rules: Rule[];
83
+ };
84
+ function AddRule(version: string, name: (typeof NodeType)[NodeNames], rules: Rule[]): void;
85
+ function getRule(versionIdx: number, name: (typeof NodeType)[NodeNames]): NodeDefinition;
86
+ }
87
+ export interface EAST_Token extends Token {
88
+ file: ExpressionAST.FileNode;
89
+ }
@@ -0,0 +1,70 @@
1
+ import { GetVersionIndex } from "../../Constants/Versions.js";
2
+ const grammar = [];
3
+ export var ExpressionGrammar;
4
+ (function (ExpressionGrammar) {
5
+ let NodeType;
6
+ (function (NodeType) {
7
+ NodeType[NodeType["COMMENT"] = 100] = "COMMENT";
8
+ NodeType[NodeType["PREPROCESSOR_COMMAND"] = 101] = "PREPROCESSOR_COMMAND";
9
+ NodeType[NodeType["PRECISION_STATEMENT"] = 102] = "PRECISION_STATEMENT";
10
+ NodeType[NodeType["IDENTIFIER"] = 110] = "IDENTIFIER";
11
+ NodeType[NodeType["LITERAL"] = 111] = "LITERAL";
12
+ NodeType[NodeType["DECLARATION"] = 112] = "DECLARATION";
13
+ NodeType[NodeType["DECLARATION_ENTRY"] = 113] = "DECLARATION_ENTRY";
14
+ NodeType[NodeType["DECLARATION_TYPE"] = 114] = "DECLARATION_TYPE";
15
+ NodeType[NodeType["DECLARATION_TYPE_QUALIFIER_LIST"] = 115] = "DECLARATION_TYPE_QUALIFIER_LIST";
16
+ NodeType[NodeType["STRUCT"] = 120] = "STRUCT";
17
+ NodeType[NodeType["PROPERTY_SIGNATURE"] = 121] = "PROPERTY_SIGNATURE";
18
+ NodeType[NodeType["CAST"] = 122] = "CAST";
19
+ NodeType[NodeType["FORCE_CAST"] = 123] = "FORCE_CAST";
20
+ NodeType[NodeType["MEMBER_ACCESS"] = 124] = "MEMBER_ACCESS";
21
+ NodeType[NodeType["FUNCTION_DECLARATION"] = 130] = "FUNCTION_DECLARATION";
22
+ NodeType[NodeType["FUNCTION_PARAMETER"] = 131] = "FUNCTION_PARAMETER";
23
+ NodeType[NodeType["FUNCTION_CALL"] = 132] = "FUNCTION_CALL";
24
+ NodeType[NodeType["FUNCTION_ARGUMENT"] = 133] = "FUNCTION_ARGUMENT";
25
+ NodeType[NodeType["FOR_LOOP"] = 140] = "FOR_LOOP";
26
+ NodeType[NodeType["WHILE_LOOP"] = 141] = "WHILE_LOOP";
27
+ NodeType[NodeType["DOWHILE_LOOP"] = 142] = "DOWHILE_LOOP";
28
+ NodeType[NodeType["IF"] = 143] = "IF";
29
+ NodeType[NodeType["ARRAY_TYPE"] = 150] = "ARRAY_TYPE";
30
+ NodeType[NodeType["ARRAY_ACCESS_SEQUENCE"] = 151] = "ARRAY_ACCESS_SEQUENCE";
31
+ NodeType[NodeType["ARRAY_ACCESSOR"] = 152] = "ARRAY_ACCESSOR";
32
+ NodeType[NodeType["RETURN"] = 153] = "RETURN";
33
+ NodeType[NodeType["BREAK"] = 154] = "BREAK";
34
+ NodeType[NodeType["CONTINUE"] = 155] = "CONTINUE";
35
+ NodeType[NodeType["DISCARD"] = 156] = "DISCARD";
36
+ NodeType[NodeType["EXPRESSION"] = 157] = "EXPRESSION";
37
+ NodeType[NodeType["STATEMENT"] = 158] = "STATEMENT";
38
+ NodeType[NodeType["PARENTHETISED_EXPRESSION"] = 159] = "PARENTHETISED_EXPRESSION";
39
+ NodeType[NodeType["BINARY_EXPRESSION"] = 160] = "BINARY_EXPRESSION";
40
+ NodeType[NodeType["UNARY_EXPRESSION"] = 161] = "UNARY_EXPRESSION";
41
+ NodeType[NodeType["ASSIGNMENT"] = 162] = "ASSIGNMENT";
42
+ NodeType[NodeType["BLOCK"] = 163] = "BLOCK";
43
+ NodeType[NodeType["FILE"] = 400] = "FILE";
44
+ })(NodeType = ExpressionGrammar.NodeType || (ExpressionGrammar.NodeType = {}));
45
+ let SpecialType;
46
+ (function (SpecialType) {
47
+ /**
48
+ * Allow extra types to be input by the parent. Used as a placeholder for blocks so that the expression
49
+ * lines from the parent are used in the evaluation of this grammar rule.
50
+ **/
51
+ SpecialType[SpecialType["INPUT_TYPES"] = 1000] = "INPUT_TYPES";
52
+ })(SpecialType = ExpressionGrammar.SpecialType || (ExpressionGrammar.SpecialType = {}));
53
+ function AddRule(version, name, rules) {
54
+ let index = GetVersionIndex(version);
55
+ if (index < 0)
56
+ throw new Error(`Can't add grammar rule for syntax version that hasn't been defined ${version}.`);
57
+ if (!grammar[index])
58
+ grammar[index] = {};
59
+ grammar[index][name] = {
60
+ ID: name,
61
+ debugName: NodeType[name],
62
+ rules
63
+ };
64
+ }
65
+ ExpressionGrammar.AddRule = AddRule;
66
+ function getRule(versionIdx, name) {
67
+ return grammar[versionIdx][name];
68
+ }
69
+ ExpressionGrammar.getRule = getRule;
70
+ })(ExpressionGrammar || (ExpressionGrammar = {}));
@@ -0,0 +1,56 @@
1
+ import { ExpressionAST } from "./BuiltinGrammar.js";
2
+ import { EAST_Token, ExpressionGrammar } from "./ExpressionGrammar.js";
3
+ import { Token, TokenType } from "./Tokenizer.js";
4
+ import FileNode = ExpressionAST.FileNode;
5
+ import Node = ExpressionGrammar.EAST_Complex_Node;
6
+ import NodeDefinition = ExpressionGrammar.NodeDefinition;
7
+ import { Versions } from "../../Main.js";
8
+ export interface PartialEASTNode {
9
+ type: ExpressionGrammar.NodeType;
10
+ debugName: string;
11
+ values: {
12
+ [name: string]: EAST_Token | ExpressionGrammar.EAST_Complex_Node | (EAST_Token | ExpressionGrammar.EAST_Complex_Node)[];
13
+ };
14
+ }
15
+ export interface NextMatchDetails {
16
+ parser: ExpressionParser;
17
+ extraTypes: (TokenType | ExpressionGrammar.NodeType | ExpressionGrammar.SpecialType)[];
18
+ debugTabs: string;
19
+ }
20
+ export declare function CheckRuleDone(grammar: NodeDefinition, currentRuleIndex: number): boolean;
21
+ export declare function IsRuleSkippable(rule: ExpressionGrammar.Rule, previousRuleMatched: boolean): boolean;
22
+ export declare function ComputeValidTypes(rule: ExpressionGrammar.Rule, extraTypes: (TokenType | ExpressionGrammar.NodeType | ExpressionGrammar.SpecialType)[]): (TokenType | ExpressionGrammar.NodeType | ExpressionGrammar.SpecialType)[];
23
+ export declare function ComputeChildInputs(rule: ExpressionGrammar.Rule, extraTypes: (TokenType | ExpressionGrammar.NodeType | ExpressionGrammar.SpecialType)[]): (TokenType | ExpressionGrammar.NodeType | ExpressionGrammar.SpecialType)[];
24
+ export declare function TokenDataMatchesRule(version: Versions | string, gram: ExpressionGrammar.Rule, token: Token): boolean;
25
+ export declare function PrintNodeName(value: Token | Node | PartialEASTNode): string;
26
+ export declare function PrintTokenText(token: Token): string;
27
+ export declare function MakeNewNodeFrom(details: NextMatchDetails, value: Token | Node): ExpressionGrammar.EAST_Complex_Node | {
28
+ file: FileNode;
29
+ type: TokenType;
30
+ data: string;
31
+ position: number;
32
+ length: number;
33
+ line: number;
34
+ column: number;
35
+ };
36
+ export declare function AddToPartialEASTNode(details: NextMatchDetails, rule: ExpressionGrammar.Rule, progress: PartialEASTNode, value: Token | (Node & {
37
+ values?: any;
38
+ })): void;
39
+ export declare function MatchRule(details: NextMatchDetails, rule: ExpressionGrammar.Rule, progress: PartialEASTNode, historicalMatches: ExpressionGrammar.NodeType[]): null | PartialEASTNode;
40
+ export declare function MatchRepeatingRule(details: NextMatchDetails, rule: ExpressionGrammar.Rule, progress: PartialEASTNode, historicalMatches: ExpressionGrammar.NodeType[]): null | PartialEASTNode;
41
+ export declare function MatchGrammar(details: NextMatchDetails, grammarType: ExpressionGrammar.NodeType, historicalMatches: ExpressionGrammar.NodeType[]): ExpressionGrammar.EAST_Complex_Node | null;
42
+ export declare class ExpressionParser {
43
+ tokens: Token[];
44
+ version: string;
45
+ versionIndex: number;
46
+ currentNodeIndex: number;
47
+ done: boolean;
48
+ token: Token;
49
+ file: Partial<FileNode>;
50
+ sourceLocation: string;
51
+ constructor(version: string, lines: string, sourceLocation: string);
52
+ consumeToken(): void;
53
+ resetToken(index: number): void;
54
+ run(): ExpressionAST.FileNode | null;
55
+ }
56
+ export declare function CreateASTFromString(version: string, lines: string, sourceLocation: string): ExpressionAST.FileNode | null;