source: src/Parser/StatementNode.hpp@ 4d5c5b6a

Last change on this file since 4d5c5b6a was cd28605, checked in by Peter A. Buhr <pabuhr@…>, 8 months ago

first attempt at generalizing attributes to statements

  • Property mode set to 100644
File size: 5.7 KB
RevLine 
[c468150]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//
[c92bdcc]7// StatementNode.hpp --
[c468150]8//
9// Author : Andrew Beach
10// Created On : Wed Apr 5 11:42:00 2023
[f259682]11// Last Modified By : Peter A. Buhr
[cd28605]12// Last Modified On : Thu Feb 6 11:39:26 2025
13// Update Count : 6
[c468150]14//
15
16#pragma once
17
[c92bdcc]18#include "ParseNode.hpp"
[c468150]19
[dc3fbe5]20struct StatementNode final : public ParseList<StatementNode> {
[6611177]21 StatementNode() : stmt( nullptr ) {}
22 StatementNode( ast::Stmt * stmt ) : stmt( stmt ) {}
[c468150]23 StatementNode( DeclarationNode * decl );
24 virtual ~StatementNode() {}
25
26 virtual StatementNode * clone() const final { assert( false ); return nullptr; }
[6611177]27 ast::Stmt * build() { return stmt.release(); }
[c468150]28
[cd28605]29 StatementNode * addQualifiers( DeclarationNode * );
[c468150]30 StatementNode * add_label(
31 const CodeLocation & location,
32 const std::string * name,
[6611177]33 DeclarationNode * attr = nullptr );
[c468150]34
35 virtual void print( std::ostream & os, __attribute__((unused)) int indent = 0 ) const override {
36 os << stmt.get() << std::endl;
37 }
38
[cd28605]39 std::vector<ast::ptr<ast::Attribute>> attributes;
[c468150]40 std::unique_ptr<ast::Stmt> stmt;
41}; // StatementNode
42
[dc3fbe5]43struct ClauseNode final : public ParseList<ClauseNode> {
[6611177]44 ClauseNode( ast::StmtClause * clause ) : clause( clause ) {}
45 virtual ~ClauseNode() {}
46
47 virtual ClauseNode * clone() const final { assert( false ); return nullptr; }
48 ast::StmtClause * build() { return clause.release(); }
49
50 virtual ClauseNode * append_last_case( StatementNode * );
51
52 std::unique_ptr<ast::StmtClause> clause;
53};
54
[738a9b4]55ast::Stmt * build_expr( CodeLocation const &, ExpressionNode * ctrl );
[c468150]56
[738a9b4]57struct CondCtrl {
58 CondCtrl( DeclarationNode * decl, ExpressionNode * condition ) :
[c468150]59 init( decl ? new StatementNode( decl ) : nullptr ), condition( condition ) {}
60
61 StatementNode * init;
62 ExpressionNode * condition;
63};
64
65struct ForCtrl {
66 ForCtrl( StatementNode * stmt, ExpressionNode * condition, ExpressionNode * change ) :
[525f7ad]67 init( stmt ), condition( condition ), change( change ), range_over( nullptr ) {}
[d3aa55e9]68 ForCtrl( StatementNode * decl, ExpressionNode * range_over, OperKinds kind ) :
[738a9b4]69 init( decl ), condition( nullptr ), change( nullptr ), range_over( range_over ), kind( kind ) {}
[c468150]70
71 StatementNode * init;
72 ExpressionNode * condition;
73 ExpressionNode * change;
[525f7ad]74 ExpressionNode * range_over;
[d3aa55e9]75 OperKinds kind;
[c468150]76};
77
[738a9b4]78ast::Stmt * build_if( const CodeLocation &, CondCtrl * ctrl, StatementNode * then, StatementNode * else_ );
79ast::Stmt * build_switch( const CodeLocation &, bool isSwitch, ExpressionNode * ctrl, ClauseNode * stmt );
80ast::CaseClause * build_case( const CodeLocation &, ExpressionNode * ctrl );
[c468150]81ast::CaseClause * build_default( const CodeLocation & );
[738a9b4]82ast::Stmt * build_while( const CodeLocation &, CondCtrl * ctrl, StatementNode * stmt, StatementNode * else_ = nullptr );
83ast::Stmt * build_do_while( const CodeLocation &, ExpressionNode * ctrl, StatementNode * stmt, StatementNode * else_ = nullptr );
84ast::Stmt * build_for( const CodeLocation &, ForCtrl * forctrl, StatementNode * stmt, StatementNode * else_ = nullptr );
[c468150]85ast::Stmt * build_branch( const CodeLocation &, ast::BranchStmt::Kind kind );
86ast::Stmt * build_branch( const CodeLocation &, std::string * identifier, ast::BranchStmt::Kind kind );
[738a9b4]87ast::Stmt * build_computedgoto( ExpressionNode * ctrl );
88ast::Stmt * build_return( const CodeLocation &, ExpressionNode * ctrl );
89ast::Stmt * build_throw( const CodeLocation &, ExpressionNode * ctrl );
90ast::Stmt * build_resume( const CodeLocation &, ExpressionNode * ctrl );
91ast::Stmt * build_resume_at( ExpressionNode * ctrl , ExpressionNode * target );
[6611177]92ast::Stmt * build_try( const CodeLocation &, StatementNode * try_, ClauseNode * catch_, ClauseNode * finally_ );
[c468150]93ast::CatchClause * build_catch( const CodeLocation &, ast::ExceptionKind kind, DeclarationNode * decl, ExpressionNode * cond, StatementNode * body );
94ast::FinallyClause * build_finally( const CodeLocation &, StatementNode * stmt );
95ast::Stmt * build_compound( const CodeLocation &, StatementNode * first );
96StatementNode * maybe_build_compound( const CodeLocation &, StatementNode * first );
[32d6fdc]97ast::Stmt * build_asm( const CodeLocation &, bool is_volatile, ExpressionNode * instruction, ExpressionNode * output = nullptr, ExpressionNode * input = nullptr, ExpressionNode * clobber = nullptr, LabelNode * gotolabels = nullptr );
[c468150]98ast::Stmt * build_directive( const CodeLocation &, std::string * directive );
99ast::SuspendStmt * build_suspend( const CodeLocation &, StatementNode *, ast::SuspendStmt::Kind );
100ast::WaitForStmt * build_waitfor( const CodeLocation &, ast::WaitForStmt * existing, ExpressionNode * when, ExpressionNode * targetExpr, StatementNode * stmt );
101ast::WaitForStmt * build_waitfor_else( const CodeLocation &, ast::WaitForStmt * existing, ExpressionNode * when, StatementNode * stmt );
102ast::WaitForStmt * build_waitfor_timeout( const CodeLocation &, ast::WaitForStmt * existing, ExpressionNode * when, ExpressionNode * timeout, StatementNode * stmt );
[6e1e2d0]103ast::WaitUntilStmt::ClauseNode * build_waituntil_clause( const CodeLocation &, ExpressionNode * when, ExpressionNode * targetExpr, StatementNode * stmt );
104ast::WaitUntilStmt::ClauseNode * build_waituntil_else( const CodeLocation &, ExpressionNode * when, StatementNode * stmt );
105ast::WaitUntilStmt * build_waituntil_stmt( const CodeLocation &, ast::WaitUntilStmt::ClauseNode * root );
[c468150]106ast::Stmt * build_with( const CodeLocation &, ExpressionNode * exprs, StatementNode * stmt );
107ast::Stmt * build_mutex( const CodeLocation &, ExpressionNode * exprs, StatementNode * stmt );
[eb779d5]108ast::Stmt * build_corun( const CodeLocation &, StatementNode * stmt );
[738a9b4]109ast::Stmt * build_cofor( const CodeLocation & location, ForCtrl * forctrl, StatementNode * stmt );
Note: See TracBrowser for help on using the repository browser.