// stmt-defs.h // Syntax class definitions for statements. ABSTRACT_SYNTAX_CLASS(ScopeStmt, Stmt) SYNTAX_FIELD(RefPtr, scopeDecl) END_SYNTAX_CLASS() // A sequence of statements, treated as a single statement SYNTAX_CLASS(SeqStmt, Stmt) SYNTAX_FIELD(List>, stmts) END_SYNTAX_CLASS() // The simplest kind of scope statement: just a `{...}` block SYNTAX_CLASS(BlockStmt, ScopeStmt) SYNTAX_FIELD(RefPtr, body); END_SYNTAX_CLASS() // A statement that we aren't going to parse or check, because // we want to let a downstream compiler handle any issues SYNTAX_CLASS(UnparsedStmt, Stmt) // The tokens that were contained between `{` and `}` FIELD(List, tokens) END_SYNTAX_CLASS() SIMPLE_SYNTAX_CLASS(EmptyStmt, Stmt) SIMPLE_SYNTAX_CLASS(DiscardStmt, Stmt) SYNTAX_CLASS(DeclStmt, Stmt) SYNTAX_FIELD(RefPtr, decl) END_SYNTAX_CLASS() SYNTAX_CLASS(IfStmt, Stmt) SYNTAX_FIELD(RefPtr, Predicate) SYNTAX_FIELD(RefPtr, PositiveStatement) SYNTAX_FIELD(RefPtr, NegativeStatement) END_SYNTAX_CLASS() // A statement that can be escaped with a `break` ABSTRACT_SYNTAX_CLASS(BreakableStmt, ScopeStmt) END_SYNTAX_CLASS() SYNTAX_CLASS(SwitchStmt, BreakableStmt) SYNTAX_FIELD(RefPtr, condition) SYNTAX_FIELD(RefPtr, body) END_SYNTAX_CLASS() // A statement that is expected to appear lexically nested inside // some other construct, and thus needs to keep track of the // outer statement that it is associated with... ABSTRACT_SYNTAX_CLASS(ChildStmt, Stmt) DECL_FIELD(Stmt*, parentStmt RAW(= nullptr)) END_SYNTAX_CLASS() // a `case` or `default` statement inside a `switch` // // Note(tfoley): A correct AST for a C-like language would treat // these as a labelled statement, and so they would contain a // sub-statement. I'm leaving that out for now for simplicity. ABSTRACT_SYNTAX_CLASS(CaseStmtBase, ChildStmt) END_SYNTAX_CLASS() // a `case` statement inside a `switch` SYNTAX_CLASS(CaseStmt, CaseStmtBase) SYNTAX_FIELD(RefPtr, expr) END_SYNTAX_CLASS() // a `default` statement inside a `switch` SIMPLE_SYNTAX_CLASS(DefaultStmt, CaseStmtBase) // A statement that represents a loop, and can thus be escaped with a `continue` ABSTRACT_SYNTAX_CLASS(LoopStmt, BreakableStmt) END_SYNTAX_CLASS() // A `for` statement SYNTAX_CLASS(ForStmt, LoopStmt) SYNTAX_FIELD(RefPtr, InitialStatement) SYNTAX_FIELD(RefPtr, SideEffectExpression) SYNTAX_FIELD(RefPtr, PredicateExpression) SYNTAX_FIELD(RefPtr, Statement) END_SYNTAX_CLASS() // A `for` statement in a language that doesn't restrict the scope // of the loop variable to the body. SYNTAX_CLASS(UnscopedForStmt, ForStmt); END_SYNTAX_CLASS() SYNTAX_CLASS(WhileStmt, LoopStmt) SYNTAX_FIELD(RefPtr, Predicate) SYNTAX_FIELD(RefPtr, Statement) END_SYNTAX_CLASS() SYNTAX_CLASS(DoWhileStmt, LoopStmt) SYNTAX_FIELD(RefPtr, Statement) SYNTAX_FIELD(RefPtr, Predicate) END_SYNTAX_CLASS() // A compile-time, range-based `for` loop, which will not appear in the output code SYNTAX_CLASS(CompileTimeForStmt, ScopeStmt) SYNTAX_FIELD(RefPtr, varDecl) SYNTAX_FIELD(RefPtr, rangeBeginExpr) SYNTAX_FIELD(RefPtr, rangeEndExpr) SYNTAX_FIELD(RefPtr, body) SYNTAX_FIELD(RefPtr, rangeBeginVal) SYNTAX_FIELD(RefPtr, rangeEndVal) END_SYNTAX_CLASS() // The case of child statements that do control flow relative // to their parent statement. ABSTRACT_SYNTAX_CLASS(JumpStmt, ChildStmt) END_SYNTAX_CLASS() SIMPLE_SYNTAX_CLASS(BreakStmt, JumpStmt) SIMPLE_SYNTAX_CLASS(ContinueStmt, JumpStmt) SYNTAX_CLASS(ReturnStmt, Stmt) SYNTAX_FIELD(RefPtr, Expression) END_SYNTAX_CLASS() SYNTAX_CLASS(ExpressionStmt, Stmt) SYNTAX_FIELD(RefPtr, Expression) END_SYNTAX_CLASS()