00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef _CHLLCODE_H_
00024 #define _CHLLCODE_H_
00025
00026 #include <string>
00027 #include <sstream>
00028
00029 class BasicBlock;
00030 class Exp;
00031 class Proc;
00032 class Assign;
00033 class LocationSet;
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060 enum PREC {
00061 PREC_NONE=0,
00062 PREC_COMMA,
00063 PREC_ASSIGN,
00064 PREC_COND,
00065 PREC_LOG_OR,
00066 PREC_LOG_AND,
00067 PREC_BIT_IOR,
00068 PREC_BIT_XOR,
00069 PREC_BIT_AND,
00070 PREC_EQUAL,
00071 PREC_REL,
00072 PREC_BIT_SHIFT,
00073 PREC_ADD,
00074 PREC_MULT,
00075 PREC_PTR_MEM,
00076 PREC_UNARY,
00077 PREC_PRIM,
00078 PREC_SCOPE
00079 };
00080
00081
00082
00083
00084 class CHLLCode : public HLLCode {
00085 private:
00086
00087 std::list<char *> lines;
00088
00089 void indent(std::ostringstream& str, int indLevel);
00090 void appendExp(std::ostringstream& str, Exp *exp, PREC curPrec, bool uns = false);
00091 void appendType(std::ostringstream& str, Type *typ);
00092 void appendTypeIdent(std::ostringstream& str, Type *typ, const char *ident);
00093
00094 void openParen(std::ostringstream& str, PREC outer, PREC inner) {
00095 if (inner < outer) str << "("; }
00096
00097 void closeParen(std::ostringstream& str, PREC outer, PREC inner) {
00098 if (inner < outer) str << ")"; }
00099
00100 void appendLine(const std::ostringstream& ostr);
00101 void appendLine(const std::string& s);
00102
00103
00104 std::map<std::string, Type*> locals;
00105
00106
00107 std::set<int> usedLabels;
00108
00109 public:
00110
00111 CHLLCode();
00112 CHLLCode(UserProc *p);
00113
00114
00115 virtual ~CHLLCode();
00116
00117
00118 virtual void reset();
00119
00120
00121
00122
00123
00124
00125 virtual void AddPretestedLoopHeader(int indLevel, Exp *cond);
00126 virtual void AddPretestedLoopEnd(int indLevel);
00127
00128
00129 virtual void AddEndlessLoopHeader(int indLevel);
00130 virtual void AddEndlessLoopEnd(int indLevel);
00131
00132
00133 virtual void AddPosttestedLoopHeader(int indLevel);
00134 virtual void AddPosttestedLoopEnd(int indLevel, Exp *cond);
00135
00136
00137 virtual void AddCaseCondHeader(int indLevel, Exp *cond);
00138 virtual void AddCaseCondOption(int indLevel, Exp *opt);
00139 virtual void AddCaseCondOptionEnd(int indLevel);
00140 virtual void AddCaseCondElse(int indLevel);
00141 virtual void AddCaseCondEnd(int indLevel);
00142
00143
00144 virtual void AddIfCondHeader(int indLevel, Exp *cond);
00145 virtual void AddIfCondEnd(int indLevel);
00146
00147
00148 virtual void AddIfElseCondHeader(int indLevel, Exp *cond);
00149 virtual void AddIfElseCondOption(int indLevel);
00150 virtual void AddIfElseCondEnd(int indLevel);
00151
00152
00153 virtual void AddGoto(int indLevel, int ord);
00154 virtual void AddContinue(int indLevel);
00155 virtual void AddBreak(int indLevel);
00156
00157
00158 virtual void AddLabel(int indLevel, int ord);
00159 virtual void RemoveLabel(int ord);
00160 virtual void RemoveUnusedLabels(int maxOrd);
00161
00162
00163 virtual void AddAssignmentStatement(int indLevel, Assign *asgn);
00164 virtual void AddCallStatement(int indLevel, Proc *proc, const char *name, StatementList& args,
00165 StatementList* results);
00166 virtual void AddIndCallStatement(int indLevel, Exp *exp, StatementList &args, StatementList* results);
00167 virtual void AddReturnStatement(int indLevel, StatementList* rets);
00168
00169
00170 virtual void AddProcStart(UserProc* proc);
00171 virtual void AddProcEnd();
00172 virtual void AddLocal(const char *name, Type *type, bool last = false);
00173 virtual void AddGlobal(const char *name, Type *type, Exp *init = NULL);
00174 virtual void AddPrototype(UserProc* proc);
00175 private:
00176 void AddProcDec(UserProc* proc, bool open);
00177 public:
00178
00179
00180 virtual void AddLineComment(char* cmt);
00181
00182
00183
00184
00185 virtual void print(std::ostream &os);
00186 };
00187
00188 #endif