Changeset 0dd3a2f for translator/SynTree/Visitor.h
- Timestamp:
- May 18, 2015, 11:20:23 AM (9 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, string, with_gc
- Children:
- 51587aa
- Parents:
- a32b204
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
translator/SynTree/Visitor.h
ra32b204 r0dd3a2f 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 // Visitor.h -- 8 // 9 // Author : Richard C. Bilson 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon May 18 11:15:55 2015 13 // Update Count : 2 14 // 15 1 16 #ifndef VISITOR_H 2 17 #define VISITOR_H … … 6 21 #include "CompilerError.h" 7 22 8 9 23 class Visitor { 10 24 protected: 11 12 25 Visitor(); 26 virtual ~Visitor(); 13 27 public: 14 15 16 17 18 19 20 21 28 virtual void visit( ObjectDecl *objectDecl ); 29 virtual void visit( FunctionDecl *functionDecl ); 30 virtual void visit( StructDecl *aggregateDecl ); 31 virtual void visit( UnionDecl *aggregateDecl ); 32 virtual void visit( EnumDecl *aggregateDecl ); 33 virtual void visit( ContextDecl *aggregateDecl ); 34 virtual void visit( TypeDecl *typeDecl ); 35 virtual void visit( TypedefDecl *typeDecl ); 22 36 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 37 virtual void visit( CompoundStmt *compoundStmt ); 38 virtual void visit( ExprStmt *exprStmt ); 39 virtual void visit( IfStmt *ifStmt ); 40 virtual void visit( WhileStmt *whileStmt ); 41 virtual void visit( ForStmt *forStmt ); 42 virtual void visit( SwitchStmt *switchStmt ); 43 virtual void visit( ChooseStmt *switchStmt ); 44 virtual void visit( FallthruStmt *switchStmt ); 45 virtual void visit( CaseStmt *caseStmt ); 46 virtual void visit( BranchStmt *branchStmt ); 47 virtual void visit( ReturnStmt *returnStmt ); 48 virtual void visit( TryStmt *tryStmt ); 49 virtual void visit( CatchStmt *catchStmt ); 50 virtual void visit( FinallyStmt *finallyStmt ); 51 virtual void visit( NullStmt *nullStmt ); 52 virtual void visit( DeclStmt *declStmt ); 39 53 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 54 virtual void visit( ApplicationExpr *applicationExpr ); 55 virtual void visit( UntypedExpr *untypedExpr ); 56 virtual void visit( NameExpr *nameExpr ); 57 virtual void visit( CastExpr *castExpr ); 58 virtual void visit( AddressExpr *addressExpr ); 59 virtual void visit( LabelAddressExpr *labAddressExpr ); 60 virtual void visit( UntypedMemberExpr *memberExpr ); 61 virtual void visit( MemberExpr *memberExpr ); 62 virtual void visit( VariableExpr *variableExpr ); 63 virtual void visit( ConstantExpr *constantExpr ); 64 virtual void visit( SizeofExpr *sizeofExpr ); 65 virtual void visit( AttrExpr *attrExpr ); 66 virtual void visit( LogicalExpr *logicalExpr ); 67 virtual void visit( ConditionalExpr *conditionalExpr ); 68 virtual void visit( CommaExpr *commaExpr ); 69 virtual void visit( TupleExpr *tupleExpr ); 70 virtual void visit( SolvedTupleExpr *tupleExpr ); 71 virtual void visit( TypeExpr *typeExpr ); 72 virtual void visit( UntypedValofExpr *valofExpr ); 59 73 60 61 62 63 64 65 66 67 68 69 70 71 72 74 virtual void visit( VoidType *basicType ); 75 virtual void visit( BasicType *basicType ); 76 virtual void visit( PointerType *pointerType ); 77 virtual void visit( ArrayType *arrayType ); 78 virtual void visit( FunctionType *functionType ); 79 virtual void visit( StructInstType *aggregateUseType ); 80 virtual void visit( UnionInstType *aggregateUseType ); 81 virtual void visit( EnumInstType *aggregateUseType ); 82 virtual void visit( ContextInstType *aggregateUseType ); 83 virtual void visit( TypeInstType *aggregateUseType ); 84 virtual void visit( TupleType *tupleType ); 85 virtual void visit( TypeofType *typeofType ); 86 virtual void visit( AttrType *attrType ); 73 87 74 75 88 virtual void visit( SingleInit *singleInit ); 89 virtual void visit( ListInit *listInit ); 76 90 77 91 virtual void visit( Subrange *subrange ); 78 92 79 93 virtual void visit( Constant *constant ); 80 94 private: 81 82 83 95 virtual void visit( AggregateDecl *aggregateDecl ); 96 virtual void visit( NamedTypeDecl *typeDecl ); 97 virtual void visit( ReferenceToType *aggregateUseType ); 84 98 }; 85 99 86 100 template< typename TreeType, typename VisitorType > 87 101 inline void maybeAccept( TreeType *tree, VisitorType &visitor ) { 88 89 tree->accept( visitor );90 102 if ( tree ) { 103 tree->accept( visitor ); 104 } 91 105 } 92 106 93 107 template< typename Container, typename VisitorType > 94 108 inline void acceptAll( Container &container, VisitorType &visitor ) { 95 SemanticError errors; 96 for ( typename Container::iterator i = container.begin(); i != container.end(); ++i ) { 97 try { 98 if ( *i ) { 99 (*i)->accept( visitor ); 100 } 101 } catch( SemanticError &e ) { 102 errors.append( e ); 109 SemanticError errors; 110 for ( typename Container::iterator i = container.begin(); i != container.end(); ++i ) { 111 try { 112 if ( *i ) { 113 (*i)->accept( visitor ); 114 } 115 } catch( SemanticError &e ) { 116 errors.append( e ); 117 } 103 118 } 104 } 105 if ( ! errors.isEmpty() ) { 106 throw errors; 107 } 119 if ( ! errors.isEmpty() ) { 120 throw errors; 121 } 108 122 } 109 123 110 124 template< typename Container, typename VisitorType > 111 125 void acceptAllFold( Container &container, VisitorType &visitor, VisitorType &around ) { 112 113 114 try {115 116 VisitorType *v = new VisitorType;117 (*i)->accept( *v );126 SemanticError errors; 127 for ( typename Container::iterator i = container.begin(); i != container.end(); ++i ) { 128 try { 129 if ( *i ) { 130 VisitorType *v = new VisitorType; 131 (*i)->accept( *v ); 118 132 119 typename Container::iterator nxt = i; nxt++; // forward_iterator120 if ( nxt == container.end() )121 122 else123 133 typename Container::iterator nxt = i; nxt++; // forward_iterator 134 if ( nxt == container.end() ) 135 visitor += *v; 136 else 137 visitor += *v + around; 124 138 125 delete v;126 }127 } catch( SemanticError &e ) {128 129 }130 } 131 132 throw errors;133 } 139 delete v; 140 } // if 141 } catch( SemanticError &e ) { 142 errors.append( e ); 143 } // try 144 } // for 145 if ( ! errors.isEmpty() ) { 146 throw errors; 147 } // if 134 148 } 135 149 136 150 #endif // VISITOR_H 151 152 // Local Variables: // 153 // tab-width: 4 // 154 // mode: c++ // 155 // compile-command: "make install" // 156 // End: //
Note: See TracChangeset
for help on using the changeset viewer.