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 #ifndef GDCORE_EXPRESSIONPARSER2NODES_H
7 #define GDCORE_EXPRESSIONPARSER2NODES_H
8 
9 #include <memory>
10 #include <vector>
11 
12 #include "ExpressionParser2NodeWorker.h"
13 #include "GDCore/String.h"
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;
40  size_t endPosition;
41 };
42 
46 struct GD_CORE_API ExpressionParserDiagnostic {
47  virtual ~ExpressionParserDiagnostic() = default;
48  virtual bool IsError() { return false; }
49  virtual const gd::String &GetMessage() { return noMessage; }
50  virtual size_t GetStartPosition() { return 0; }
51  virtual size_t GetEndPosition() { return 0; }
52 
53  private:
54  static gd::String noMessage;
55 };
56 
61  ExpressionParserError(const gd::String &type_,
62  const gd::String &message_,
63  const ExpressionParserLocation &location_)
64  : type(type_), message(message_), location(location_){};
65  ExpressionParserError(const gd::String &type_,
66  const gd::String &message_,
67  size_t position_)
68  : type(type_), message(message_), location(position_){};
69  ExpressionParserError(const gd::String &type_,
70  const gd::String &message_,
71  size_t startPosition_,
72  size_t endPosition_)
73  : type(type_),
74  message(message_),
75  location(startPosition_, endPosition_){};
76  virtual ~ExpressionParserError(){};
77 
78  bool IsError() override { return true; }
79  const gd::String &GetMessage() override { return message; }
80  size_t GetStartPosition() override { return location.GetStartPosition(); }
81  size_t GetEndPosition() override { return location.GetEndPosition(); }
82 
83  private:
84  gd::String type;
85  gd::String message;
86  ExpressionParserLocation location;
87 };
88 
93 struct GD_CORE_API ExpressionNode {
94  ExpressionNode() : parent(nullptr) {};
95  virtual ~ExpressionNode(){};
96  virtual void Visit(ExpressionParser2NodeWorker &worker){};
97 
98  std::unique_ptr<ExpressionParserDiagnostic> diagnostic;
105  ExpressionNode *parent;
106 };
107 
108 struct GD_CORE_API SubExpressionNode : public ExpressionNode {
109  SubExpressionNode(std::unique_ptr<ExpressionNode> expression_)
110  : ExpressionNode(), expression(std::move(expression_)){};
111  virtual ~SubExpressionNode(){};
112  virtual void Visit(ExpressionParser2NodeWorker &worker) {
113  worker.OnVisitSubExpressionNode(*this);
114  };
115 
116  std::unique_ptr<ExpressionNode> expression;
117 };
118 
122 struct GD_CORE_API OperatorNode : public ExpressionNode {
123  OperatorNode(gd::String::value_type op_)
124  : ExpressionNode(), op(op_){};
125  virtual ~OperatorNode(){};
126  virtual void Visit(ExpressionParser2NodeWorker &worker) {
127  worker.OnVisitOperatorNode(*this);
128  };
129 
130  std::unique_ptr<ExpressionNode> leftHandSide;
131  std::unique_ptr<ExpressionNode> rightHandSide;
132  gd::String::value_type op;
133 };
134 
138 struct GD_CORE_API UnaryOperatorNode : public ExpressionNode {
139  UnaryOperatorNode(gd::String::value_type op_)
140  : ExpressionNode(), op(op_){};
141  virtual ~UnaryOperatorNode(){};
142  virtual void Visit(ExpressionParser2NodeWorker &worker) {
143  worker.OnVisitUnaryOperatorNode(*this);
144  };
145 
146  std::unique_ptr<ExpressionNode> factor;
147  gd::String::value_type op;
148 };
149 
154 struct GD_CORE_API NumberNode : public ExpressionNode {
155  NumberNode(const gd::String &number_)
156  : ExpressionNode(), number(number_){};
157  virtual ~NumberNode(){};
158  virtual void Visit(ExpressionParser2NodeWorker &worker) {
159  worker.OnVisitNumberNode(*this);
160  };
161 
162  //
163  gd::String number;
164 };
165 
170 struct GD_CORE_API TextNode : public ExpressionNode {
171  TextNode(const gd::String &text_) : ExpressionNode(), text(text_){};
172  virtual ~TextNode(){};
173  virtual void Visit(ExpressionParser2NodeWorker &worker) {
174  worker.OnVisitTextNode(*this);
175  };
176 
177  gd::String text;
178 };
179 
181  : public ExpressionNode {
183  : ExpressionNode(){};
184 };
185 
196 struct GD_CORE_API IdentifierNode
199  const gd::String &identifierName_)
201  identifierName(identifierName_),
202  childIdentifierName(""){};
204  const gd::String &identifierName_,
205  const gd::String &childIdentifierName_)
207  identifierName(identifierName_),
208  childIdentifierName(childIdentifierName_){};
209  virtual ~IdentifierNode(){};
210  virtual void Visit(ExpressionParser2NodeWorker &worker) {
211  worker.OnVisitIdentifierNode(*this);
212  };
213 
216 
217 
225 };
226 
232  void Visit(ExpressionParser2NodeWorker &worker) override{};
233 };
234 
237 
238  std::unique_ptr<VariableAccessorOrVariableBracketAccessorNode> child;
239 };
240 
255  VariableNode(const gd::String &name_)
257  virtual ~VariableNode(){};
258  virtual void Visit(ExpressionParser2NodeWorker &worker) {
259  worker.OnVisitVariableNode(*this);
260  };
261 
262  gd::String name;
263 
264  std::unique_ptr<VariableAccessorOrVariableBracketAccessorNode>
265  child; // Can be nullptr if no accessor
266 
267  ExpressionParserLocation nameLocation;
268 };
269 
274 struct GD_CORE_API VariableAccessorNode
276  VariableAccessorNode(const gd::String &name_)
278  virtual ~VariableAccessorNode(){};
279  virtual void Visit(ExpressionParser2NodeWorker &worker) {
280  worker.OnVisitVariableAccessorNode(*this);
281  };
282 
283  gd::String name;
284  ExpressionParserLocation nameLocation;
285  ExpressionParserLocation dotLocation;
286 };
287 
292 struct GD_CORE_API VariableBracketAccessorNode
294  VariableBracketAccessorNode(std::unique_ptr<ExpressionNode> expression_)
295  : VariableAccessorOrVariableBracketAccessorNode(), expression(std::move(expression_)){};
296  virtual ~VariableBracketAccessorNode(){};
297  virtual void Visit(ExpressionParser2NodeWorker &worker) {
298  worker.OnVisitVariableBracketAccessorNode(*this);
299  };
300 
301  std::unique_ptr<ExpressionNode> expression;
302 };
303 
313 struct GD_CORE_API ObjectFunctionNameNode
315  ObjectFunctionNameNode(const gd::String &objectName_,
316  const gd::String &objectFunctionOrBehaviorName_)
318  objectName(objectName_),
319  objectFunctionOrBehaviorName(objectFunctionOrBehaviorName_) {}
320  ObjectFunctionNameNode(const gd::String &objectName_,
321  const gd::String &behaviorName_,
322  const gd::String &behaviorFunctionName_)
324  objectName(objectName_),
325  objectFunctionOrBehaviorName(behaviorName_),
326  behaviorFunctionName(behaviorFunctionName_) {}
327  virtual ~ObjectFunctionNameNode(){};
328  virtual void Visit(ExpressionParser2NodeWorker &worker) {
329  worker.OnVisitObjectFunctionNameNode(*this);
330  };
331 
332  gd::String objectName;
339 
356 };
357 
366  FunctionCallNode(const gd::String &functionName_)
368  functionName(functionName_){};
369 
371  FunctionCallNode(const gd::String &objectName_,
372  const gd::String &functionName_)
374  objectName(objectName_),
375  functionName(functionName_){};
376 
378  FunctionCallNode(const gd::String &objectName_,
379  const gd::String &behaviorName_,
380  const gd::String &functionName_)
382  objectName(objectName_),
383  behaviorName(behaviorName_),
384  functionName(functionName_){};
385  virtual ~FunctionCallNode(){};
386  virtual void Visit(ExpressionParser2NodeWorker &worker) {
387  worker.OnVisitFunctionCallNode(*this);
388  };
389 
390  gd::String objectName;
391  gd::String behaviorName;
392  std::vector<std::unique_ptr<ExpressionNode>> parameters;
393  gd::String functionName;
394 
395  ExpressionParserLocation
410 };
411 
417  EmptyNode(const gd::String &text_ = "")
419  virtual ~EmptyNode(){};
420  virtual void Visit(ExpressionParser2NodeWorker &worker) {
421  worker.OnVisitEmptyNode(*this);
422  };
423 
424  gd::String text;
425 };
426 
427 } // namespace gd
428 
429 #endif
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:31
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:416
The base node, from which all nodes in the tree of an expression inherits from.
Definition: ExpressionParser2Node.h:93
ExpressionParserLocation location
Definition: ExpressionParser2Node.h:99
A diagnostic that can be attached to a gd::ExpressionNode.
Definition: ExpressionParser2Node.h:46
An error that can be attached to a gd::ExpressionNode.
Definition: ExpressionParser2Node.h:60
Definition: ExpressionParser2Node.h:25
A function call node (either free function, object function or object behavior function)....
Definition: ExpressionParser2Node.h:364
FunctionCallNode(const gd::String &objectName_, const gd::String &functionName_)
Construct an object function call node.
Definition: ExpressionParser2Node.h:371
ExpressionParserLocation objectNameLocation
Location of the object name, if any.
Definition: ExpressionParser2Node.h:398
FunctionCallNode(const gd::String &functionName_)
Construct a free function call node.
Definition: ExpressionParser2Node.h:366
FunctionCallNode(const gd::String &objectName_, const gd::String &behaviorName_, const gd::String &functionName_)
Construct a behavior function call node.
Definition: ExpressionParser2Node.h:378
ExpressionParserLocation objectNameDotLocation
Location of the "." after the object name.
Definition: ExpressionParser2Node.h:400
ExpressionParserLocation openingParenthesisLocation
Location of the "(".
Definition: ExpressionParser2Node.h:407
ExpressionParserLocation functionNameLocation
Location of the function name.
Definition: ExpressionParser2Node.h:396
ExpressionParserLocation behaviorNameNamespaceSeparatorLocation
Definition: ExpressionParser2Node.h:404
ExpressionParserLocation behaviorNameLocation
Location of the behavior name, if any.
Definition: ExpressionParser2Node.h:402
ExpressionParserLocation closingParenthesisLocation
Location of the ")".
Definition: ExpressionParser2Node.h:409
Definition: ExpressionParser2Node.h:228
An identifier node, usually representing an object or a variable with an optional function name or ch...
Definition: ExpressionParser2Node.h:197
ExpressionParserLocation identifierNameDotLocation
Location of the "." after the object or variable name.
Definition: ExpressionParser2Node.h:221
ExpressionParserLocation childIdentifierNameLocation
Definition: ExpressionParser2Node.h:222
ExpressionParserLocation identifierNameLocation
Location of the object or variable name.
Definition: ExpressionParser2Node.h:219
gd::String childIdentifierName
The object function or variable child name.
Definition: ExpressionParser2Node.h:215
gd::String identifierName
The object or variable name.
Definition: ExpressionParser2Node.h:212
A number node. For example: "123". Its type is always "number".
Definition: ExpressionParser2Node.h:154
The name of a function to call on an object or the behavior For example: "MyObject....
Definition: ExpressionParser2Node.h:314
ExpressionParserLocation behaviorNameNamespaceSeparatorLocation
Definition: ExpressionParser2Node.h:351
gd::String objectFunctionOrBehaviorName
Definition: ExpressionParser2Node.h:333
ExpressionParserLocation objectNameLocation
Location of the object name.
Definition: ExpressionParser2Node.h:341
ExpressionParserLocation behaviorFunctionNameLocation
Definition: ExpressionParser2Node.h:353
ExpressionParserLocation objectNameDotLocation
Location of the "." after the object name.
Definition: ExpressionParser2Node.h:343
gd::String behaviorFunctionName
Definition: ExpressionParser2Node.h:336
ExpressionParserLocation objectFunctionOrBehaviorNameLocation
Definition: ExpressionParser2Node.h:344
An operator node. For example: "lhs + rhs".
Definition: ExpressionParser2Node.h:122
Definition: ExpressionParser2Node.h:108
A text node. For example: "Hello World". Its type is always "string".
Definition: ExpressionParser2Node.h:170
A unary operator node. For example: "-2".
Definition: ExpressionParser2Node.h:138
A direct accessor to a child variable. Example: MyChild in MyVariable.MyChild.
Definition: ExpressionParser2Node.h:275
Definition: ExpressionParser2Node.h:235
A bracket accessor to a child variable. Example: ["MyChild"] (in MyVariable["MyChild"]).
Definition: ExpressionParser2Node.h:293
A variable, or object variable, with bracket accessor or at least 2 "dot" accessors.
Definition: ExpressionParser2Node.h:254