00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "list.hh"
00025 #include "boxes.hh"
00026 #include "ppbox.hh"
00027 #include "signals.hh"
00028 #include "prim2.hh"
00029 #include "xtended.hh"
00030
00031
00032 const char * prim0name(CTree *(*ptr) ())
00033 {
00034 return "prim0???";
00035 }
00036
00037 const char * prim1name(CTree *(*ptr) (CTree *))
00038 {
00039 if (ptr == sigDelay1) return "mem";
00040 if (ptr == sigIntCast) return "int";
00041 if (ptr == sigFloatCast) return "float";
00042 return "prim1???";
00043 }
00044
00045 const char * prim2name(CTree *(*ptr) (CTree *, CTree *))
00046 {
00047 if (ptr == sigAdd) return "+";
00048 if (ptr == sigSub) return "-";
00049 if (ptr == sigMul) return "*";
00050 if (ptr == sigDiv) return "/";
00051 if (ptr == sigRem) return "%";
00052
00053 if (ptr == sigAND) return "&";
00054 if (ptr == sigOR ) return "|";
00055 if (ptr == sigXOR) return "^";
00056
00057 if (ptr == sigLeftShift ) return "<<";
00058 if (ptr == sigRightShift) return ">>";
00059
00060 if (ptr == sigLT) return "<";
00061 if (ptr == sigLE) return "<=";
00062 if (ptr == sigGT) return ">";
00063 if (ptr == sigGE) return ">=";
00064 if (ptr == sigEQ) return "==";
00065 if (ptr == sigNE) return "!=";
00066
00067 if (ptr == sigFixDelay) return "@";
00068 if (ptr == sigPrefix) return "prefix";
00069 if (ptr == sigAttach) return "attach";
00070
00071 return "prim2???";
00072 }
00073
00074 const char * prim3name(CTree *(*ptr) (CTree *, CTree *, CTree *))
00075 {
00076 if (ptr == sigReadOnlyTable) return "rdtable";
00077 if (ptr == sigSelect2) return "select2";
00078 return "prim3???";
00079 }
00080
00081 const char * prim4name(CTree *(*ptr) (CTree *, CTree *, CTree *, CTree *))
00082 {
00083 if (ptr == sigSelect3) return "select3";
00084 return "prim4???";
00085 }
00086
00087 const char * prim5name(CTree *(*ptr) (CTree *, CTree *, CTree *, CTree *, CTree *))
00088 {
00089 if (ptr == sigWriteReadTable) return "wrtable";
00090 return "prim5???";
00091 }
00092
00093
00094 static void streambinop(ostream& fout, Tree t1, const char* op, Tree t2, int curPriority, int upPriority)
00095 {
00096 if (upPriority > curPriority) fout << '(';
00097 fout << boxpp(t1,curPriority) << op << boxpp(t2,curPriority);
00098 if (upPriority > curPriority) fout << ')';
00099 }
00100
00101 static void printRule(ostream& fout, Tree rule)
00102 {
00103 Tree lhs = left(rule);
00104 Tree rhs = right(rule);
00105 char sep = '('; while (!isNil(lhs)) { fout << sep << boxpp(hd(lhs)); sep=','; lhs=tl(lhs); }
00106 fout << ") => " << boxpp(rhs) << "; ";
00107 }
00108
00109
00110
00111
00112
00113 ostream& boxpp::print (ostream& fout) const
00114 {
00115 int i, id;
00116 double r;
00117 prim0 p0;
00118 prim1 p1;
00119 prim2 p2;
00120 prim3 p3;
00121 prim4 p4;
00122 prim5 p5;
00123
00124 Tree t1, t2, t3, ff, label, cur, min, max, step, type, name, file, arg,
00125 body, fun, args, abstr, genv, vis, lenv, ldef, slot,
00126 ident, rules;
00127
00128 const char* str;
00129
00130 xtended* xt = (xtended*) getUserData(box);
00131
00132
00133
00134 if (xt) fout << xt->name();
00135 else if (isBoxInt(box, &i)) fout << i;
00136 else if (isBoxReal(box, &r)) fout << r;
00137 else if (isBoxCut(box)) fout << '!';
00138 else if (isBoxWire(box)) fout << '_';
00139 else if (isBoxIdent(box, &str)) fout << str;
00140 else if (isBoxPrim0(box, &p0)) fout << prim0name(p0);
00141 else if (isBoxPrim1(box, &p1)) fout << prim1name(p1);
00142 else if (isBoxPrim2(box, &p2)) fout << prim2name(p2);
00143 else if (isBoxPrim3(box, &p3)) fout << prim3name(p3);
00144 else if (isBoxPrim4(box, &p4)) fout << prim4name(p4);
00145 else if (isBoxPrim5(box, &p5)) fout << prim5name(p5);
00146
00147 else if (isBoxAbstr(box,arg,body)) fout << "\\" << boxpp(arg) << ".(" << boxpp(body) << ")";
00148 else if (isBoxAppl(box, fun, args)) fout << boxpp(fun) << boxpp(args) ;
00149
00150 else if (isBoxWithLocalDef(box, body, ldef)) fout << boxpp(body) << " with { " << envpp(ldef) << " }";
00151
00152
00153 else if (isBoxFFun(box, ff)) fout << "ffunction(" << ffname(ff) << ')';
00154 else if (isBoxFConst(box, type, name, file))
00155 fout << "fconstant(" << tree2str(name) << ')';
00156 else if (isBoxFVar(box, type, name, file))
00157 fout << "fvariable(" << tree2str(name) << ')';
00158
00159
00160 else if (isBoxSeq(box, t1, t2)) streambinop(fout, t1, ":", t2, 1, priority);
00161 else if (isBoxSplit(box, t1, t2)) streambinop(fout, t1, "<:", t2, 1, priority);
00162 else if (isBoxMerge(box, t1, t2)) streambinop(fout, t1, ":>", t2, 1, priority);
00163 else if (isBoxPar(box, t1, t2)) streambinop(fout, t1,",",t2, 2, priority);
00164 else if (isBoxRec(box, t1, t2)) streambinop(fout, t1,"~",t2, 4, priority);
00165
00166
00167 else if (isBoxIPar(box, t1, t2, t3)) fout << "par(" << boxpp(t1) << ", " << boxpp(t2) << ") {" << boxpp(t3) << "}";
00168 else if (isBoxISeq(box, t1, t2, t3)) fout << "seq(" << boxpp(t1) << ", " << boxpp(t2) << ") {" << boxpp(t3) << "}";
00169 else if (isBoxISum(box, t1, t2, t3)) fout << "sum(" << boxpp(t1) << ", " << boxpp(t2) << ") {" << boxpp(t3) << "}";
00170 else if (isBoxIProd(box, t1, t2, t3)) fout << "prod(" << boxpp(t1) << ", " << boxpp(t2) << ") {" << boxpp(t3) << "}";
00171
00172
00173 else if (isBoxButton(box, label)) fout << "button(" << tree2str(label) << ')';
00174 else if (isBoxCheckbox(box, label)) fout << "checkbox(" << tree2str(label) << ')';
00175 else if (isBoxVSlider(box, label, cur, min, max, step)) {
00176 fout << "vslider("
00177 << tree2str(label) << ", "
00178 << boxpp(cur) << ", "
00179 << boxpp(min) << ", "
00180 << boxpp(max) << ", "
00181 << boxpp(step)<< ')';
00182 }
00183 else if (isBoxHSlider(box, label, cur, min, max, step)) {
00184 fout << "hslider("
00185 << tree2str(label) << ", "
00186 << boxpp(cur) << ", "
00187 << boxpp(min) << ", "
00188 << boxpp(max) << ", "
00189 << boxpp(step)<< ')';
00190 }
00191 else if (isBoxVGroup(box, label, t1)) {
00192 fout << "vgroup(" << tree2str(label) << ", " << boxpp(t1, 0) << ')';
00193 }
00194 else if (isBoxHGroup(box, label, t1)) {
00195 fout << "hgroup(" << tree2str(label) << ", " << boxpp(t1, 0) << ')';
00196 }
00197 else if (isBoxTGroup(box, label, t1)) {
00198 fout << "tgroup(" << tree2str(label) << ", " << boxpp(t1, 0) << ')';
00199 }
00200 else if (isBoxHBargraph(box, label, min, max)) {
00201 fout << "hbargraph("
00202 << tree2str(label) << ", "
00203 << boxpp(min) << ", "
00204 << boxpp(max) << ')';
00205 }
00206 else if (isBoxVBargraph(box, label, min, max)) {
00207 fout << "vbargraph("
00208 << tree2str(label) << ", "
00209 << boxpp(min) << ", "
00210 << boxpp(max) << ')';
00211 }
00212 else if (isBoxNumEntry(box, label, cur, min, max, step)) {
00213 fout << "nentry("
00214 << tree2str(label) << ", "
00215 << boxpp(cur) << ", "
00216 << boxpp(min) << ", "
00217 << boxpp(max) << ", "
00218 << boxpp(step)<< ')';
00219 }
00220 else if (isNil(box)) {
00221 fout << "()" ;
00222 }
00223 else if (isList(box)) {
00224
00225 Tree l = box;
00226 char sep = '(';
00227
00228 do {
00229 fout << sep << boxpp(hd(l));
00230 sep = ',';
00231 l = tl(l);
00232 } while (isList(l));
00233
00234 fout << ')';
00235
00236 }
00237 else if (isBoxEnvironment(box)) {
00238 fout << "environment";
00239 }
00240 else if (isClosure(box, abstr, genv, vis, lenv)) {
00241 fout << "closure[" << boxpp(abstr)
00242 << ", genv = " << envpp(genv)
00243 << ", lenv = " << envpp(lenv)
00244 << "]";
00245 }
00246 else if (isBoxComponent(box, label)) {
00247 fout << "component("
00248 << tree2str(label) << ')';
00249 }
00250 else if (isBoxAccess(box, t1, t2)) {
00251 fout << boxpp(t1) << '.' << boxpp(t2);
00252 }
00253 else if (isImportFile(box, label)) {
00254 fout << "import("
00255 << tree2str(label) << ')';
00256 }
00257 else if (isBoxSlot(box, &id)) {
00258 fout << "#" << id;
00259 }
00260 else if (isBoxSymbolic(box, slot, body)) {
00261 fout << "[" << boxpp(slot) << ">" << boxpp(body) << "]";
00262 }
00263
00264
00265 else if (isBoxCase(box, rules)) {
00266 fout << "case {";
00267 while (!isNil(rules)) { printRule(fout, hd(rules)); rules = tl(rules); }
00268 fout << "}";
00269 }
00270 #if 0
00271
00272 else if (isBoxPatternVar(box, ident)) {
00273 fout << "<" << boxpp(ident) << ">";
00274 }
00275 #else
00276
00277 else if (isBoxPatternVar(box, ident)) {
00278 fout << boxpp(ident);
00279 }
00280 #endif
00281
00282 else if (isBoxPatternMatcher(box)) {
00283 fout << "PM[" << box << "]";
00284 }
00285
00286 else if (isBoxError(box)) {
00287 fout << "ERROR";
00288 }
00289
00290
00291
00292 else {
00293 cerr << "Error in box::print() : " << *box << " is not the address of a valid box" << endl;
00294 exit(1);
00295 }
00296
00297 return fout;
00298 }
00299
00300
00301
00302
00303
00304
00305 ostream& envpp::print (ostream& fout) const
00306 {
00307 const char* sep = "";
00308 Tree l = fEnv;
00309
00310 fout << '{';
00311 while (isList(l)) {
00312 fout << sep << boxpp(hd(hd(l))) << "=" << boxpp(tl(hd(l)));
00313 sep = ", ";
00314 l = tl(l);
00315 }
00316 fout << '}';
00317 return fout;
00318 }
00319