GDevelop Core
Core library for developing platforms and tools compatible with GDevelop.
ExpressionParser2Node.h
1 /*
2  * GDevelop Core
3  * Copyright 2008-present Florian Rival ([email protected]). All rights
4  * reserved. This project is released under the MIT License.
5  */
6 #pragma once
7 
8 #include <memory>
9 #include <vector>
10 
11 #include "ExpressionParser2NodeWorker.h"
12 #include "GDCore/String.h"
13 
14 namespace gd {
15 class Expression;
16 class ObjectsContainer;
17 class Platform;
18 class ParameterMetadata;
19 class ExpressionMetadata;
20 struct FunctionCallNode;
21 } // namespace gd
22 
23 namespace gd {
24 
25 struct GD_CORE_API ExpressionParserLocation {
26  ExpressionParserLocation() : isValid(false){};
27  ExpressionParserLocation(size_t position)
28  : isValid(true), startPosition(position), endPosition(position){};
29  ExpressionParserLocation(size_t startPosition_, size_t endPosition_)
30  : isValid(true),
31  startPosition(startPosition_),
32  endPosition(endPosition_){};
33  size_t GetStartPosition() const { return startPosition; }
34  size_t GetEndPosition() const { return endPosition; }
35  bool IsValid() const { return isValid; }
36 
37  private:
38  bool isValid;
39  size_t startPosition = 0;
40  size_t endPosition = 0;
41 };
42 
46 struct GD_CORE_API ExpressionParserError {
47  enum ErrorType {
48  SyntaxError,
49  InvalidOperator,
50  MismatchedType,
51  UndeclaredVariable,
52  UnknownIdentifier,
53  BracketsNotAllowedForObjects,
54  TooFewParameters,
55  TooManyParameters,
56  InvalidFunctionName,
57  MalformedVariableParameter,
58  MalformedObjectParameter,
59  UnknownParameterType,
60  MissingBehavior,
61  VariableNameCollision,
62  DeprecatedExpression,
63  };
64 
65  ExpressionParserError(gd::ExpressionParserError::ErrorType type_,
66  const gd::String &message_,
67  const ExpressionParserLocation &location_,
68  const gd::String &actualValue_ = "",
69  const gd::String &objectName_ = "")
70  : type(type_), message(message_), location(location_),
71  actualValue(actualValue_), objectName(objectName_){};
72  ExpressionParserError(gd::ExpressionParserError::ErrorType type_,
73  const gd::String &message_, size_t position_)
74  : type(type_), message(message_), location(position_){};
75  ExpressionParserError(gd::ExpressionParserError::ErrorType type_,
76  const gd::String &message_, size_t startPosition_,
77  size_t endPosition_)
78  : type(type_), message(message_),
79  location(startPosition_, endPosition_){};
80  virtual ~ExpressionParserError(){};
81 
82  gd::ExpressionParserError::ErrorType GetType() const { return type; }
83  const gd::String &GetMessage() { return message; }
84  const gd::String &GetObjectName() { return objectName; }
85  const gd::String &GetActualValue() { return actualValue; }
86  size_t GetStartPosition() { return location.GetStartPosition(); }
87  size_t GetEndPosition() { return location.GetEndPosition(); }
88 
89 private:
90  gd::ExpressionParserError::ErrorType type;
91  gd::String message;
92  ExpressionParserLocation location;
93  gd::String objectName;
94  gd::String actualValue;
95 };
96 
101 struct GD_CORE_API ExpressionNode {
102  ExpressionNode() : parent(nullptr) {};
103  virtual ~ExpressionNode(){};
104  virtual void Visit(ExpressionParser2NodeWorker &worker){};
105 
106  std::unique_ptr<ExpressionParserError> diagnostic;
113  ExpressionNode *parent;
114 };
115 
116 struct GD_CORE_API SubExpressionNode : public ExpressionNode {
117  SubExpressionNode(std::unique_ptr<ExpressionNode> expression_)
118  : ExpressionNode(), expression(std::move(expression_)){};
119  virtual ~SubExpressionNode(){};
120  virtual void Visit(ExpressionParser2NodeWorker &worker) {
121  worker.OnVisitSubExpressionNode(*this);
122  };
123 
124  std::unique_ptr<ExpressionNode> expression;
125 };
126 
130 struct GD_CORE_API OperatorNode : public ExpressionNode {
131  OperatorNode(gd::String::value_type op_)
132  : ExpressionNode(), op(op_){};
133  virtual ~OperatorNode(){};
134  virtual void Visit(ExpressionParser2NodeWorker &worker) {
135  worker.OnVisitOperatorNode(*this);
136  };
137 
138  std::unique_ptr<ExpressionNode> leftHandSide;
139  std::unique_ptr<ExpressionNode> rightHandSide;
140  gd::String::value_type op;
141 };
142 
146 struct GD_CORE_API UnaryOperatorNode : public ExpressionNode {
147  UnaryOperatorNode(gd::String::value_type op_)
148  : ExpressionNode(), op(op_){};
149  virtual ~UnaryOperatorNode(){};
150  virtual void Visit(ExpressionParser2NodeWorker &worker) {
151  worker.OnVisitUnaryOperatorNode(*this);
152  };
153 
154  std::unique_ptr<ExpressionNode> factor;
155  gd::String::value_type op;
156 };
157 
162 struct GD_CORE_API NumberNode : public ExpressionNode {
163  NumberNode(const gd::String &number_)
164  : ExpressionNode(), number(number_){};
165  virtual ~NumberNode(){};
166  virtual void Visit(ExpressionParser2NodeWorker &worker) {
167  worker.OnVisitNumberNode(*this);
168  };
169 
170  //
171  gd::String number;
172 };
173 
178 struct GD_CORE_API TextNode : public ExpressionNode {
179  TextNode(const gd::String &text_) : ExpressionNode(), text(text_){};
180  virtual ~TextNode(){};
181  virtual void Visit(ExpressionParser2NodeWorker &worker) {
182  worker.OnVisitTextNode(*this);
183  };
184 
185  gd::String text;
186 };
187 
189  : public ExpressionNode {
191  : ExpressionNode(){};
192 };
193 
204 struct GD_CORE_API IdentifierNode
207  const gd::String &identifierName_)
209  identifierName(identifierName_),
210  childIdentifierName(""){};
212  const gd::String &identifierName_,
213  const gd::String &childIdentifierName_)
215  identifierName(identifierName_),
216  childIdentifierName(childIdentifierName_){};
217  virtual ~IdentifierNode(){};
218  virtual void Visit(ExpressionParser2NodeWorker &worker) {
219  worker.OnVisitIdentifierNode(*this);
220  };
221 
224 
225 
233 };
234 
240  void Visit(ExpressionParser2NodeWorker &worker) override{};
241 };
242 
245 
246  std::unique_ptr<VariableAccessorOrVariableBracketAccessorNode> child;
247 };
248 
263  VariableNode(const gd::String &name_)
265  virtual ~VariableNode(){};
266  virtual void Visit(ExpressionParser2NodeWorker &worker) {
267  worker.OnVisitVariableNode(*this);
268  };
269 
270  gd::String name;
271 
272  std::unique_ptr<VariableAccessorOrVariableBracketAccessorNode>
273  child; // Can be nullptr if no accessor
274 
275  ExpressionParserLocation nameLocation;
276 };
277 
282 struct GD_CORE_API VariableAccessorNode
284  VariableAccessorNode(const gd::String &name_)
286  virtual ~VariableAccessorNode(){};
287  virtual void Visit(ExpressionParser2NodeWorker &worker) {
288  worker.OnVisitVariableAccessorNode(*this);
289  };
290 
291  gd::String name;
292  ExpressionParserLocation nameLocation;
293  ExpressionParserLocation dotLocation;
294 };
295 
300 struct GD_CORE_API VariableBracketAccessorNode
302  VariableBracketAccessorNode(std::unique_ptr<ExpressionNode> expression_)
303  : VariableAccessorOrVariableBracketAccessorNode(), expression(std::move(expression_)){};
304  virtual ~VariableBracketAccessorNode(){};
305  virtual void Visit(ExpressionParser2NodeWorker &worker) {
306  worker.OnVisitVariableBracketAccessorNode(*this);
307  };
308 
309  std::unique_ptr<ExpressionNode> expression;
310 };
311 
321 struct GD_CORE_API ObjectFunctionNameNode
323  ObjectFunctionNameNode(const gd::String &objectName_,
324  const gd::String &objectFunctionOrBehaviorName_)
326  objectName(objectName_),
327  objectFunctionOrBehaviorName(objectFunctionOrBehaviorName_) {}
328  ObjectFunctionNameNode(const gd::String &objectName_,
329  const gd::String &behaviorName_,
330  const gd::String &behaviorFunctionName_)
332  objectName(objectName_),
333  objectFunctionOrBehaviorName(behaviorName_),
334  behaviorFunctionName(behaviorFunctionName_) {}
335  virtual ~ObjectFunctionNameNode(){};
336  virtual void Visit(ExpressionParser2NodeWorker &worker) {
337  worker.OnVisitObjectFunctionNameNode(*this);
338  };
339 
340  gd::String objectName;
347 
364 };
365 
374  FunctionCallNode(const gd::String &functionName_)
376  functionName(functionName_){};
377 
379  FunctionCallNode(const gd::String &objectName_,
380  const gd::String &functionName_)
382  objectName(objectName_),
383  functionName(functionName_){};
384 
386  FunctionCallNode(const gd::String &objectName_,
387  const gd::String &behaviorName_,
388  const gd::String &functionName_)
390  objectName(objectName_),
391  behaviorName(behaviorName_),
392  functionName(functionName_){};
393  virtual ~FunctionCallNode(){};
394  virtual void Visit(ExpressionParser2NodeWorker &worker) {
395  worker.OnVisitFunctionCallNode(*this);
396  };
397 
398  gd::String objectName;
399  gd::String behaviorName;
400  std::vector<std::unique_ptr<ExpressionNode>> parameters;
401  gd::String functionName;
402 
403  ExpressionParserLocation
418 };
419 
425  EmptyNode(const gd::String &text_ = "")
427  virtual ~EmptyNode(){};
428  virtual void Visit(ExpressionParser2NodeWorker &worker) {
429  worker.OnVisitEmptyNode(*this);
430  };
431 
432  gd::String text;
433 };
434 
435 } // namespace gd
The interface for any worker class ("visitor" pattern) that want to interact with the nodes of a pars...
Definition: ExpressionParser2NodeWorker.h:36
String represents an UTF8 encoded string.
Definition: String.h:33
Definition: CommonTools.h:24
An empty node, used when parsing failed/a syntax error was encountered and any other node could not m...
Definition: ExpressionParser2Node.h:424
The base node, from which all nodes in the tree of an expression inherits from.
Definition: ExpressionParser2Node.h:101
ExpressionParserLocation location
Definition: ExpressionParser2Node.h:107
An error that can be attached to a gd::ExpressionNode.
Definition: ExpressionParser2Node.h:46
Definition: ExpressionParser2Node.h:25
A function call node (either free function, object function or object behavior function)....
Definition: ExpressionParser2Node.h:372
FunctionCallNode(const gd::String &objectName_, const gd::String &functionName_)
Construct an object function call node.
Definition: ExpressionParser2Node.h:379
ExpressionParserLocation objectNameLocation
Location of the object name, if any.
Definition: ExpressionParser2Node.h:406
FunctionCallNode(const gd::String &functionName_)
Construct a free function call node.
Definition: ExpressionParser2Node.h:374
FunctionCallNode(const gd::String &objectName_, const gd::String &behaviorName_, const gd::String &functionName_)
Construct a behavior function call node.
Definition: ExpressionParser2Node.h:386
ExpressionParserLocation objectNameDotLocation
Location of the "." after the object name.
Definition: ExpressionParser2Node.h:408
ExpressionParserLocation openingParenthesisLocation
Location of the "(".
Definition: ExpressionParser2Node.h:415
ExpressionParserLocation functionNameLocation
Location of the function name.
Definition: ExpressionParser2Node.h:404
ExpressionParserLocation behaviorNameNamespaceSeparatorLocation
Definition: ExpressionParser2Node.h:412
ExpressionParserLocation behaviorNameLocation
Location of the behavior name, if any.
Definition: ExpressionParser2Node.h:410
ExpressionParserLocation closingParenthesisLocation
Location of the ")".
Definition: ExpressionParser2Node.h:417
Definition: ExpressionParser2Node.h:236
An identifier node, usually representing an object or a variable with an optional function name or ch...
Definition: ExpressionParser2Node.h:205
ExpressionParserLocation identifierNameDotLocation
Location of the "." after the object or variable name.
Definition: ExpressionParser2Node.h:229
ExpressionParserLocation childIdentifierNameLocation
Definition: ExpressionParser2Node.h:230
ExpressionParserLocation identifierNameLocation
Location of the object or variable name.
Definition: ExpressionParser2Node.h:227
gd::String childIdentifierName
The object function or variable child name.
Definition: ExpressionParser2Node.h:223
gd::String identifierName
The object or variable name.
Definition: ExpressionParser2Node.h:220
A number node. For example: "123". Its type is always "number".
Definition: ExpressionParser2Node.h:162
The name of a function to call on an object or the behavior For example: "MyObject....
Definition: ExpressionParser2Node.h:322
ExpressionParserLocation behaviorNameNamespaceSeparatorLocation
Definition: ExpressionParser2Node.h:359
gd::String objectFunctionOrBehaviorName
Definition: ExpressionParser2Node.h:341
ExpressionParserLocation objectNameLocation
Location of the object name.
Definition: ExpressionParser2Node.h:349
ExpressionParserLocation behaviorFunctionNameLocation
Definition: ExpressionParser2Node.h:361
ExpressionParserLocation objectNameDotLocation
Location of the "." after the object name.
Definition: ExpressionParser2Node.h:351
gd::String behaviorFunctionName
Definition: ExpressionParser2Node.h:344
ExpressionParserLocation objectFunctionOrBehaviorNameLocation
Definition: ExpressionParser2Node.h:352
An operator node. For example: "lhs + rhs".
Definition: ExpressionParser2Node.h:130
Definition: ExpressionParser2Node.h:116
A text node. For example: "Hello World". Its type is always "string".
Definition: ExpressionParser2Node.h:178
A unary operator node. For example: "-2".
Definition: ExpressionParser2Node.h:146
A direct accessor to a child variable. Example: MyChild in MyVariable.MyChild.
Definition: ExpressionParser2Node.h:283
Definition: ExpressionParser2Node.h:243
A bracket accessor to a child variable. Example: ["MyChild"] (in MyVariable["MyChild"]).
Definition: ExpressionParser2Node.h:301
A variable, or object variable, with bracket accessor or at least 2 "dot" accessors.
Definition: ExpressionParser2Node.h:262