@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.
- package/Constants/Errors.d.ts +27 -0
- package/Constants/Errors.js +75 -0
- package/Constants/Logging.d.ts +17 -0
- package/Constants/Logging.js +97 -0
- package/Constants/ReplicableRegistry.d.ts +37 -0
- package/Constants/ReplicableRegistry.js +234 -0
- package/Constants/SerialisationTypes.d.ts +82 -0
- package/Constants/SerialisationTypes.js +160 -0
- package/Constants/SourceMaps.d.ts +10 -0
- package/Constants/SourceMaps.js +12 -0
- package/Constants/TraversalStep.d.ts +5 -0
- package/Constants/TraversalStep.js +2 -0
- package/Constants/Versions.d.ts +15 -0
- package/Constants/Versions.js +63 -0
- package/Expressions/Compiler/BuiltinGrammar.d.ts +234 -0
- package/Expressions/Compiler/BuiltinGrammar.js +446 -0
- package/Expressions/Compiler/ExpressionGrammar.d.ts +89 -0
- package/Expressions/Compiler/ExpressionGrammar.js +70 -0
- package/Expressions/Compiler/Parser.d.ts +56 -0
- package/Expressions/Compiler/Parser.js +314 -0
- package/Expressions/Compiler/Tokenizer.d.ts +52 -0
- package/Expressions/Compiler/Tokenizer.js +222 -0
- package/Expressions/Compiler/__tests__/Replicable.Expressions.Parser.test.d.ts +1 -0
- package/Expressions/Compiler/__tests__/Replicable.Expressions.Parser.test.js +516 -0
- package/Expressions/Compiler/__tests__/Replicable.Expressions.Tokenizer.test.d.ts +1 -0
- package/Expressions/Compiler/__tests__/Replicable.Expressions.Tokenizer.test.js +68 -0
- package/Expressions/CreateEvaluator.d.ts +4 -0
- package/Expressions/CreateEvaluator.js +85 -0
- package/Expressions/EvaluatorChain.d.ts +19 -0
- package/Expressions/EvaluatorChain.js +137 -0
- package/Expressions/EvaluatorSteps.d.ts +19 -0
- package/Expressions/EvaluatorSteps.js +12 -0
- package/Expressions/EvaluatorString.d.ts +21 -0
- package/Expressions/EvaluatorString.js +26 -0
- package/Expressions/Expression.d.ts +36 -0
- package/Expressions/Expression.js +147 -0
- package/Expressions/Traverser.d.ts +28 -0
- package/Expressions/Traverser.js +348 -0
- package/Expressions/TypeRegistry/Accessors.d.ts +26 -0
- package/Expressions/TypeRegistry/Accessors.js +58 -0
- package/Expressions/TypeRegistry/ChainCollections.d.ts +51 -0
- package/Expressions/TypeRegistry/ChainCollections.js +134 -0
- package/Expressions/TypeRegistry/ChainTypes.d.ts +23 -0
- package/Expressions/TypeRegistry/ChainTypes.js +46 -0
- package/Expressions/TypeRegistry/CustomAPI.d.ts +36 -0
- package/Expressions/TypeRegistry/CustomAPI.js +181 -0
- package/Expressions/TypeRegistry/Primitive.d.ts +19 -0
- package/Expressions/TypeRegistry/Primitive.js +47 -0
- package/Expressions/TypeRegistry/Registry.d.ts +27 -0
- package/Expressions/TypeRegistry/Registry.js +270 -0
- package/Expressions/TypeRegistry/ReplAPI.d.ts +41 -0
- package/Expressions/TypeRegistry/ReplAPI.js +220 -0
- package/Expressions/TypeRegistry/Scope.d.ts +24 -0
- package/Expressions/TypeRegistry/Scope.js +44 -0
- package/Expressions/TypeRegistry/Types.d.ts +23 -0
- package/Expressions/TypeRegistry/Types.js +1 -0
- package/Expressions/TypeRegistry/__tests__/Replicable.Expressions.Accessors.test.d.ts +1 -0
- package/Expressions/TypeRegistry/__tests__/Replicable.Expressions.Accessors.test.js +31 -0
- package/Expressions/__tests__/ExpressionExamples.d.ts +28 -0
- package/Expressions/__tests__/ExpressionExamples.js +50 -0
- package/Expressions/__tests__/Replicable.Expressions.Expressions.test.d.ts +1 -0
- package/Expressions/__tests__/Replicable.Expressions.Expressions.test.js +166 -0
- package/IDPool.d.ts +18 -0
- package/IDPool.data.d.ts +17 -0
- package/IDPool.js +139 -0
- package/License.txt +1 -0
- package/Main.d.ts +13 -0
- package/Main.js +13 -0
- package/Networking.d.ts +60 -0
- package/Networking.js +626 -0
- package/Replicatable.d.ts +66 -0
- package/Replicatable.js +123 -0
- package/Tracking/Buffable.d.ts +68 -0
- package/Tracking/Buffable.js +194 -0
- package/Tracking/Class.d.ts +97 -0
- package/Tracking/Class.js +221 -0
- package/Tracking/Functions.d.ts +14 -0
- package/Tracking/Functions.js +27 -0
- package/Tracking/GlobalGroup.d.ts +5 -0
- package/Tracking/GlobalGroup.js +39 -0
- package/Tracking/Property.d.ts +95 -0
- package/Tracking/Property.js +125 -0
- package/Tracking/Types.d.ts +33 -0
- package/Tracking/Types.js +1 -0
- package/Tracking/__tests__/Replicable.Tracking.Decorator.test.d.ts +1 -0
- package/Tracking/__tests__/Replicable.Tracking.Decorator.test.js +151 -0
- package/Tracking/__tests__/Replicable.Tracking.Deserialisation.test.d.ts +1 -0
- package/Tracking/__tests__/Replicable.Tracking.Deserialisation.test.js +253 -0
- package/Tracking/__tests__/Replicable.Tracking.MixinSchemaGeneration.test.d.ts +1 -0
- package/Tracking/__tests__/Replicable.Tracking.MixinSchemaGeneration.test.js +135 -0
- package/Tracking/__tests__/Replicable.Tracking.Struct.test.d.ts +1 -0
- package/Tracking/__tests__/Replicable.Tracking.Struct.test.js +66 -0
- package/Tracking/__tests__/Replicable.Tracking.Type.test.d.ts +1 -0
- package/Tracking/__tests__/Replicable.Tracking.Type.test.js +67 -0
- package/Transformers/Configurer.d.ts +39 -0
- package/Transformers/Configurer.js +415 -0
- package/Transformers/Constructor.d.ts +12 -0
- package/Transformers/Constructor.js +44 -0
- package/Transformers/Definitions.d.ts +102 -0
- package/Transformers/Definitions.js +626 -0
- package/Transformers/Loader.d.ts +45 -0
- package/Transformers/Loader.js +350 -0
- package/Transformers/Progress.d.ts +32 -0
- package/Transformers/Progress.js +429 -0
- package/Transformers/Reference.d.ts +37 -0
- package/Transformers/Reference.js +212 -0
- package/Transformers/SchemaGenerator.d.ts +102 -0
- package/Transformers/SchemaGenerator.js +564 -0
- package/Transformers/Serialiser.d.ts +31 -0
- package/Transformers/Serialiser.js +366 -0
- package/Transformers/Utils.d.ts +33 -0
- package/Transformers/Utils.js +287 -0
- package/Transformers/__tests__/Examples.d.ts +168 -0
- package/Transformers/__tests__/Examples.js +263 -0
- package/Transformers/__tests__/Replicable.Transformers.Definitions.test.d.ts +1 -0
- package/Transformers/__tests__/Replicable.Transformers.Definitions.test.js +457 -0
- package/Transformers/__tests__/Replicable.Transformers.Loader.test.d.ts +1 -0
- package/Transformers/__tests__/Replicable.Transformers.Loader.test.js +339 -0
- package/Transformers/__tests__/Replicable.Transformers.Progress.test.d.ts +1 -0
- package/Transformers/__tests__/Replicable.Transformers.Progress.test.js +256 -0
- package/Transformers/__tests__/Replicable.Transformers.Reference.test.d.ts +1 -0
- package/Transformers/__tests__/Replicable.Transformers.Reference.test.js +167 -0
- package/Transformers/__tests__/Replicable.Transformers.SchemaGenerator.test.d.ts +1 -0
- package/Transformers/__tests__/Replicable.Transformers.SchemaGenerator.test.js +400 -0
- package/Transformers/__tests__/Replicable.Transformers.SchemaGeneratorOutput.test.d.ts +1 -0
- package/Transformers/__tests__/Replicable.Transformers.SchemaGeneratorOutput.test.js +441 -0
- package/Transformers/__tests__/Replicable.Transformers.Serialiser.test.d.ts +1 -0
- package/Transformers/__tests__/Replicable.Transformers.Serialiser.test.js +320 -0
- package/Transformers/__tests__/Replicable.Transformers.Utils.test.d.ts +1 -0
- package/Transformers/__tests__/Replicable.Transformers.Utils.test.js +534 -0
- package/__tests__/Replicable.Expressions.test.d.ts +1 -0
- package/__tests__/Replicable.Expressions.test.js +166 -0
- package/__tests__/Replicable.IDPool.test.d.ts +1 -0
- package/__tests__/Replicable.IDPool.test.js +11 -0
- package/__tests__/Replicable.ReplicableRegistry.test.d.ts +1 -0
- package/__tests__/Replicable.ReplicableRegistry.test.js +154 -0
- package/__tests__/Replicable.Serialisation.test.d.ts +1 -0
- package/__tests__/Replicable.Serialisation.test.js +283 -0
- package/package.json +14 -0
- 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;
|