source: translator/CodeGen/CodeGenerator2.h @ 42dcae7

ADTaaron-thesisarm-ehast-experimentalcleanup-dtorsctordeferred_resndemanglerenumforall-pointer-decaygc_noraiijacob/cs343-translationjenkins-sandboxmemorynew-astnew-ast-unique-exprnew-envno_listpersistent-indexerpthread-emulationqualifiedEnumresolv-newstringwith_gc
Last change on this file since 42dcae7 was 51b7345, checked in by Peter A. Buhr <pabuhr@…>, 10 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.