TorqueScript  0.2
ast.hpp
1 
15 #pragma once
16 
17 #include <cstddef>
18 #include <vector>
19 #include <string>
20 #include <memory>
21 #include <map>
22 
23 #include <torquescript/astvisitor.hpp>
24 #include <torquescript/stringtable.hpp>
25 #include <torquescript/instructionsequence.hpp>
26 
27 namespace TorqueScript
28 {
29  namespace AST
30  {
35  class ASTNode
36  {
37  public:
38  virtual ~ASTNode()
39  {
40 
41  }
42 
43  virtual antlrcpp::Any accept(ASTVisitor* visitor) = 0;
44  };
45 
47  {
48  public:
49  ProgramNode(const std::vector<ASTNode*>& nodes) : mNodes(nodes)
50  {
51 
52  }
53 
54  virtual ~ProgramNode()
55  {
56  for (ASTNode* node : mNodes)
57  {
58  delete node;
59  }
60  }
61 
62  virtual antlrcpp::Any accept(ASTVisitor* visitor)
63  {
64  return visitor->visitProgramNode(this);
65  }
66 
67  std::vector<ASTNode*> mNodes;
68  };
69 
71  {
72  public:
73  FunctionDeclarationNode(const std::string space, const std::string& name, const std::vector<std::string>& parameterNames, const std::vector<ASTNode*> body) :
74  mNameSpace(space), mName(name), mParameterNames(parameterNames), mBody(body)
75  {
76 
77  }
78 
79  virtual ~FunctionDeclarationNode()
80  {
81  for (ASTNode* node : mBody)
82  {
83  delete node;
84  }
85  }
86 
87  virtual antlrcpp::Any accept(ASTVisitor* visitor)
88  {
89  return visitor->visitFunctionDeclarationNode(this);
90  }
91 
92  std::string mNameSpace;
93  std::string mName;
94  std::vector<std::string> mParameterNames;
95  std::vector<ASTNode*> mBody;
96  };
97 
99  {
100  public:
101  PackageDeclarationNode(const std::string& name, const std::vector<ASTNode*>& functions) : mName(name), mFunctions(functions)
102  {
103 
104  }
105 
106  virtual ~PackageDeclarationNode()
107  {
108  for (ASTNode* function : mFunctions)
109  {
110  delete function;
111  }
112  }
113 
114  virtual antlrcpp::Any accept(ASTVisitor* visitor)
115  {
116  return visitor->visitPackageDeclarationNode(this);
117  }
118 
119  std::string mName;
120  std::vector<ASTNode*> mFunctions;
121  };
122 
123  class FieldAssignNode : public ASTNode
124  {
125  public:
126  FieldAssignNode(const std::string& fieldBaseName, const std::vector<ASTNode*>& fieldExpressions, ASTNode* right) : mFieldBaseName(fieldBaseName), mFieldExpressions(fieldExpressions), mRight(right)
127  {
128 
129  }
130 
131  virtual antlrcpp::Any accept(ASTVisitor* visitor)
132  {
133  return visitor->visitFieldAssignNode(this);
134  }
135 
136  std::string mFieldBaseName;
137  std::vector<ASTNode*> mFieldExpressions;
138  ASTNode* mRight;
139  };
140 
142  {
143  public:
144  ObjectDeclarationNode(ASTNode* name, ASTNode* type, const std::vector<ObjectDeclarationNode*>& children, const std::vector<ASTNode*>& fields) : mName(name), mType(type), mChildren(children), mFields(fields)
145  {
146  }
147 
148  virtual antlrcpp::Any accept(ASTVisitor* visitor)
149  {
150  return visitor->visitObjectDeclarationNode(this);
151  }
152 
153  ASTNode* mName;
154  ASTNode* mType;
155 
156  std::vector<ObjectDeclarationNode*> mChildren;
157  std::vector<ASTNode*> mFields;
158  };
159 
161  {
162  public:
163  DatablockDeclarationNode(const std::string& name, const std::string& type, const std::string& parentName, const std::vector<ASTNode*>& fields) : mName(name), mType(type), mParentName(parentName), mFields(fields)
164  {
165  }
166 
167  virtual antlrcpp::Any accept(ASTVisitor* visitor)
168  {
169  return visitor->visitDatablockDeclarationNode(this);
170  }
171 
172  std::string mName;
173  std::string mType;
174  std::string mParentName;
175 
176  std::vector<ASTNode*> mFields;
177  };
178 
179  class FunctionCallNode : public ASTNode
180  {
181  public:
182  FunctionCallNode(const std::string& space, const std::string& name, const std::vector<ASTNode*> parameters) :
183  mNameSpace(space), mName(name), mParameters(parameters)
184  {
185 
186  }
187 
188  virtual ~FunctionCallNode()
189  {
190  for (ASTNode* parameter : mParameters)
191  {
192  delete parameter;
193  }
194  }
195 
196  virtual antlrcpp::Any accept(ASTVisitor* visitor)
197  {
198  return visitor->visitFunctionCallNode(this);
199  }
200 
201  std::string mNameSpace;
202  std::string mName;
203  std::vector<ASTNode*> mParameters;
204  };
205 
207  {
208  public:
209  SubFunctionCallNode(ASTNode* target, const std::string& name, const std::vector<ASTNode*> parameters) :
210  mTarget(target), mName(name), mParameters(parameters)
211  {
212 
213  }
214 
215  virtual ~SubFunctionCallNode()
216  {
217  delete mTarget;
218 
219  for (ASTNode* parameter : mParameters)
220  {
221  delete parameter;
222  }
223  }
224 
225  virtual antlrcpp::Any accept(ASTVisitor* visitor)
226  {
227  return visitor->visitSubFunctionCallNode(this);
228  }
229 
230  ASTNode* mTarget;
231  std::string mName;
232  std::vector<ASTNode*> mParameters;
233  };
234 
235  class SubFieldNode : public ASTNode
236  {
237  public:
238  SubFieldNode(ASTNode* target, const std::string& name, const std::vector<ASTNode*>& indices) : mTarget(target), mName(name), mIndices(indices)
239  {
240 
241  }
242 
243  virtual ~SubFieldNode()
244  {
245  delete mTarget;
246  }
247 
248  virtual antlrcpp::Any accept(ASTVisitor* visitor)
249  {
250  return visitor->visitSubFieldNode(this);
251  }
252 
253  ASTNode* mTarget;
254  std::string mName;
255  std::vector<ASTNode*> mIndices;
256  };
257 
259  {
260  public:
261  InfixExpressionNode(ASTNode* left, ASTNode* right) : mLeft(left), mRight(right)
262  {
263 
264  }
265 
266  virtual ~InfixExpressionNode()
267  {
268  delete mLeft;
269  delete mRight;
270  }
271 
272 
273  ASTNode* mLeft;
274  ASTNode* mRight;
275  };
276 
278  {
279  public:
280  AddNode(ASTNode* left, ASTNode* right) : InfixExpressionNode(left, right)
281  {
282 
283  }
284 
285  virtual antlrcpp::Any accept(ASTVisitor* visitor)
286  {
287  return visitor->visitAddNode(this);
288  }
289  };
290 
292  {
293  public:
294  SubtractNode(ASTNode* left, ASTNode* right) : InfixExpressionNode(left, right)
295  {
296 
297  }
298 
299  virtual antlrcpp::Any accept(ASTVisitor* visitor)
300  {
301  return visitor->visitSubtractNode(this);
302  }
303  };
304 
306  {
307  public:
308  MultiplyNode(ASTNode* left, ASTNode* right) : InfixExpressionNode(left, right)
309  {
310 
311  }
312 
313  virtual antlrcpp::Any accept(ASTVisitor* visitor)
314  {
315  return visitor->visitMultiplyNode(this);
316  }
317  };
318 
320  {
321  public:
322  DivideNode(ASTNode* left, ASTNode* right) : InfixExpressionNode(left, right)
323  {
324 
325  }
326 
327  virtual antlrcpp::Any accept(ASTVisitor* visitor)
328  {
329  return visitor->visitDivideNode(this);
330  }
331  };
332 
334  {
335  public:
336  ConcatNode(ASTNode* left, ASTNode* right, const std::string& seperator) : InfixExpressionNode(left, right), mSeperator(seperator)
337  {
338 
339  }
340 
341  virtual antlrcpp::Any accept(ASTVisitor* visitor)
342  {
343  return visitor->visitConcatNode(this);
344  }
345 
346  std::string mSeperator;
347  };
348 
350  {
351  public:
352  EqualsNode(ASTNode* left, ASTNode* right) : InfixExpressionNode(left, right)
353  {
354 
355  }
356 
357  virtual antlrcpp::Any accept(ASTVisitor* visitor)
358  {
359  return visitor->visitEqualsNode(this);
360  }
361  };
362 
364  {
365  public:
366  AssignmentNode(ASTNode* left, ASTNode* right) : InfixExpressionNode(left, right)
367  {
368 
369  }
370 
371  virtual antlrcpp::Any accept(ASTVisitor* visitor)
372  {
373  return visitor->visitAssignmentNode(this);
374  }
375  };
376 
378  {
379  public:
380  LessThanNode(ASTNode* left, ASTNode* right) : InfixExpressionNode(left, right)
381  {
382 
383  }
384 
385  virtual antlrcpp::Any accept(ASTVisitor* visitor)
386  {
387  return visitor->visitLessThanNode(this);
388  }
389  };
390 
391  class UnaryNode : public ASTNode
392  {
393  public:
394  UnaryNode(ASTNode* inner) : mInner(inner)
395  {
396 
397  }
398 
399  virtual ~UnaryNode()
400  {
401  delete mInner;
402  }
403 
404  ASTNode* mInner;
405  };
406 
407  class NegateNode : public UnaryNode
408  {
409  public:
410  NegateNode(ASTNode* inner) : UnaryNode(inner)
411  {
412 
413  }
414 
415  virtual antlrcpp::Any accept(ASTVisitor* visitor)
416  {
417  return visitor->visitNegateNode(this);
418  }
419  };
420 
421  class NotNode : public UnaryNode
422  {
423  public:
424  NotNode(ASTNode* inner) : UnaryNode(inner)
425  {
426 
427  }
428 
429  virtual antlrcpp::Any accept(ASTVisitor* visitor)
430  {
431  return visitor->visitNotNode(this);
432  }
433  };
434 
435  class IncrementNode : public UnaryNode
436  {
437  public:
438  IncrementNode(ASTNode* inner) : UnaryNode(inner)
439  {
440 
441  }
442 
443  virtual antlrcpp::Any accept(ASTVisitor* visitor)
444  {
445  return visitor->visitIncrementNode(this);
446  }
447  };
448 
449  class DecrementNode : public UnaryNode
450  {
451  public:
452  DecrementNode(ASTNode* inner) : UnaryNode(inner)
453  {
454 
455  }
456 
457  virtual antlrcpp::Any accept(ASTVisitor* visitor)
458  {
459  return visitor->visitDecrementNode(this);
460  }
461  };
462 
463  class ValueNode : public ASTNode
464  {
465  public:
466  };
467 
468  class IntegerNode : public ValueNode
469  {
470  public:
471  IntegerNode(const int value) : mValue(value)
472  {
473 
474  }
475 
476  virtual antlrcpp::Any accept(ASTVisitor* visitor)
477  {
478  return visitor->visitIntegerNode(this);
479  }
480 
481  int mValue;
482  };
483 
484  class FloatNode : public ValueNode
485  {
486  public:
487  FloatNode(const float value) : mValue(value)
488  {
489 
490  }
491 
492  virtual antlrcpp::Any accept(ASTVisitor* visitor)
493  {
494  return visitor->visitFloatNode(this);
495  }
496 
497  float mValue;
498  };
499 
500  class StringNode : public ValueNode
501  {
502  public:
503  StringNode(const std::string& value) : mValue(value)
504  {
505 
506  }
507 
508  virtual antlrcpp::Any accept(ASTVisitor* visitor)
509  {
510  return visitor->visitStringNode(this);
511  }
512 
513  std::string mValue;
514  };
515 
517  {
518  public:
519  TaggedStringNode(const std::string& value) : mValue(value)
520  {
521 
522  }
523 
524  virtual antlrcpp::Any accept(ASTVisitor* visitor)
525  {
526  return visitor->visitTaggedStringNode(this);
527  }
528 
529  std::string mValue;
530  };
531 
533  {
534  public:
535  LocalVariableNode(const std::vector<std::string>& name) : mName(name)
536  {
537 
538  }
539 
540  std::string getName()
541  {
542  std::string result = "";
543  for (const std::string& component : mName)
544  {
545  if (result.size() == 0)
546  {
547  result = component;
548  }
549  else
550  {
551  result += "::" + component;
552  }
553  }
554  return result;
555  }
556 
557  virtual antlrcpp::Any accept(ASTVisitor* visitor)
558  {
559  return visitor->visitLocalVariableNode(this);
560  }
561 
562  std::vector<std::string> mName;
563  };
564 
566  {
567  public:
568  GlobalVariableNode(const std::vector<std::string>& name) : mName(name)
569  {
570 
571  }
572 
573  std::string getName()
574  {
575  std::string result = "";
576  for (const std::string& component : mName)
577  {
578  if (result.size() == 0)
579  {
580  result = component;
581  }
582  else
583  {
584  result += "::" + component;
585  }
586  }
587  return result;
588  }
589 
590  virtual antlrcpp::Any accept(ASTVisitor* visitor)
591  {
592  return visitor->visitGlobalVariableNode(this);
593  }
594 
595  std::vector<std::string> mName;
596  };
597 
598  class ArrayNode : public ASTNode
599  {
600  public:
601  ArrayNode(ASTNode* target, const std::vector<ASTNode*>& indices) :
602  mTarget(target), mIndices(indices)
603  {
604 
605  }
606 
607  virtual ~ArrayNode()
608  {
609  delete mTarget;
610 
611  for (ASTNode* index : mIndices)
612  {
613  delete index;
614  }
615  }
616 
617  virtual antlrcpp::Any accept(ASTVisitor* visitor)
618  {
619  return visitor->visitArrayNode(this);
620  }
621 
622  ASTNode* mTarget;
623  std::vector<ASTNode*> mIndices;
624  };
625 
626  class WhileNode : public ASTNode
627  {
628  public:
629  WhileNode(ASTNode* expression, const std::vector<ASTNode*>& body) : mExpression(expression), mBody(body)
630  {
631 
632  }
633 
634  virtual ~WhileNode()
635  {
636  delete mExpression;
637 
638  for (ASTNode* node : mBody)
639  {
640  delete node;
641  }
642  }
643 
644  virtual antlrcpp::Any accept(ASTVisitor* visitor)
645  {
646  return visitor->visitWhileNode(this);
647  }
648 
649  ASTNode* mExpression;
650  std::vector<ASTNode*> mBody;
651  };
652 
653  class ForNode : public ASTNode
654  {
655  public:
656  ForNode(ASTNode* initializer, ASTNode* expression, ASTNode* advance, const std::vector<ASTNode*>& body) :
657  mInitializer(initializer), mExpression(expression), mAdvance(advance), mBody(body)
658  {
659 
660  }
661 
662  virtual ~ForNode()
663  {
664  delete mInitializer;
665  delete mExpression;
666  delete mAdvance;
667 
668  for (ASTNode* node : mBody)
669  {
670  delete node;
671  }
672  }
673 
674  virtual antlrcpp::Any accept(ASTVisitor* visitor)
675  {
676  return visitor->visitForNode(this);
677  }
678 
679  ASTNode* mInitializer;
680  ASTNode* mExpression;
681  ASTNode* mAdvance;
682  std::vector<ASTNode*> mBody;
683  };
684 
685  class ReturnNode : public ASTNode
686  {
687  public:
688  ReturnNode(ASTNode* expression) : mExpression(expression)
689  {
690 
691  }
692 
693  virtual ~ReturnNode()
694  {
695  if (mExpression)
696  {
697  delete mExpression;
698  }
699  }
700 
701  virtual antlrcpp::Any accept(ASTVisitor* visitor)
702  {
703  return visitor->visitReturnNode(this);
704  }
705 
706  ASTNode* mExpression;
707  };
708 
709  class BreakNode : public ASTNode
710  {
711  public:
712  BreakNode()
713  {
714 
715  }
716 
717  virtual antlrcpp::Any accept(ASTVisitor* visitor)
718  {
719  return visitor->visitBreakNode(this);
720  }
721  };
722 
723  class TernaryNode : public ASTNode
724  {
725  public:
726  TernaryNode(ASTNode* expression, ASTNode* trueValue, ASTNode* falseValue) :
727  mExpression(expression), mTrueValue(trueValue), mFalseValue(falseValue)
728  {
729 
730  }
731 
732  virtual ~TernaryNode()
733  {
734  delete mExpression;
735  delete mTrueValue;
736  delete mFalseValue;
737  }
738 
739  virtual antlrcpp::Any accept(ASTVisitor* visitor)
740  {
741  return visitor->visitTernaryNode(this);
742  }
743 
744  ASTNode* mExpression;
745  ASTNode* mTrueValue;
746  ASTNode* mFalseValue;
747  };
748 
749  class SwitchCaseNode : public ASTNode
750  {
751  public:
752  SwitchCaseNode(const std::vector<ASTNode*> cases, const std::vector<ASTNode*> body) : mCases(cases), mBody(body)
753  {
754 
755  }
756 
757  virtual antlrcpp::Any accept(ASTVisitor* visitor)
758  {
759  return visitor->visitSwitchCaseNode(this);
760  }
761 
762  std::vector<ASTNode*> mCases;
763  std::vector<ASTNode*> mBody;
764  };
765 
766  class SwitchNode : public ASTNode
767  {
768  public:
769  SwitchNode(ASTNode* expression, const std::vector<SwitchCaseNode*> cases, const std::vector<ASTNode*> defaultBody) :
770  mExpression(expression), mCases(cases), mDefaultBody(defaultBody)
771  {
772 
773  }
774 
775  virtual ~SwitchNode()
776  {
777  delete mExpression;
778 
779  for (SwitchCaseNode* switchCase : mCases)
780  {
781  delete switchCase;
782  }
783 
784  for (ASTNode* node : mDefaultBody)
785  {
786  delete node;
787  }
788  }
789 
790  virtual antlrcpp::Any accept(ASTVisitor* visitor)
791  {
792  return visitor->visitSwitchNode(this);
793  }
794 
795  ASTNode* mExpression;
796  std::vector<SwitchCaseNode*> mCases;
797  std::vector<ASTNode*> mDefaultBody;
798  };
799 
800  class ElseIfNode : public ASTNode
801  {
802  public:
803  ElseIfNode(ASTNode* expression, std::vector<ASTNode*> body) : mExpression(expression), mBody(body)
804  {
805 
806  }
807 
808  virtual ~ElseIfNode()
809  {
810  delete mExpression;
811 
812  for (ASTNode* node : mBody)
813  {
814  delete node;
815  }
816  }
817 
818  virtual antlrcpp::Any accept(ASTVisitor* visitor)
819  {
820  return visitor->visitElseIfNode(this);
821  }
822 
823  ASTNode* mExpression;
824  std::vector<ASTNode*> mBody;
825  };
826 
827  class IfNode : public ASTNode
828  {
829  public:
830  IfNode(ASTNode* expression, const std::vector<ASTNode*>& body, const std::vector<ElseIfNode*>& elseIfs, const std::vector<ASTNode*>& elseBody) :
831  mExpression(expression), mBody(body), mElseIfs(elseIfs), mElseBody(elseBody)
832  {
833 
834  }
835 
836  virtual ~IfNode()
837  {
838  delete mExpression;
839 
840  for (ASTNode* node : mBody)
841  {
842  delete node;
843  }
844 
845  for (ElseIfNode* elseIf : mElseIfs)
846  {
847  delete elseIf;
848  }
849 
850  for (ASTNode* node : mElseBody)
851  {
852  delete node;
853  }
854  }
855 
856  virtual antlrcpp::Any accept(ASTVisitor* visitor)
857  {
858  return visitor->visitIfNode(this);
859  }
860 
861  ASTNode* mExpression;
862  std::vector<ASTNode*> mBody;
863  std::vector<ElseIfNode*> mElseIfs;
864  std::vector<ASTNode*> mElseBody;
865  };
866  }
867 }
Base AST node class. All AST nodes should derive from this class.
Definition: ast.hpp:36
Definition: astvisitor.hpp:65
Definition: ast.hpp:278
Definition: ast.hpp:599
Definition: ast.hpp:364
Definition: ast.hpp:710
Definition: ast.hpp:334
Definition: ast.hpp:450
Definition: ast.hpp:320
Definition: ast.hpp:801
Definition: ast.hpp:350
Definition: ast.hpp:124
Definition: ast.hpp:485
Definition: ast.hpp:654
Definition: ast.hpp:828
Definition: ast.hpp:436
Definition: ast.hpp:469
Definition: ast.hpp:378
Definition: ast.hpp:306
Definition: ast.hpp:408
Definition: ast.hpp:422
Definition: ast.hpp:47
Definition: ast.hpp:686
Definition: ast.hpp:501
Definition: ast.hpp:236
Definition: ast.hpp:292
Definition: ast.hpp:750
Definition: ast.hpp:767
Definition: ast.hpp:724
Definition: ast.hpp:392
Definition: ast.hpp:464
Definition: ast.hpp:627
Definition: ast.hpp:28