source: src/Parser/StatementNode.h @ b5bfb16

Last change on this file since b5bfb16 was dc3fbe5, checked in by Andrew Beach <ajbeach@…>, 3 months ago

Factored out the ParseNode?'s next field into a new child type. This is only type safe when used in the given one level curiously reoccurring template pattern, as it is now. This allowed most of the intermedate helpers to be removed.

  • Property mode set to 100644
File size: 5.3 KB
Line 
1//
2// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
3//
4// The contents of this file are covered under the licence agreement in the
5// file "LICENCE" distributed with Cforall.
6//
7// StatementNode.h --
8//
9// Author           : Andrew Beach
10// Created On       : Wed Apr  5 11:42:00 2023
11// Last Modified By : Peter A. Buhr
12// Last Modified On : Fri Aug 11 11:44:07 2023
13// Update Count     : 2
14//
15
16#pragma once
17
18#include "ParseNode.h"
19
20struct StatementNode final : public ParseList<StatementNode> {
21        StatementNode() : stmt( nullptr ) {}
22        StatementNode( ast::Stmt * stmt ) : stmt( stmt ) {}
23        StatementNode( DeclarationNode * decl );
24        virtual ~StatementNode() {}
25
26        virtual StatementNode * clone() const final { assert( false ); return nullptr; }
27        ast::Stmt * build() { return stmt.release(); }
28
29        StatementNode * add_label(
30                        const CodeLocation & location,
31                        const std::string * name,
32                        DeclarationNode * attr = nullptr );
33
34        virtual void print( std::ostream & os, __attribute__((unused)) int indent = 0 ) const override {
35                os << stmt.get() << std::endl;
36        }
37
38        std::unique_ptr<ast::Stmt> stmt;
39}; // StatementNode
40
41struct ClauseNode final : public ParseList<ClauseNode> {
42        ClauseNode( ast::StmtClause * clause ) : clause( clause ) {}
43        virtual ~ClauseNode() {}
44
45        virtual ClauseNode * clone() const final { assert( false ); return nullptr; }
46        ast::StmtClause * build() { return clause.release(); }
47
48        virtual ClauseNode * append_last_case( StatementNode * );
49
50        std::unique_ptr<ast::StmtClause> clause;
51};
52
53ast::Stmt * build_expr( CodeLocation const &, ExpressionNode * ctl );
54
55struct CondCtl {
56        CondCtl( DeclarationNode * decl, ExpressionNode * condition ) :
57                init( decl ? new StatementNode( decl ) : nullptr ), condition( condition ) {}
58
59        StatementNode * init;
60        ExpressionNode * condition;
61};
62
63struct ForCtrl {
64        ForCtrl( StatementNode * stmt, ExpressionNode * condition, ExpressionNode * change ) :
65                init( stmt ), condition( condition ), change( change ) {}
66
67        StatementNode * init;
68        ExpressionNode * condition;
69        ExpressionNode * change;
70};
71
72ast::Stmt * build_if( const CodeLocation &, CondCtl * ctl, StatementNode * then, StatementNode * else_ );
73ast::Stmt * build_switch( const CodeLocation &, bool isSwitch, ExpressionNode * ctl, ClauseNode * stmt );
74ast::CaseClause * build_case( const CodeLocation &, ExpressionNode * ctl );
75ast::CaseClause * build_default( const CodeLocation & );
76ast::Stmt * build_while( const CodeLocation &, CondCtl * ctl, StatementNode * stmt, StatementNode * else_ = nullptr );
77ast::Stmt * build_do_while( const CodeLocation &, ExpressionNode * ctl, StatementNode * stmt, StatementNode * else_ = nullptr );
78ast::Stmt * build_for( const CodeLocation &, ForCtrl * forctl, StatementNode * stmt, StatementNode * else_ = nullptr );
79ast::Stmt * build_branch( const CodeLocation &, ast::BranchStmt::Kind kind );
80ast::Stmt * build_branch( const CodeLocation &, std::string * identifier, ast::BranchStmt::Kind kind );
81ast::Stmt * build_computedgoto( ExpressionNode * ctl );
82ast::Stmt * build_return( const CodeLocation &, ExpressionNode * ctl );
83ast::Stmt * build_throw( const CodeLocation &, ExpressionNode * ctl );
84ast::Stmt * build_resume( const CodeLocation &, ExpressionNode * ctl );
85ast::Stmt * build_resume_at( ExpressionNode * ctl , ExpressionNode * target );
86ast::Stmt * build_try( const CodeLocation &, StatementNode * try_, ClauseNode * catch_, ClauseNode * finally_ );
87ast::CatchClause * build_catch( const CodeLocation &, ast::ExceptionKind kind, DeclarationNode * decl, ExpressionNode * cond, StatementNode * body );
88ast::FinallyClause * build_finally( const CodeLocation &, StatementNode * stmt );
89ast::Stmt * build_compound( const CodeLocation &, StatementNode * first );
90StatementNode * maybe_build_compound( const CodeLocation &, StatementNode * first );
91ast::Stmt * build_asm( const CodeLocation &, bool is_volatile, ExpressionNode * instruction, ExpressionNode * output = nullptr, ExpressionNode * input = nullptr, ExpressionNode * clobber = nullptr, LabelNode * gotolabels = nullptr );
92ast::Stmt * build_directive( const CodeLocation &, std::string * directive );
93ast::SuspendStmt * build_suspend( const CodeLocation &, StatementNode *, ast::SuspendStmt::Kind );
94ast::WaitForStmt * build_waitfor( const CodeLocation &, ast::WaitForStmt * existing, ExpressionNode * when, ExpressionNode * targetExpr, StatementNode * stmt );
95ast::WaitForStmt * build_waitfor_else( const CodeLocation &, ast::WaitForStmt * existing, ExpressionNode * when, StatementNode * stmt );
96ast::WaitForStmt * build_waitfor_timeout( const CodeLocation &, ast::WaitForStmt * existing, ExpressionNode * when, ExpressionNode * timeout, StatementNode * stmt );
97ast::WaitUntilStmt::ClauseNode * build_waituntil_clause( const CodeLocation &, ExpressionNode * when, ExpressionNode * targetExpr, StatementNode * stmt );
98ast::WaitUntilStmt::ClauseNode * build_waituntil_else( const CodeLocation &, ExpressionNode * when, StatementNode * stmt );
99ast::WaitUntilStmt * build_waituntil_stmt( const CodeLocation &, ast::WaitUntilStmt::ClauseNode * root );
100ast::Stmt * build_with( const CodeLocation &, ExpressionNode * exprs, StatementNode * stmt );
101ast::Stmt * build_mutex( const CodeLocation &, ExpressionNode * exprs, StatementNode * stmt );
102ast::Stmt * build_corun( const CodeLocation &, StatementNode * stmt );
103ast::Stmt * build_cofor( const CodeLocation & location, ForCtrl * forctl, StatementNode * stmt );
Note: See TracBrowser for help on using the repository browser.