Changes in src/AST/Stmt.hpp [89a5a1f:b8ab91a]
- File:
-
- 1 edited
-
src/AST/Stmt.hpp (modified) (12 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Stmt.hpp
r89a5a1f rb8ab91a 9 9 // Author : Aaron B. Moss 10 10 // Created On : Wed May 8 13:00:00 2019 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Mon Jan 31 22:38:53 202213 // Update Count : 1211 // Last Modified By : Andrew Beach 12 // Last Modified On : Fri May 17 12:45:00 2019 13 // Update Count : 5 14 14 // 15 15 … … 17 17 18 18 #include <list> 19 #include <utility> // for move19 #include <utility> // for move 20 20 #include <vector> 21 21 22 22 #include "Label.hpp" 23 #include "Node.hpp" // for node, ptr23 #include "Node.hpp" // for node, ptr 24 24 #include "ParseNode.hpp" 25 25 #include "Visitor.hpp" … … 27 27 28 28 // Must be included in *all* AST classes; should be #undef'd at the end of the file 29 #define MUTATE_FRIEND \29 #define MUTATE_FRIEND \ 30 30 template<typename node_t> friend node_t * mutate(const node_t * node); \ 31 31 template<typename node_t> friend node_t * shallowCopy(const node_t * node); 32 32 33 33 namespace ast { 34 34 35 class Expr; 35 36 36 // Base statement node37 /// Base statement node 37 38 class Stmt : public ParseNode { 38 public:39 public: 39 40 std::vector<Label> labels; 40 41 41 42 Stmt( const CodeLocation & loc, std::vector<Label> && labels = {} ) 42 : ParseNode(loc), labels(std::move(labels)) {}43 : ParseNode(loc), labels(std::move(labels)) {} 43 44 44 45 Stmt(const Stmt& o) : ParseNode(o), labels(o.labels) {} 45 46 46 47 const Stmt * accept( Visitor & v ) const override = 0; 47 private:48 private: 48 49 Stmt * clone() const override = 0; 49 50 MUTATE_FRIEND 50 51 }; 51 52 52 // Compound statement: { ... }53 /// Compound statement `{ ... }` 53 54 class CompoundStmt final : public Stmt { 54 public:55 public: 55 56 std::list<ptr<Stmt>> kids; 56 57 57 58 CompoundStmt(const CodeLocation & loc, std::list<ptr<Stmt>> && ks = {}, 58 std::vector<Label>&& labels = {} )59 : Stmt(loc, std::move(labels)), kids(std::move(ks)) {}59 std::vector<Label>&& labels = {} ) 60 : Stmt(loc, std::move(labels)), kids(std::move(ks)) {} 60 61 61 62 CompoundStmt( const CompoundStmt& o ); … … 66 67 67 68 const CompoundStmt * accept( Visitor & v ) const override { return v.visit( this ); } 68 private:69 private: 69 70 CompoundStmt * clone() const override { return new CompoundStmt{ *this }; } 70 71 MUTATE_FRIEND 71 72 }; 72 73 73 // Empty statment: ;74 /// Empty statment `;` 74 75 class NullStmt final : public Stmt { 75 public:76 public: 76 77 NullStmt( const CodeLocation & loc, std::vector<Label> && labels = {} ) 77 : Stmt(loc, std::move(labels)) {}78 : Stmt(loc, std::move(labels)) {} 78 79 79 80 const NullStmt * accept( Visitor & v ) const override { return v.visit( this ); } 80 private:81 private: 81 82 NullStmt * clone() const override { return new NullStmt{ *this }; } 82 83 MUTATE_FRIEND 83 84 }; 84 85 85 // Expression wrapped by statement86 /// Expression wrapped by statement 86 87 class ExprStmt final : public Stmt { 87 public:88 public: 88 89 ptr<Expr> expr; 89 90 90 91 ExprStmt( const CodeLocation& loc, const Expr* e, std::vector<Label>&& labels = {} ) 91 : Stmt(loc, std::move(labels)), expr(e) {}92 93 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 94 private:92 : Stmt(loc, std::move(labels)), expr(e) {} 93 94 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 95 private: 95 96 ExprStmt * clone() const override { return new ExprStmt{ *this }; } 96 97 MUTATE_FRIEND 97 98 }; 98 99 99 // Assembly statement: asm ... ( "..." : ... )100 /// Assembly statement `asm ... ( "..." : ... )` 100 101 class AsmStmt final : public Stmt { 101 public:102 public: 102 103 bool isVolatile; 103 104 ptr<Expr> instruction; … … 107 108 108 109 AsmStmt( const CodeLocation & loc, bool isVolatile, const Expr * instruction, 109 std::vector<ptr<Expr>> && output, std::vector<ptr<Expr>> && input,110 std::vector<ptr<ConstantExpr>> && clobber, std::vector<Label> && gotoLabels,111 std::vector<Label> && labels = {})112 : Stmt(loc, std::move(labels)), isVolatile(isVolatile), instruction(instruction),113 output(std::move(output)), input(std::move(input)), clobber(std::move(clobber)),114 gotoLabels(std::move(gotoLabels)) {}115 116 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 117 private:110 std::vector<ptr<Expr>> && output, std::vector<ptr<Expr>> && input, 111 std::vector<ptr<ConstantExpr>> && clobber, std::vector<Label> && gotoLabels, 112 std::vector<Label> && labels = {}) 113 : Stmt(loc, std::move(labels)), isVolatile(isVolatile), instruction(instruction), 114 output(std::move(output)), input(std::move(input)), clobber(std::move(clobber)), 115 gotoLabels(std::move(gotoLabels)) {} 116 117 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 118 private: 118 119 AsmStmt * clone() const override { return new AsmStmt{ *this }; } 119 120 MUTATE_FRIEND 120 121 }; 121 122 122 // C-preprocessor directive: #...123 /// C-preprocessor directive `#...` 123 124 class DirectiveStmt final : public Stmt { 124 public:125 public: 125 126 std::string directive; 126 127 127 128 DirectiveStmt( const CodeLocation & loc, const std::string & directive, 128 std::vector<Label> && labels = {} )129 : Stmt(loc, std::move(labels)), directive(directive) {}130 131 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 132 private:129 std::vector<Label> && labels = {} ) 130 : Stmt(loc, std::move(labels)), directive(directive) {} 131 132 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 133 private: 133 134 DirectiveStmt * clone() const override { return new DirectiveStmt{ *this }; } 134 135 MUTATE_FRIEND 135 136 }; 136 137 137 // If statement: if (...) ... else ...138 /// If conditional statement `if (...) ... else ...` 138 139 class IfStmt final : public Stmt { 139 public:140 public: 140 141 ptr<Expr> cond; 141 142 ptr<Stmt> thenPart; … … 144 145 145 146 IfStmt( const CodeLocation & loc, const Expr * cond, const Stmt * thenPart, 146 const Stmt * elsePart = nullptr, std::vector<ptr<Stmt>> && inits = {},147 std::vector<Label> && labels = {} )148 : Stmt(loc, std::move(labels)), cond(cond), thenPart(thenPart), elsePart(elsePart),149 inits(std::move(inits)) {}150 151 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 152 private:147 const Stmt * elsePart = nullptr, std::vector<ptr<Stmt>> && inits = {}, 148 std::vector<Label> && labels = {} ) 149 : Stmt(loc, std::move(labels)), cond(cond), thenPart(thenPart), elsePart(elsePart), 150 inits(std::move(inits)) {} 151 152 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 153 private: 153 154 IfStmt * clone() const override { return new IfStmt{ *this }; } 154 155 MUTATE_FRIEND 155 156 }; 156 157 157 // Switch or choose statement: switch (...) { ... }158 /// Switch or choose conditional statement `switch (...) { ... }` 158 159 class SwitchStmt final : public Stmt { 159 public:160 public: 160 161 ptr<Expr> cond; 161 162 std::vector<ptr<Stmt>> stmts; 162 163 163 164 SwitchStmt( const CodeLocation & loc, const Expr * cond, std::vector<ptr<Stmt>> && stmts, 164 std::vector<Label> && labels = {} )165 : Stmt(loc, std::move(labels)), cond(cond), stmts(std::move(stmts)) {}166 167 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 168 private:165 std::vector<Label> && labels = {} ) 166 : Stmt(loc, std::move(labels)), cond(cond), stmts(std::move(stmts)) {} 167 168 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 169 private: 169 170 SwitchStmt * clone() const override { return new SwitchStmt{ *this }; } 170 171 MUTATE_FRIEND 171 172 }; 172 173 173 // Case label: case ...: or default:174 /// Case label `case ...:` `default:` 174 175 class CaseStmt final : public Stmt { 175 public:176 // Null for the default label.176 public: 177 /// Null for the default label. 177 178 ptr<Expr> cond; 178 179 std::vector<ptr<Stmt>> stmts; 179 180 180 181 CaseStmt( const CodeLocation & loc, const Expr * cond, std::vector<ptr<Stmt>> && stmts, 181 std::vector<Label> && labels = {} )182 : Stmt(loc, std::move(labels)), cond(cond), stmts(std::move(stmts)) {}182 std::vector<Label> && labels = {} ) 183 : Stmt(loc, std::move(labels)), cond(cond), stmts(std::move(stmts)) {} 183 184 184 185 bool isDefault() const { return !cond; } 185 186 186 187 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 187 private:188 private: 188 189 CaseStmt * clone() const override { return new CaseStmt{ *this }; } 189 190 MUTATE_FRIEND 190 191 }; 191 192 192 // While loop: while (...) ... else ... or do ... while (...) else ...;193 /// While loop `while (...) ...` `do ... while (...); 193 194 class WhileStmt final : public Stmt { 194 public:195 public: 195 196 ptr<Expr> cond; 196 197 ptr<Stmt> body; 197 ptr<Stmt> elsePart;198 198 std::vector<ptr<Stmt>> inits; 199 199 bool isDoWhile; 200 200 201 201 WhileStmt( const CodeLocation & loc, const Expr * cond, const Stmt * body, 202 std::vector<ptr<Stmt>> && inits, bool isDoWhile = false, std::vector<Label> && labels = {} ) 203 : Stmt(loc, std::move(labels)), cond(cond), body(body), inits(std::move(inits)), isDoWhile(isDoWhile) {} 204 205 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 206 private: 202 std::vector<ptr<Stmt>> && inits, bool isDoWhile = false, std::vector<Label> && labels = {} ) 203 : Stmt(loc, std::move(labels)), cond(cond), body(body), inits(std::move(inits)), 204 isDoWhile(isDoWhile) {} 205 206 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 207 private: 207 208 WhileStmt * clone() const override { return new WhileStmt{ *this }; } 208 209 MUTATE_FRIEND 209 210 }; 210 211 211 // For loop: for (... ; ... ; ...) ... else ...212 /// For loop `for (... ; ... ; ...) ...` 212 213 class ForStmt final : public Stmt { 213 public:214 public: 214 215 std::vector<ptr<Stmt>> inits; 215 216 ptr<Expr> cond; 216 217 ptr<Expr> inc; 217 218 ptr<Stmt> body; 218 ptr<Stmt> elsePart;219 219 220 220 ForStmt( const CodeLocation & loc, std::vector<ptr<Stmt>> && inits, const Expr * cond, 221 const Expr * inc, const Stmt * body, std::vector<Label> && labels = {} ) 222 : Stmt(loc, std::move(labels)), inits(std::move(inits)), cond(cond), inc(inc), body(body) {} 223 224 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 225 private: 221 const Expr * inc, const Stmt * body, std::vector<Label> && labels = {} ) 222 : Stmt(loc, std::move(labels)), inits(std::move(inits)), cond(cond), inc(inc), 223 body(body) {} 224 225 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 226 private: 226 227 ForStmt * clone() const override { return new ForStmt{ *this }; } 227 228 MUTATE_FRIEND 228 229 }; 229 230 230 // Branch control flow statement: goto ... or break or continue or fallthru231 /// Branch control flow statement `goto ...` `break` `continue` `fallthru` 231 232 class BranchStmt final : public Stmt { 232 public:233 public: 233 234 enum Kind { Goto, Break, Continue, FallThrough, FallThroughDefault }; 234 235 static constexpr size_t kindEnd = 1 + (size_t)FallThroughDefault; … … 240 241 241 242 BranchStmt( const CodeLocation & loc, Kind kind, Label target, 242 std::vector<Label> && labels = {} );243 std::vector<Label> && labels = {} ); 243 244 BranchStmt( const CodeLocation & loc, const Expr * computedTarget, 244 std::vector<Label> && labels = {} )245 : Stmt(loc, std::move(labels)), originalTarget(loc), target(loc),246 computedTarget(computedTarget), kind(Goto) {}245 std::vector<Label> && labels = {} ) 246 : Stmt(loc, std::move(labels)), originalTarget(loc), target(loc), 247 computedTarget(computedTarget), kind(Goto) {} 247 248 248 249 const char * kindName() const { return kindNames[kind]; } 249 250 250 251 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 251 private:252 private: 252 253 BranchStmt * clone() const override { return new BranchStmt{ *this }; } 253 254 MUTATE_FRIEND … … 256 257 }; 257 258 258 // Return statement: return ...259 /// Return statement `return ...` 259 260 class ReturnStmt final : public Stmt { 260 public:261 public: 261 262 ptr<Expr> expr; 262 263 263 264 ReturnStmt( const CodeLocation & loc, const Expr * expr, std::vector<Label> && labels = {} ) 264 : Stmt(loc, std::move(labels)), expr(expr) {}265 266 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 267 private:265 : Stmt(loc, std::move(labels)), expr(expr) {} 266 267 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 268 private: 268 269 ReturnStmt * clone() const override { return new ReturnStmt{ *this }; } 269 270 MUTATE_FRIEND 270 271 }; 271 272 272 // Kind of exception273 /// Kind of exception 273 274 enum ExceptionKind { Terminate, Resume }; 274 275 275 // Throw statement: throw ...276 /// Throw statement `throw ...` 276 277 class ThrowStmt final : public Stmt { 277 public:278 public: 278 279 ptr<Expr> expr; 279 280 ptr<Expr> target; … … 283 284 const CodeLocation & loc, ExceptionKind kind, const Expr * expr, const Expr * target, 284 285 std::vector<Label> && labels = {} ) 285 : Stmt(loc, std::move(labels)), expr(expr), target(target), kind(kind) {}286 287 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 288 private:286 : Stmt(loc, std::move(labels)), expr(expr), target(target), kind(kind) {} 287 288 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 289 private: 289 290 ThrowStmt * clone() const override { return new ThrowStmt{ *this }; } 290 291 MUTATE_FRIEND 291 292 }; 292 293 293 // Try statement: try { ... } ...294 /// Try statement `try { ... } ...` 294 295 class TryStmt final : public Stmt { 295 public:296 public: 296 297 ptr<CompoundStmt> body; 297 298 std::vector<ptr<CatchStmt>> handlers; … … 302 303 std::vector<ptr<CatchStmt>> && handlers, const FinallyStmt * finally, 303 304 std::vector<Label> && labels = {} ) 304 : Stmt(loc, std::move(labels)), body(body), handlers(std::move(handlers)), finally(finally) {}305 306 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 307 private:305 : Stmt(loc, std::move(labels)), body(body), handlers(std::move(handlers)), finally(finally) {} 306 307 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 308 private: 308 309 TryStmt * clone() const override { return new TryStmt{ *this }; } 309 310 MUTATE_FRIEND 310 311 }; 311 312 312 // Catch clause of try statement313 /// Catch clause of try statement 313 314 class CatchStmt final : public Stmt { 314 public:315 public: 315 316 ptr<Decl> decl; 316 317 ptr<Expr> cond; … … 321 322 const CodeLocation & loc, ExceptionKind kind, const Decl * decl, const Expr * cond, 322 323 const Stmt * body, std::vector<Label> && labels = {} ) 323 : Stmt(loc, std::move(labels)), decl(decl), cond(cond), body(body), kind(kind) {}324 325 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 326 private:324 : Stmt(loc, std::move(labels)), decl(decl), cond(cond), body(body), kind(kind) {} 325 326 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 327 private: 327 328 CatchStmt * clone() const override { return new CatchStmt{ *this }; } 328 329 MUTATE_FRIEND 329 330 }; 330 331 331 // Finally clause of try statement332 /// Finally clause of try statement 332 333 class FinallyStmt final : public Stmt { 333 public:334 public: 334 335 ptr<CompoundStmt> body; 335 336 336 337 FinallyStmt( const CodeLocation & loc, const CompoundStmt * body, 337 std::vector<Label> && labels = {} )338 : Stmt(loc, std::move(labels)), body(body) {}339 340 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 341 private:338 std::vector<Label> && labels = {} ) 339 : Stmt(loc, std::move(labels)), body(body) {} 340 341 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 342 private: 342 343 FinallyStmt * clone() const override { return new FinallyStmt{ *this }; } 343 344 MUTATE_FRIEND 344 345 }; 345 346 346 // Suspend statement347 /// Suspend statement 347 348 class SuspendStmt final : public Stmt { 348 public:349 public: 349 350 ptr<CompoundStmt> then; 350 351 enum Type { None, Coroutine, Generator } type = None; 351 352 352 353 SuspendStmt( const CodeLocation & loc, const CompoundStmt * then, Type type, std::vector<Label> && labels = {} ) 353 : Stmt(loc, std::move(labels)), then(then), type(type) {}354 355 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 356 private:354 : Stmt(loc, std::move(labels)), then(then), type(type) {} 355 356 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 357 private: 357 358 SuspendStmt * clone() const override { return new SuspendStmt{ *this }; } 358 359 MUTATE_FRIEND 359 360 }; 360 361 361 // Waitfor statement: when (...) waitfor (... , ...) ... timeout(...) ... else ...362 /// Wait for concurrency statement `when (...) waitfor (... , ...) ... timeout(...) ... else ...` 362 363 class WaitForStmt final : public Stmt { 363 public:364 public: 364 365 struct Target { 365 366 ptr<Expr> func; … … 389 390 390 391 WaitForStmt( const CodeLocation & loc, std::vector<Label> && labels = {} ) 391 : Stmt(loc, std::move(labels)) {}392 393 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 394 private:392 : Stmt(loc, std::move(labels)) {} 393 394 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 395 private: 395 396 WaitForStmt * clone() const override { return new WaitForStmt{ *this }; } 396 397 MUTATE_FRIEND 397 398 }; 398 399 399 // Any declaration in a (compound) statement.400 /// Any declaration in a (compound) statement. 400 401 class DeclStmt final : public Stmt { 401 public:402 public: 402 403 ptr<Decl> decl; 403 404 404 405 DeclStmt( const CodeLocation & loc, const Decl * decl, std::vector<Label> && labels = {} ) 405 : Stmt(loc, std::move(labels)), decl(decl) {}406 407 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 408 private:406 : Stmt(loc, std::move(labels)), decl(decl) {} 407 408 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 409 private: 409 410 DeclStmt * clone() const override { return new DeclStmt{ *this }; } 410 411 MUTATE_FRIEND 411 412 }; 412 413 413 // Represents an implicit application of a constructor or destructor.414 /// Represents an implicit application of a constructor or destructor. 414 415 class ImplicitCtorDtorStmt final : public Stmt { 415 public:416 public: 416 417 ptr<Stmt> callStmt; 417 418 418 419 ImplicitCtorDtorStmt( const CodeLocation & loc, const Stmt * callStmt, 419 std::vector<Label> && labels = {} )420 : Stmt(loc, std::move(labels)), callStmt(callStmt) {}421 422 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 423 private:420 std::vector<Label> && labels = {} ) 421 : Stmt(loc, std::move(labels)), callStmt(callStmt) {} 422 423 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 424 private: 424 425 ImplicitCtorDtorStmt * clone() const override { return new ImplicitCtorDtorStmt{ *this }; } 425 426 MUTATE_FRIEND 426 427 }; 427 428 428 // Mutex Statement429 /// Mutex Statement 429 430 class MutexStmt final : public Stmt { 430 public:431 public: 431 432 ptr<Stmt> stmt; 432 433 std::vector<ptr<Expr>> mutexObjs; 433 434 434 435 MutexStmt( const CodeLocation & loc, const Stmt * stmt, 435 std::vector<ptr<Expr>> && mutexes, std::vector<Label> && labels = {} )436 : Stmt(loc, std::move(labels)), stmt(stmt), mutexObjs(std::move(mutexes)) {}437 438 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 439 private:436 std::vector<ptr<Expr>> && mutexes, std::vector<Label> && labels = {} ) 437 : Stmt(loc, std::move(labels)), stmt(stmt), mutexObjs(std::move(mutexes)) {} 438 439 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); } 440 private: 440 441 MutexStmt * clone() const override { return new MutexStmt{ *this }; } 441 442 MUTATE_FRIEND 442 443 }; 443 } // namespace ast 444 445 } 444 446 445 447 #undef MUTATE_FRIEND 446 448 447 449 // Local Variables: // 450 // tab-width: 4 // 448 451 // mode: c++ // 452 // compile-command: "make install" // 449 453 // End: //
Note:
See TracChangeset
for help on using the changeset viewer.