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 "ppsig.hh"
00025 #include "binop.hh"
00026 #include "prim2.hh"
00027 #include "xtended.hh"
00028 #include "recursivness.hh"
00029
00030 ostream& ppsig::printinfix (ostream& fout, const string& opname, int priority, Tree x, Tree y) const
00031 {
00032 if (fPriority > priority) fout << "(";
00033 fout << ppsig(x,fEnv,priority) << opname << ppsig(y,fEnv,priority);
00034 if (fPriority > priority) fout << ")";
00035 return fout;
00036 }
00037
00038 ostream& ppsig::printfun (ostream& fout, const string& funame, Tree x) const
00039 {
00040 return fout << funame << '(' << ppsig(x,fEnv) << ')';
00041 }
00042
00043 ostream& ppsig::printfun (ostream& fout, const string& funame, Tree x, Tree y) const
00044 {
00045 return fout << funame << '(' << ppsig(x,fEnv) << ',' << ppsig(y,fEnv) << ')';
00046 }
00047
00048 ostream& ppsig::printfun (ostream& fout, const string& funame, Tree x, Tree y, Tree z) const
00049 {
00050 return fout << funame << '(' << ppsig(x,fEnv) << ',' << ppsig(y,fEnv) << ',' << ppsig(z,fEnv) << ')';
00051 }
00052
00053 ostream& ppsig::printfun (ostream& fout, const string& funame, Tree x, Tree y, Tree z, Tree zz) const
00054 {
00055 return fout << funame << '(' << ppsig(x,fEnv) << ',' << ppsig(y,fEnv) << ',' << ppsig(z,fEnv) << ',' << ppsig(zz,fEnv) << ')';
00056 }
00057
00058 ostream& ppsig::printfun (ostream& fout, const string& funame, Tree x, Tree y, Tree z, Tree z2, Tree z3) const
00059 {
00060 return fout << funame << '(' << ppsig(x,fEnv) << ',' << ppsig(y,fEnv) << ',' << ppsig(z,fEnv) << ',' << ppsig(z2,fEnv) << ',' << ppsig(z3,fEnv) << ')';
00061 }
00062
00063 ostream& ppsig::printui (ostream& fout, const string& funame, Tree label) const
00064 {
00065 fout << funame << '(';
00066 printlabel(fout, label);
00067 return fout << ')';
00068 }
00069
00070 ostream& ppsig::printui (ostream& fout, const string& funame, Tree label, Tree lo, Tree hi, Tree step) const
00071 {
00072 fout << funame << '(';
00073 printlabel(fout, label);
00074 return fout
00075 << ',' << ppsig(lo,fEnv)
00076 << ',' << ppsig(hi,fEnv)
00077 << ',' << ppsig(step,fEnv)
00078 << ')';
00079 }
00080
00081 ostream& ppsig::printui (ostream& fout, const string& funame, Tree label, Tree cur, Tree lo, Tree hi, Tree step) const
00082 {
00083 fout << funame << '(';
00084 printlabel(fout, label);
00085 return fout
00086 << ',' << ppsig(cur,fEnv)
00087 << ',' << ppsig(lo,fEnv)
00088 << ',' << ppsig(hi,fEnv)
00089 << ',' << ppsig(step,fEnv)
00090 << ')';
00091 }
00092
00093 ostream& ppsig::printout (ostream& fout, int i, Tree x) const
00094 {
00095 if (fPriority > 0) fout << "(";
00096 fout << "OUT" << i << " = " << ppsig(x, fEnv, 0);
00097 if (fPriority > 0) fout << ")";
00098 return fout;
00099 }
00100
00101 ostream& ppsig::printlabel (ostream& fout, Tree pathname) const
00102 {
00103 fout << *hd(pathname);
00104 pathname = tl(pathname);
00105 while (!isNil(pathname)) {
00106 fout << '/' << *tl(hd(pathname));
00107 pathname = tl(pathname);
00108 }
00109 return fout;
00110 }
00111
00112 ostream& ppsig::printlist (ostream& fout, Tree largs) const
00113 {
00114 string sep = "";
00115 fout << '(';
00116 while (!isNil(largs)) {
00117 fout << sep << ppsig(hd(largs), fEnv);
00118 sep = ", ";
00119 largs = tl(largs);
00120 }
00121 fout << ')';
00122 return fout;
00123 }
00124
00125 ostream& ppsig::printff (ostream& fout, Tree ff, Tree largs) const
00126 {
00127 fout << ffname(ff); printlist(fout, largs);
00128 return fout;
00129 }
00130
00131 ostream& ppsig::printFixDelay (ostream& fout, Tree exp, Tree delay) const
00132 {
00133 int d;
00134
00135 if (isSigInt(delay, &d) && (d==1)) {
00136 fout << ppsig(exp,fEnv,8) << "'";
00137 } else {
00138 printinfix(fout, "@", 8, exp, delay);
00139 }
00140 return fout;
00141 }
00142
00143
00144
00145 ostream& ppsig::printrec (ostream& fout, Tree var, Tree lexp, bool hide) const
00146 {
00147 if (isElement(var, fEnv) ) {
00148 fout << *var;
00149 } else if (hide) {
00150 fout << *var;
00151 } else {
00152 fout << "letrec(" << *var << " = " << ppsig(lexp, addElement(var, fEnv)) << ")";
00153 }
00154 return fout;
00155 }
00156
00157 ostream& ppsig::printrec (ostream& fout, Tree lexp, bool hide) const
00158 {
00159 fout << "debruijn(" << ppsig(lexp,fEnv) << ")";
00160 return fout;
00161 }
00162
00163 ostream& ppsig::printextended (ostream& fout, Tree sig) const
00164 {
00165 string sep = "";
00166 xtended* p = (xtended*) getUserData(sig);
00167
00168 fout << p->name() << '(';
00169 for (int i = 0; i < sig->arity(); i++) {
00170 fout << sep << ppsig(sig->branch(i), fEnv);
00171 sep = ", ";
00172 }
00173 fout << ')';
00174 return fout;
00175 }
00176
00177
00178 ostream& ppsig::print (ostream& fout) const
00179 {
00180 int i;
00181 double r;
00182 Tree c, sel, x, y, z, u, var, le, label, id, ff, largs, type, name, file;
00183
00184 if ( isList(sig) ) { printlist(fout, sig); }
00185 else if ( isProj(sig, &i, x) ) { fout << "proj" << i << '(' << ppsig(x, fEnv) << ')'; }
00186 else if ( isRec(sig, var, le) ) { printrec(fout, var, le, fHideRecursion ); }
00187
00188
00189 else if ( isRec(sig, le) ) { printrec(fout, le, fHideRecursion ); }
00190 else if ( isRef(sig, i) ) { fout << "REF[" << i << "]"; }
00191
00192 else if ( getUserData(sig) ) { printextended(fout, sig); }
00193 else if ( isSigInt(sig, &i) ) { fout << i; }
00194 else if ( isSigReal(sig, &r) ) { fout << r; }
00195 else if ( isSigInput(sig, &i) ) { fout << "IN[" << i << "]"; }
00196 else if ( isSigOutput(sig, &i, x) ) { printout(fout, i, x) ; }
00197
00198 else if ( isSigDelay1(sig, x) ) { fout << ppsig(x, fEnv, 9) << "'"; }
00199
00200 else if ( isSigFixDelay(sig, x, y) ) { printFixDelay(fout, x, y); }
00201 else if ( isSigPrefix(sig, x, y) ) { printfun(fout, "prefix", x, y); }
00202 else if ( isSigIota(sig, x) ) { printfun(fout, "iota", x); }
00203 else if ( isSigBinOp(sig, &i, x, y) ) { printinfix(fout, gBinOpTable[i]->fName, gBinOpTable[i]->fPriority, x, y); }
00204 else if ( isSigFFun(sig, ff, largs) ) { printff(fout, ff, largs); }
00205 else if ( isSigFConst(sig, type, name, file) ) { fout << tree2str(name); }
00206 else if ( isSigFVar(sig, type, name, file) ) { fout << tree2str(name); }
00207
00208 else if ( isSigTable(sig, id, x, y) ) { printfun(fout, "TABLE", x, y); }
00209 else if ( isSigWRTbl(sig, id, x, y, z) ) { printfun(fout, "write", x, y, z); }
00210 else if ( isSigRDTbl(sig, x, y) ) { printfun(fout, "read", x, y); }
00211 else if ( isSigGen(sig, x) ) { fout << ppsig(x, fEnv, fPriority); }
00212
00213 else if ( isSigDocConstantTbl(sig, x, y) ) { printfun(fout, "docConstantTbl", x, y); }
00214 else if ( isSigDocWriteTbl(sig, x, y, z, u) ) { printfun(fout, "docWriteTbl", x, y, z, u); }
00215 else if ( isSigDocAccessTbl(sig, x, y) ) { printfun(fout, "docAccessTbl", x, y); }
00216
00217 else if ( isSigSelect2(sig, sel, x, y) ) { printfun(fout, "select2", sel, x, y); }
00218 else if ( isSigSelect3(sig, sel, x, y, z) ) { printfun(fout, "select3", sel, x, y, z); }
00219
00220 else if ( isSigIntCast(sig, x) ) { printfun(fout, "int", x); }
00221 else if ( isSigFloatCast(sig, x) ) { printfun(fout, "float", x); }
00222
00223 else if ( isSigButton(sig, label) ) { printui(fout, "button", label); }
00224 else if ( isSigCheckbox(sig, label) ) { printui(fout, "checkbox", label); }
00225 else if ( isSigVSlider(sig, label,c,x,y,z) ) { printui(fout, "vslider", label, c, x, y, z); }
00226 else if ( isSigHSlider(sig, label,c,x,y,z) ) { printui(fout, "hslider", label, c, x, y, z); }
00227 else if ( isSigNumEntry(sig, label,c,x,y,z) ) { printui(fout, "nentry", label, c, x, y, z); }
00228 else if ( isSigVBargraph(sig, label,x,y,z) ) { printui(fout, "vbargraph", label, x, y, z); }
00229 else if ( isSigHBargraph(sig, label,x,y,z) ) { printui(fout, "hbargraph", label, x, y, z); }
00230 else if ( isSigAttach(sig, x, y) ) { printfun(fout, "attach", x, y); }
00231
00232 else {
00233 cerr << "ERROR, ppsig doesn't recognize signal : " << *sig << endl;
00234 exit(1);
00235 }
00236 return fout;
00237 }
00238