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
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.hpp --
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 : Thu Feb 6 11:39:26 2025
13// Update Count : 6
14//
15
16#pragma once
17
18#include "ParseNode.hpp"
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 * addQualifiers( DeclarationNode * );
30 StatementNode * add_label(
31 const CodeLocation & location,
32 const std::string * name,
33 DeclarationNode * attr = nullptr );
34
35 virtual void print( std::ostream & os, __attribute__((unused)) int indent = 0 ) const override {
36 os << stmt.get() << std::endl;
37 }
38
39 std::vector<ast::ptr<ast::Attribute>> attributes;
40 std::unique_ptr<ast::Stmt> stmt;
41}; // StatementNode
42
43struct ClauseNode final : public ParseList<ClauseNode> {
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
55ast::Stmt * build_expr( CodeLocation const &, ExpressionNode * ctrl );
56
57struct CondCtrl {
58 CondCtrl( DeclarationNode * decl, ExpressionNode * condition ) :
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 ) :
67 init( stmt ), condition( condition ), change( change ), range_over( nullptr ) {}
68 ForCtrl( StatementNode * decl, ExpressionNode * range_over, OperKinds kind ) :
69 init( decl ), condition( nullptr ), change( nullptr ), range_over( range_over ), kind( kind ) {}
70
71 StatementNode * init;
72 ExpressionNode * condition;
73 ExpressionNode * change;
74 ExpressionNode * range_over;
75 OperKinds kind;
76};
77
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 );
81ast::CaseClause * build_default( const CodeLocation & );
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 );
85ast::Stmt * build_branch( const CodeLocation &, ast::BranchStmt::Kind kind );
86ast::Stmt * build_branch( const CodeLocation &, std::string * identifier, ast::BranchStmt::Kind kind );
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 );
92ast::Stmt * build_try( const CodeLocation &, StatementNode * try_, ClauseNode * catch_, ClauseNode * finally_ );
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 );
97ast::Stmt * build_asm( const CodeLocation &, bool is_volatile, ExpressionNode * instruction, ExpressionNode * output = nullptr, ExpressionNode * input = nullptr, ExpressionNode * clobber = nullptr, LabelNode * gotolabels = nullptr );
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 );
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 );
106ast::Stmt * build_with( const CodeLocation &, ExpressionNode * exprs, StatementNode * stmt );
107ast::Stmt * build_mutex( const CodeLocation &, ExpressionNode * exprs, StatementNode * stmt );
108ast::Stmt * build_corun( const CodeLocation &, StatementNode * stmt );
109ast::Stmt * build_cofor( const CodeLocation & location, ForCtrl * forctrl, StatementNode * stmt );
Note: See TracBrowser for help on using the repository browser.