source: translator/CodeGen/CodeGenerator2.h@ c8ffe20b

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 c8ffe20b was 51b73452, checked in by Peter A. Buhr <pabuhr@…>, 11 years ago

initial commit

  • Property mode set to 100644
File size: 3.4 KB
Line 
1#ifndef CODEGENV_H
2#define CODEGENV_H
3
4#include <strstream>
5#include <list>
6
7#include "SynTree/SynTree.h"
8#include "SynTree/Visitor.h"
9#include "SymTab/Indexer.h"
10
11namespace CodeGen {
12
13 class CodeGenerator2 : public Visitor
14 {
15 public:
16 static int tabsize;
17
18 CodeGenerator2( std::ostream &os );
19 CodeGenerator2(std::ostream &os, std::string, int indent = 0, bool infun = false );
20 CodeGenerator2(std::ostream &os, char *, int indent = 0, bool infun = false );
21
22 CodeGenerator2( CodeGenerator2 & );
23
24 virtual ~CodeGenerator2();
25
26 //*** Declaration
27 virtual void visit(StructDecl *);
28 virtual void visit(FunctionDecl *);
29 virtual void visit(ObjectDecl *);
30 virtual void visit(UnionDecl *aggregateDecl);
31 virtual void visit(EnumDecl *aggregateDecl);
32 virtual void visit(ContextDecl *aggregateDecl);
33 virtual void visit(TypedefDecl *typeDecl);
34 virtual void visit(TypeDecl *typeDecl);
35
36 //*** Initializer
37 virtual void visit(SingleInit *);
38 virtual void visit(ListInit *);
39
40 //*** Constant
41 virtual void visit(Constant *);
42
43 //*** Expression
44 virtual void visit(ApplicationExpr *applicationExpr);
45 virtual void visit(UntypedExpr *untypedExpr);
46 virtual void visit(NameExpr *nameExpr);
47 virtual void visit(AddressExpr *addressExpr);
48 virtual void visit(CastExpr *castExpr);
49 virtual void visit(UntypedMemberExpr *memberExpr);
50 virtual void visit(MemberExpr *memberExpr);
51 virtual void visit(VariableExpr *variableExpr);
52 virtual void visit(ConstantExpr *constantExpr);
53 virtual void visit(SizeofExpr *sizeofExpr);
54 virtual void visit(LogicalExpr *logicalExpr);
55 virtual void visit(ConditionalExpr *conditionalExpr);
56 virtual void visit(CommaExpr *commaExpr);
57 virtual void visit(TupleExpr *tupleExpr);
58 virtual void visit(TypeExpr *typeExpr);
59
60 //*** Statements
61 virtual void visit(CompoundStmt *);
62 virtual void visit(ExprStmt *);
63 virtual void visit(IfStmt *);
64 virtual void visit(SwitchStmt *);
65 virtual void visit(CaseStmt *);
66 virtual void visit(BranchStmt *);
67 virtual void visit(ReturnStmt *);
68 virtual void visit(WhileStmt *);
69 virtual void visit(ForStmt *);
70 virtual void visit(NullStmt *);
71 virtual void visit(DeclStmt *);
72
73 std::string get_string(void);
74 void add_string_left(std::string s) { before << s; }
75 void shift_left();
76 template< class Iterator > void genCommaList( Iterator begin, Iterator end );
77
78 private:
79 int cur_indent;
80 bool insideFunction;
81 std::ostream &before;
82 std::ostrstream after;
83
84 static std::string printLabels ( std::list < Label > & );
85 void handleStorageClass( Declaration *decl );
86 void handleAggregate( AggregateDecl *aggDecl );
87 void handleTypedef( NamedTypeDecl *namedType );
88
89 };
90
91 template< class Iterator >
92 void
93 CodeGenerator2::genCommaList( Iterator begin, Iterator end )
94 {
95 if( begin == end ) return;
96
97 for( ;; ) {
98 (*begin++)->accept( *this );
99
100 if( begin == end ) return;
101
102 before << ", ";
103 }
104 }
105
106 inline bool
107 doSemicolon( Declaration* decl )
108 {
109 if( FunctionDecl* func = dynamic_cast< FunctionDecl* >( decl ) ) {
110 return !func->get_statements();
111 }
112 return true;
113 }
114
115} // namespace CodeGen
116
117#endif /* #ifndef CODEGENV_H */
118
119/*
120 Local Variables:
121 mode: "c++"
122 End:
123*/
Note: See TracBrowser for help on using the repository browser.