1 // =================================
  2 // Copyright (c) 2020 Seppo Laakko
  3 // Distributed under the MIT license
  4 // =================================
  5 
  6 #ifndef SNGCPP_AST_STATEMENT_INCLUDED
  7 #define SNGCPP_AST_STATEMENT_INCLUDED
  8 #include <sngcpp/ast/Node.hpp>
  9 #include <string>
 10 
 11 namespace sngcpp { namespace ast {
 12 
 13 class LabeledStatementNode public UnaryNode
 14 {
 15 public:
 16     LabeledStatementNode();
 17     LabeledStatementNode(const Span& span_const std::u32string& label_Node* statement_);
 18     void Accept(Visitor& visitor) override;
 19     void Write(Writer& writer) override;
 20     void Read(Reader& reader) override;
 21     const std::u32string& Label() const { return label; }
 22 private:
 23     std::u32string label;
 24 };
 25 
 26 class CaseStatementNode public UnaryNode
 27 {
 28 public:
 29     CaseStatementNode();
 30     CaseStatementNode(const Span& span_Node* caseExpr_Node* statement_);
 31     void Accept(Visitor& visitor) override;
 32     void Write(Writer& writer) override;
 33     void Read(Reader& reader) override;
 34     Node* CaseExpr() { return caseExpr.get(); }
 35 private:
 36     std::unique_ptr<Node> caseExpr;
 37 };
 38 
 39 class DefaultStatementNode public UnaryNode
 40 {
 41 public:
 42     DefaultStatementNode();
 43     DefaultStatementNode(const Span& span_Node* statement_);
 44     void Accept(Visitor& visitor) override;
 45 };
 46 
 47 class ExpressionStatementNode public UnaryNode
 48 {
 49 public:
 50     ExpressionStatementNode();
 51     ExpressionStatementNode(const Span& span_Node* expression_);
 52     void Accept(Visitor& visitor) override;
 53 };
 54 
 55 class CompoundStatementNode public UnaryNode
 56 {
 57 public:
 58     CompoundStatementNode();
 59     CompoundStatementNode(const Span& span_);
 60     void Accept(Visitor& visitor) override;
 61     void Write(Writer& writer) override;
 62     void Read(Reader& reader) override;
 63     void AddStatement(const Span& span_Node* statement);
 64     void SetEndBraceSpan(const Span& endBraceSpan_) { endBraceSpan = endBraceSpan_; }
 65     const Span& EndBraceSpan() const { return endBraceSpan; }
 66 private:
 67     Span endBraceSpan;
 68 };
 69 
 70 class StatementSequenceNode public BinaryNode
 71 {
 72 public:
 73     StatementSequenceNode();
 74     StatementSequenceNode(const Span& span_Node* leftStatement_Node* rightStatement_);
 75     void Accept(Visitor& visitor) override;
 76 };
 77 
 78 class IfStatementNode public Node
 79 {
 80 public:
 81     IfStatementNode();
 82     IfStatementNode(const Span& span_Node* condition_Node* thenS_Node* elseS_const Span& elseSpan_);
 83     void Accept(Visitor& visitor) override;
 84     void Write(Writer& writer) override;
 85     void Read(Reader& reader) override;
 86     Node* Condition() { return condition.get(); }
 87     Node* ThenS() { return thenS.get(); }
 88     Node* ElseS() { return elseS.get(); }
 89     const Span& ElseSpan() const { return elseSpan; }
 90 private:
 91     std::unique_ptr<Node> condition;
 92     std::unique_ptr<Node> thenS;
 93     std::unique_ptr<Node> elseS;
 94     Span elseSpan;
 95 };
 96 
 97 class SwitchStatementNode public Node
 98 {
 99 public:
100     SwitchStatementNode();
101     SwitchStatementNode(const Span& span_Node* condition_Node* statement_);
102     void Accept(Visitor& visitor) override;
103     void Write(Writer& writer) override;
104     void Read(Reader& reader) override;
105     Node* Condition() { return condition.get(); }
106     Node* Statement() { return statement.get(); }
107 private:
108     std::unique_ptr<Node> condition;
109     std::unique_ptr<Node> statement;
110 };
111 
112 class WhileStatementNode public Node
113 {
114 public:
115     WhileStatementNode();
116     WhileStatementNode(const Span& span_Node* condition_Node* statement_);
117     void Accept(Visitor& visitor) override;
118     void Write(Writer& writer) override;
119     void Read(Reader& reader) override;
120     Node* Condition() { return condition.get(); }
121     Node* Statement() { return statement.get(); }
122 private:
123     std::unique_ptr<Node> condition;
124     std::unique_ptr<Node> statement;
125 };
126 
127 class DoStatementNode public Node
128 {
129 public:
130     DoStatementNode();
131     DoStatementNode(const Span& span_Node* statement_Node* condition_const Span& whileSpan_);
132     void Accept(Visitor& visitor) override;
133     void Write(Writer& writer) override;
134     void Read(Reader& reader) override;
135     Node* Statement() { return statement.get(); }
136     Node* Condition() { return condition.get(); }
137     const Span& WhileSpan() const { return whileSpan; }
138 private:
139     std::unique_ptr<Node> statement;
140     std::unique_ptr<Node> condition;
141     Span whileSpan;
142 };
143 
144 class RangeForStatementNode public Node
145 {
146 public:
147     RangeForStatementNode();
148     RangeForStatementNode(const Span& span_Node* forRangeDeclaration_Node* forRangeInitializer_Node* statement_);
149     void Accept(Visitor& visitor) override;
150     void Write(Writer& writer) override;
151     void Read(Reader& reader) override;
152     Node* ForRangeDeclaration() { return forRangeDeclaration.get(); }
153     Node* ForRangeInitializer() { return forRangeInitializer.get(); }
154     Node* Statement() { return statement.get(); }
155 private:
156     std::unique_ptr<Node> forRangeDeclaration;
157     std::unique_ptr<Node> forRangeInitializer;
158     std::unique_ptr<Node> statement;
159 };
160 
161 class ForStatementNode public Node
162 {
163 public:
164     ForStatementNode();
165     ForStatementNode(const Span& span_Node* initS_Node* condition_Node* loopExpr_Node* actionS_);
166     void Accept(Visitor& visitor) override;
167     void Write(Writer& writer) override;
168     void Read(Reader& reader) override;
169     Node* InitS() { return initS.get(); }
170     Node* Condition() { return condition.get(); }
171     Node* LoopExpr() { return loopExpr.get(); }
172     Node* ActionS() { return actionS.get(); }
173 private:
174     std::unique_ptr<Node> initS;
175     std::unique_ptr<Node> condition;
176     std::unique_ptr<Node> loopExpr;
177     std::unique_ptr<Node> actionS;
178 };
179 
180 class BreakStatementNode public Node
181 {
182 public:
183     BreakStatementNode();
184     BreakStatementNode(const Span& span_);
185     void Accept(Visitor& visitor) override;
186 };
187 
188 class ContinueStatementNode public Node
189 {
190 public:
191     ContinueStatementNode();
192     ContinueStatementNode(const Span& span_);
193     void Accept(Visitor& visitor) override;
194 };
195 
196 class ReturnStatementNode public Node
197 {
198 public:
199     ReturnStatementNode();
200     ReturnStatementNode(const Span& span_Node* returnExpr_);
201     void Accept(Visitor& visitor) override;
202     void Write(Writer& writer) override;
203     void Read(Reader& reader) override;
204     Node* ReturnExpr() { return returnExpr.get(); }
205 private:
206     std::unique_ptr<Node> returnExpr;
207 };
208 
209 class GotoStatementNode public Node
210 {
211 public:
212     GotoStatementNode();
213     GotoStatementNode(const Span& span_const std::u32string& target_);
214     void Accept(Visitor& visitor) override;
215     void Write(Writer& writer) override;
216     void Read(Reader& reader) override;
217     const std::u32string& Target() const { return target; }
218 private:
219     std::u32string target;
220 };
221 
222 class DeclarationStatementNode public UnaryNode
223 {
224 public:
225     DeclarationStatementNode();
226     DeclarationStatementNode(const Span& span_Node* declaration_);
227     void Accept(Visitor& visitor) override;
228 };
229 
230 class TryStatementNode public Node
231 {
232 public:
233     TryStatementNode();
234     TryStatementNode(const Span& span_CompoundStatementNode* tryBlock_);
235     void Accept(Visitor& visitor) override;
236     void Write(Writer& writer) override;
237     void Read(Reader& reader) override;
238     void AddHandler(const Span& spanNode* handler);
239     CompoundStatementNode* TryBlock() { return tryBlock.get(); }
240     Node* Handlers() { return handlers.get(); }
241 private:
242     std::unique_ptr<CompoundStatementNode> tryBlock;
243     std::unique_ptr<Node> handlers;
244 };
245 
246 class HandlerNode public Node
247 {
248 public:
249     HandlerNode();
250     HandlerNode(const Span& span_Node* exceptionDeclaration_CompoundStatementNode* catchBlock_);
251     void Accept(Visitor& visitor) override;
252     void Write(Writer& writer) override;
253     void Read(Reader& reader) override;
254     Node* ExceptionDeclaration() { return exceptionDeclaration.get(); }
255     CompoundStatementNode* CatchBlock() { return catchBlock.get(); }
256 private:
257     std::unique_ptr<Node> exceptionDeclaration;
258     std::unique_ptr<CompoundStatementNode> catchBlock;
259 };
260 
261 class HandlerSequenceNode public BinaryNode
262 {
263 public:
264     HandlerSequenceNode();
265     HandlerSequenceNode(const Span& span_Node* left_Node* right_);
266     void Accept(Visitor& visitor) override;
267 };
268 
269 class CatchAllNode public Node
270 {
271 public:
272     CatchAllNode();
273     CatchAllNode(const Span& span_);
274     void Accept(Visitor& visitor) override;
275 };
276 
277 } } // namespace sngcpp::ast
278 
279 #endif // SNGCPP_AST_STATEMENT_INCLUDED