source: translator/InitTweak/InitModel.h@ 643a2e1

ADT aaron-thesis arm-eh ast-experimental cleanup-dtors ctor deferred_resn demangler enum forall-pointer-decay gc_noraii jacob/cs343-translation jenkins-sandbox memory new-ast new-ast-unique-expr new-env no_list persistent-indexer pthread-emulation qualifiedEnum resolv-new string with_gc
Last change on this file since 643a2e1 was 51b73452, checked in by Peter A. Buhr <pabuhr@…>, 11 years ago

initial commit

  • Property mode set to 100644
File size: 3.7 KB
Line 
1#ifndef _INITTWEAK_MODEL_H_
2#define _INITTWEAK_MODEL_H_
3
4#include "Association.h"
5#include "SemanticError.h"
6#include "SynTree/Visitor.h"
7
8#include "SynTree/Initializer.h"
9#include "SynTree/Declaration.h"
10#include "SynTree/Expression.h"
11#include "SynTree/Type.h"
12
13namespace InitTweak {
14
15 class InitModelBuilder : public AssociationBuilder, public Visitor {
16 public:
17 InitModelBuilder( Declaration * );
18 ~InitModelBuilder();
19
20 virtual Association *grab_assoc() { taken = true; return building; }
21 virtual Association *get_assoc() { return building; }
22 void set_assoc( Association *newAssoc ) { building = newAssoc; }
23
24 void init();
25 static int interpretDimension( Expression *exp ) {
26 ConstantFolder folder( exp );
27 try {
28 return folder.get_constant();
29 } catch (...) {
30 throw SemanticError("Invalid array dimension");
31 }
32 }
33
34 // types
35 virtual void visit( ArrayType * );
36 virtual void visit( StructInstType * );
37 virtual void visit( UnionInstType * );
38 virtual void visit( EnumInstType * );
39 virtual void visit( ContextInstType * ) { throw 0; }
40 virtual void visit( TypeInstType * ) { throw 0; }
41 // virtual void visit( TupleType *tupleType );
42 // declarations
43 virtual void visit( StructDecl *);
44 virtual void visit( UnionDecl *);
45 virtual void visit( EnumDecl *);
46
47 private:
48 class ConstantFolder : public Visitor {
49 public:
50 ConstantFolder( Expression *_expr = 0 ): expr(_expr) {}
51 int get_constant() throw() { expr->accept( *this ); return value; }
52 void set_constant( Expression *newExp ) { expr = newExp; }
53 // Visitor interface
54 void visit( Expression * ) { throw 0; }
55 void visit( NameExpr * ) { throw 0; }
56 void visit( CastExpr * ) { throw 0; }
57 void visit( UntypedMemberExpr * ) { throw 0; }
58 void visit( VariableExpr * ) { throw 0; }
59 void visit( ConstantExpr * );
60 void visit( SizeofExpr * ) { throw 0; }
61 void visit( AttrExpr * ) { throw 0; }
62 void visit( LogicalExpr * ) { throw 0; }
63 void visit( ConditionalExpr * ) { throw 0; }
64 void visit( CommaExpr * ) { throw 0; }
65 private:
66 Expression *expr;
67 int value;
68 };
69
70 bool taken;
71 Declaration *decl; // ?
72 Association *building;
73 };
74
75 class InitModelFiller : public AssociationFiller, public Visitor {
76 public:
77 InitModelFiller( Association *, Initializer *, bool _topLevel = false );
78 ~InitModelFiller() { /* pointers in here are not owned by object (never created by object either) */ }
79 virtual Association *get_assoc() { return model; }
80 virtual void set_assoc( Association *newAssoc ) { model = newAssoc; }
81
82 void init();
83 // Visitor interface
84 virtual void visit( MemberInit *memberInit ) { throw 0; }
85 virtual void visit( ElementInit *elementInit ) { throw 0; }
86 virtual void visit( SingleInit *singleInit );
87 virtual void visit( ListInit *listInit );
88
89 private:
90 Association *model;
91 Initializer *orgInit;
92 bool topLevel;
93 long int next;
94 };
95
96 class InitUnspooler : public AssociationVisitor {
97 public:
98 InitUnspooler() : init(0), taken( false ) {}
99 virtual ~InitUnspooler() { if (!taken && (init != 0)) { delete init; init = 0; } }
100 Initializer *get_initializer() { return init; }
101 Initializer *grab_initializer() { taken = true; return init; }
102
103 virtual void visit( SingleName * );
104 virtual void visit( PointAssociation * );
105 virtual void visit( RangeAssociation * ) { std::cerr << "InitUnspooler - In a range assoc" << std::endl; return; }
106
107 private:
108 Initializer *init;
109 bool taken;
110 };
111
112} // namespace InitTweak
113
114#endif // #define _INITTWEAK_MODEL_H_
115
116/*
117 Local Variables:
118 mode: c++
119 End:
120*/
Note: See TracBrowser for help on using the repository browser.