FAUST compiler  0.9.9.6b8
ppbox.cpp
Go to the documentation of this file.
1 /************************************************************************
2  ************************************************************************
3  FAUST compiler
4  Copyright (C) 2003-2004 GRAME, Centre National de Creation Musicale
5  ---------------------------------------------------------------------
6  This program is free software; you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation; either version 2 of the License, or
9  (at your option) any later version.
10 
11  This program is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with this program; if not, write to the Free Software
18  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19  ************************************************************************
20  ************************************************************************/
21 
22 
23 
24 #include "list.hh"
25 #include "boxes.hh"
26 #include "ppbox.hh"
27 #include "signals.hh"
28 #include "prim2.hh"
29 #include "xtended.hh"
30 #include "Text.hh"
31 
32 extern int gFloatSize;
33 
34 const char * prim0name(CTree *(*ptr) ())
35 {
36  return "prim0???";
37 }
38 
39 const char * prim1name(CTree *(*ptr) (CTree *))
40 {
41  if (ptr == sigDelay1) return "mem";
42  if (ptr == sigIntCast) return "int";
43  if (ptr == sigFloatCast) return "float";
44  return "prim1???";
45 }
46 
47 const char * prim2name(CTree *(*ptr) (CTree *, CTree *))
48 {
49  if (ptr == sigAdd) return "+";
50  if (ptr == sigSub) return "-";
51  if (ptr == sigMul) return "*";
52  if (ptr == sigDiv) return "/";
53  if (ptr == sigRem) return "%";
54 
55  if (ptr == sigAND) return "&";
56  if (ptr == sigOR ) return "|";
57  if (ptr == sigXOR) return "^";
58 
59  if (ptr == sigLeftShift ) return "<<";
60  if (ptr == sigRightShift) return ">>";
61 
62  if (ptr == sigLT) return "<";
63  if (ptr == sigLE) return "<=";
64  if (ptr == sigGT) return ">";
65  if (ptr == sigGE) return ">=";
66  if (ptr == sigEQ) return "==";
67  if (ptr == sigNE) return "!=";
68 
69  if (ptr == sigFixDelay) return "@";
70  if (ptr == sigPrefix) return "prefix";
71  if (ptr == sigAttach) return "attach";
72 
73  return "prim2???";
74 }
75 
76 const char * prim3name(CTree *(*ptr) (CTree *, CTree *, CTree *))
77 {
78  if (ptr == sigReadOnlyTable) return "rdtable";
79  if (ptr == sigSelect2) return "select2";
80  return "prim3???";
81 }
82 
83 const char * prim4name(CTree *(*ptr) (CTree *, CTree *, CTree *, CTree *))
84 {
85  if (ptr == sigSelect3) return "select3";
86  return "prim4???";
87 }
88 
89 const char * prim5name(CTree *(*ptr) (CTree *, CTree *, CTree *, CTree *, CTree *))
90 {
91  if (ptr == sigWriteReadTable) return "rwtable";
92  return "prim5???";
93 }
94 
95 
96 static void streambinop(ostream& fout, Tree t1, const char* op, Tree t2, int curPriority, int upPriority)
97 {
98  if (upPriority > curPriority) fout << '(';
99  fout << boxpp(t1,curPriority) << op << boxpp(t2,curPriority);
100  if (upPriority > curPriority) fout << ')';
101 }
102 
103 static void printRule(ostream& fout, Tree rule)
104 {
105  Tree lhs = left(rule);
106  Tree rhs = right(rule);
107  char sep = '(';
108  while (!isNil(lhs)) {
109  fout << sep << boxpp(hd(lhs));
110  sep=',';
111  lhs=tl(lhs);
112  }
113  fout << ") => " << boxpp(rhs) << "; ";
114 }
115 
116 /*****************************************************************************
117  affichage d'une expression box comme en entree
118 *****************************************************************************/
119 
120 // if t has a node of type symbol, return its name otherwise error
121 static string tree2quotedstr (Tree t)
122 {
123  return "\"" + string(tree2str(t)) + "\"";
124 }
125 
126 static string type2str(int type)
127 {
128  switch (type) {
129 
130  case 0:
131  return "int";
132 
133  case 1:
134  return "float";
135 
136  default:
137  return "";
138 
139  }
140 }
141 
142 // if t has a node of type symbol, return its name otherwise error
143 
144 ostream& boxpp::print (ostream& fout) const
145 {
146  int i, id;
147  double r;
148  prim0 p0;
149  prim1 p1;
150  prim2 p2;
151  prim3 p3;
152  prim4 p4;
153  prim5 p5;
154 
155  Tree t1, t2, t3, ff, label, cur, min, max, step, type, name, file, arg,
156  body, fun, args, abstr, genv, vis, lenv, ldef, slot,
157  ident, rules, filename;
158 
159  const char* str;
160 
161  xtended* xt = (xtended*) getUserData(box);
162 
163  // primitive elements
164  if (xt) fout << xt->name();
165  else if (isBoxInt(box, &i)) fout << i;
166  else if (isBoxReal(box, &r)) fout << T(r);
167  else if (isBoxCut(box)) fout << '!';
168  else if (isBoxWire(box)) fout << '_';
169  else if (isBoxIdent(box, &str)) fout << str;
170  else if (isBoxPrim0(box, &p0)) fout << prim0name(p0);
171  else if (isBoxPrim1(box, &p1)) fout << prim1name(p1);
172  else if (isBoxPrim2(box, &p2)) fout << prim2name(p2);
173  else if (isBoxPrim3(box, &p3)) fout << prim3name(p3);
174  else if (isBoxPrim4(box, &p4)) fout << prim4name(p4);
175  else if (isBoxPrim5(box, &p5)) fout << prim5name(p5);
176 
177  else if (isBoxAbstr(box,arg,body)) fout << "\\" << boxpp(arg) << ".(" << boxpp(body) << ")";
178  else if (isBoxAppl(box, fun, args)) fout << boxpp(fun) << boxpp(args) ;
179 
180  else if (isBoxWithLocalDef(box, body, ldef)) fout << boxpp(body) << " with { " << envpp(ldef) << " }";
181 
182  // foreign elements
183  else if (isBoxFFun(box, ff)) {
184  fout << "ffunction(" << type2str(ffrestype(ff));
185  Tree namelist = nth(ffsignature(ff),1);
186  char sep = ' ';
187  for (int i = 0; i < gFloatSize; i++) {
188  fout << sep << tree2str(nth(namelist,i));
189  sep = '|';
190  }
191  sep = '(';
192  for (int i = 0; i < ffarity(ff); i++) {
193  fout << sep << type2str(ffargtype(ff, i));
194  sep = ',';
195  }
196  fout << ')';
197  fout << ',' << ffincfile(ff) << ',' << fflibfile(ff) << ')';
198  } else if (isBoxFConst(box, type, name, file))
199  fout << "fconstant(" << type2str(tree2int(type)) << ' ' << tree2str(name) << ", " << tree2str(file) << ')';
200  else if (isBoxFVar(box, type, name, file))
201  fout << "fvariable(" << type2str(tree2int(type)) << ' ' << tree2str(name) << ", " << tree2str(file) << ')';
202 
203  // block diagram binary operator
204  else if (isBoxSeq(box, t1, t2)) streambinop(fout, t1, " : ", t2, 1, priority);
205  else if (isBoxSplit(box, t1, t2)) streambinop(fout, t1, "<:", t2, 1, priority);
206  else if (isBoxMerge(box, t1, t2)) streambinop(fout, t1, ":>", t2, 1, priority);
207  else if (isBoxPar(box, t1, t2)) streambinop(fout, t1,",",t2, 2, priority);
208  else if (isBoxRec(box, t1, t2)) streambinop(fout, t1,"~",t2, 4, priority);
209 
210  // iterative block diagram construction
211  else if (isBoxIPar(box, t1, t2, t3)) fout << "par(" << boxpp(t1) << ", " << boxpp(t2) << ") {" << boxpp(t3) << "}";
212  else if (isBoxISeq(box, t1, t2, t3)) fout << "seq(" << boxpp(t1) << ", " << boxpp(t2) << ") {" << boxpp(t3) << "}";
213  else if (isBoxISum(box, t1, t2, t3)) fout << "sum(" << boxpp(t1) << ", " << boxpp(t2) << ") {" << boxpp(t3) << "}";
214  else if (isBoxIProd(box, t1, t2, t3)) fout << "prod(" << boxpp(t1) << ", " << boxpp(t2) << ") {" << boxpp(t3) << "}";
215 
216  else if (isBoxInputs(box, t1)) fout << "inputs(" << boxpp(t1) << ")";
217  else if (isBoxOutputs(box, t1)) fout << "outputs(" << boxpp(t1) << ")";
218 
219  // user interface
220  else if (isBoxButton(box, label)) fout << "button(" << tree2quotedstr(label) << ')';
221  else if (isBoxCheckbox(box, label)) fout << "checkbox(" << tree2quotedstr(label) << ')';
222  else if (isBoxVSlider(box, label, cur, min, max, step)) {
223  fout << "vslider("
224  << tree2quotedstr(label) << ", "
225  << boxpp(cur) << ", "
226  << boxpp(min) << ", "
227  << boxpp(max) << ", "
228  << boxpp(step)<< ')';
229  }
230  else if (isBoxHSlider(box, label, cur, min, max, step)) {
231  fout << "hslider("
232  << tree2quotedstr(label) << ", "
233  << boxpp(cur) << ", "
234  << boxpp(min) << ", "
235  << boxpp(max) << ", "
236  << boxpp(step)<< ')';
237  }
238  else if (isBoxVGroup(box, label, t1)) {
239  fout << "vgroup(" << tree2quotedstr(label) << ", " << boxpp(t1, 0) << ')';
240  }
241  else if (isBoxHGroup(box, label, t1)) {
242  fout << "hgroup(" << tree2quotedstr(label) << ", " << boxpp(t1, 0) << ')';
243  }
244  else if (isBoxTGroup(box, label, t1)) {
245  fout << "tgroup(" << tree2quotedstr(label) << ", " << boxpp(t1, 0) << ')';
246  }
247  else if (isBoxHBargraph(box, label, min, max)) {
248  fout << "hbargraph("
249  << tree2quotedstr(label) << ", "
250  << boxpp(min) << ", "
251  << boxpp(max) << ')';
252  }
253  else if (isBoxVBargraph(box, label, min, max)) {
254  fout << "vbargraph("
255  << tree2quotedstr(label) << ", "
256  << boxpp(min) << ", "
257  << boxpp(max) << ')';
258  }
259  else if (isBoxNumEntry(box, label, cur, min, max, step)) {
260  fout << "nentry("
261  << tree2quotedstr(label) << ", "
262  << boxpp(cur) << ", "
263  << boxpp(min) << ", "
264  << boxpp(max) << ", "
265  << boxpp(step)<< ')';
266  }
267  else if (isNil(box)) {
268  fout << "()" ;
269  }
270  else if (isList(box)) {
271 
272  Tree l = box;
273  char sep = '(';
274 
275  do {
276  fout << sep << boxpp(hd(l));
277  sep = ',';
278  l = tl(l);
279  } while (isList(l));
280 
281  fout << ')';
282 
283  } else if (isBoxWaveform(box)) {
284 
285  fout << "waveform";
286  char sep = '{';
287  for (size_t i=0; i<box->arity(); i++) {
288  fout << sep << boxpp(box->branch(i));
289  sep = ',';
290  }
291  fout << '}';
292 
293  /*
294  size_t n = box->arity();
295 
296  if (n < 6) {
297  // small waveform, print all data
298  fout << "waveform";
299  char sep = '{';
300  for (size_t i=0; i<n; i++) {
301  fout << sep << boxpp(box->branch(i));
302  sep = ',';
303  }
304  fout << '}';
305  } else {
306  // large waveform print only first and last values
307  fout << "waveform{" << box->branch(0) << ", ..<" << n-2 << ">..," << box->branch(n-1) << "}";
308  }
309  */
310 
311  } else if (isBoxEnvironment(box)) {
312  fout << "environment";
313 
314  } else if (isClosure(box, abstr, genv, vis, lenv)) {
315  fout << "closure[" << boxpp(abstr)
316  << ", genv = " << envpp(genv)
317  << ", lenv = " << envpp(lenv)
318  << "]";
319  }
320  else if (isBoxComponent(box, label)) {
321  fout << "component("
322  << tree2quotedstr(label) << ')';
323  }
324  else if (isBoxAccess(box, t1, t2)) {
325  fout << boxpp(t1) << '.' << boxpp(t2);
326  }
327  else if (isImportFile(box, label)) {
328  fout << "import("
329  << tree2quotedstr(label) << ')';
330  }
331  else if (isBoxSlot(box, &id)) {
332  //fout << "#" << id;
333  fout << "x" << id;
334  }
335  else if (isBoxSymbolic(box, slot, body)) {
336  fout << "\\(" << boxpp(slot) << ").(" << boxpp(body) << ")";
337  }
338 
339  // Pattern Matching Extensions
340  else if (isBoxCase(box, rules)) {
341  fout << "case {";
342  while (!isNil(rules)) {
343  printRule(fout, hd(rules));
344  rules = tl(rules);
345  }
346  fout << "}";
347  }
348 #if 1
349  // more useful for debugging output
350  else if (isBoxPatternVar(box, ident)) {
351  fout << "<" << boxpp(ident) << ">";
352  }
353 #else
354  // beautify messages involving lhs patterns
355  else if (isBoxPatternVar(box, ident)) {
356  fout << boxpp(ident);
357  }
358 #endif
359 
360  else if (isBoxPatternMatcher(box)) {
361  fout << "PM[" << box << "]";
362  }
363 
364  else if (isBoxError(box)) {
365  fout << "ERROR";
366  }
367 
368  //else if (isImportFile(box, filename)) {
369  // printf("filename %s\n", tree2str(filename));
370  // fout << tree2quotedstr(filename);
371  //}
372 
373  // None of the previous tests succeded, then it is not a valid box
374  else {
375  cerr << "Error in box::print() : " << *box << " is not a valid box" << endl;
376  exit(1);
377  }
378 
379  return fout;
380 }
381 
382 /*****************************************************************************
383  affichage d'un environnement
384 *****************************************************************************/
385 
386 ostream& envpp::print (ostream& fout) const
387 {
388  const char* sep = "";
389  Tree l = fEnv;
390 
391  fout << '{';
392  while (isList(l)) {
393  fout << sep << boxpp(hd(hd(l))) << "=" << boxpp(tl(hd(l)));
394  sep = ", ";
395  l = tl(l);
396  }
397  fout << '}';
398  return fout;
399 }
400 
bool isBoxPrim1(Tree s)
Definition: boxes.cpp:315
bool isBoxPrim5(Tree s)
Definition: boxes.cpp:335
Tree(* prim2)(Tree x, Tree y)
Definition: boxes.hh:210
Tree sigIntCast(Tree t)
Definition: signals.cpp:159
bool isBoxIPar(Tree t, Tree &x, Tree &y, Tree &z)
Definition: boxes.cpp:169
Tree sigAND(Tree x, Tree y)
Definition: signals.hh:158
bool isBoxWire(Tree t)
Definition: boxes.cpp:109
bool isImportFile(Tree s, Tree &filename)
Definition: boxes.cpp:301
Tree box
Definition: ppbox.hh:62
const char * prim3name(CTree *(*ptr)(CTree *, CTree *, CTree *))
Definition: ppbox.cpp:76
bool isBoxSeq(Tree t, Tree &x, Tree &y)
Definition: boxes.cpp:136
bool isBoxWithLocalDef(Tree t, Tree &body, Tree &ldef)
Definition: boxes.cpp:265
bool isBoxInt(Tree t)
Definition: boxes.cpp:78
const char * prim2name(CTree *(*ptr)(CTree *, CTree *))
Definition: ppbox.cpp:47
bool isBoxIdent(Tree t)
Definition: boxes.cpp:58
bool isBoxOutputs(Tree t, Tree &x)
Definition: boxes.cpp:186
Tree left(Tree t)
Definition: list.hh:170
bool isBoxIProd(Tree t, Tree &x, Tree &y, Tree &z)
Definition: boxes.cpp:172
bool isBoxPatternMatcher(Tree s)
Definition: boxes.cpp:630
Tree sigEQ(Tree x, Tree y)
Definition: signals.hh:169
int tree2int(Tree t)
if t has a node of type int, return it otherwise error
Definition: tree.cpp:230
bool isBoxSplit(Tree t, Tree &x, Tree &y)
Definition: boxes.cpp:148
Tree sigXOR(Tree x, Tree y)
Definition: signals.hh:160
Tree sigGT(Tree x, Tree y)
Definition: signals.hh:165
ostream & print(ostream &fout) const
Definition: ppbox.cpp:386
bool isBoxComponent(Tree s, Tree &filename)
Definition: boxes.cpp:290
Tree sigGE(Tree x, Tree y)
Definition: signals.hh:167
Tree(* prim4)(Tree w, Tree x, Tree y, Tree z)
Definition: boxes.hh:212
Tree sigSelect2(Tree selector, Tree s1, Tree s2)
Definition: signals.cpp:115
bool isBoxFFun(Tree s)
Definition: boxes.cpp:344
A CTree = (Node x [CTree]) is a Node associated with a list of subtrees called branches.
Definition: tree.hh:109
bool isBoxCut(Tree t)
Definition: boxes.cpp:105
Tree sigWriteReadTable(Tree n, Tree init, Tree widx, Tree wsig, Tree ridx)
Definition: signals.hh:99
int ffarity(Tree t)
Definition: prim2.cpp:67
bool isBoxAppl(Tree t)
Definition: boxes.cpp:203
Tree sigPrefix(Tree t0, Tree t1)
Definition: signals.cpp:65
Tree hd(Tree l)
Definition: list.hh:133
int gFloatSize
Definition: main.cpp:153
bool isBoxAccess(Tree t, Tree &exp, Tree &id)
Definition: boxes.cpp:256
bool isBoxPrim0(Tree s)
Definition: boxes.cpp:310
const char * name()
Definition: xtended.hh:25
bool isBoxPrim4(Tree s)
Definition: boxes.cpp:330
bool isBoxHGroup(Tree s)
Definition: boxes.cpp:437
bool isBoxHBargraph(Tree s)
Definition: boxes.cpp:455
Tree right(Tree t)
Definition: list.hh:171
bool isBoxRec(Tree t, Tree &x, Tree &y)
Definition: boxes.cpp:144
double max(double x, double y)
Definition: interval.hh:60
int priority
Definition: ppbox.hh:63
Tree ffsignature(Tree ff)
Definition: prim2.cpp:40
bool isBoxAbstr(Tree t)
Definition: boxes.cpp:202
Tree(* prim3)(Tree x, Tree y, Tree z)
Definition: boxes.hh:211
bool isNil(Tree l)
Definition: list.hh:137
Tree(* prim5)(Tree v, Tree w, Tree x, Tree y, Tree z)
Definition: boxes.hh:213
const char * ffincfile(Tree ff)
Definition: prim2.cpp:45
static string type2str(int type)
Definition: ppbox.cpp:126
bool isBoxSymbolic(Tree t)
Definition: boxes.cpp:126
Tree sigSub(Tree x, Tree y)
Definition: signals.hh:153
bool isBoxTGroup(Tree s)
Definition: boxes.cpp:449
bool isBoxISum(Tree t, Tree &x, Tree &y, Tree &z)
Definition: boxes.cpp:171
bool isBoxEnvironment(Tree s)
Definition: boxes.cpp:285
Tree sigLeftShift(Tree x, Tree y)
Definition: signals.hh:162
int ffrestype(Tree t)
Definition: prim2.cpp:55
bool isBoxButton(Tree s)
Definition: boxes.cpp:366
bool isBoxReal(Tree t)
Definition: boxes.cpp:79
Tree sigRightShift(Tree x, Tree y)
Definition: signals.hh:163
bool isBoxCase(Tree s)
Definition: boxes.cpp:617
Tree(* prim1)(Tree x)
Definition: boxes.hh:209
static string tree2quotedstr(Tree t)
Definition: ppbox.cpp:121
bool isList(Tree l)
Definition: list.hh:138
bool isBoxPar(Tree t, Tree &x, Tree &y)
Definition: boxes.cpp:140
bool isBoxHSlider(Tree s)
Definition: boxes.cpp:379
string T(char *c)
Definition: Text.cpp:158
Tree sigNE(Tree x, Tree y)
Definition: signals.hh:170
static void printRule(ostream &fout, Tree rule)
Definition: ppbox.cpp:103
bool isBoxVBargraph(Tree s)
Definition: boxes.cpp:461
bool isBoxWaveform(Tree s)
Definition: boxes.cpp:97
bool isClosure(Tree t, Tree &abstr, Tree &genv, Tree &vis, Tree &lenv)
Definition: boxes.cpp:239
Tree sigAdd(Tree x, Tree y)
Definition: signals.hh:152
Tree sigAttach(Tree t0, Tree t1)
Definition: signals.cpp:290
bool isBoxCheckbox(Tree s)
Definition: boxes.cpp:372
virtual ostream & print(ostream &fout) const
Definition: ppbox.cpp:144
boxpp(Tree b, int p=0)
Definition: ppbox.hh:65
static void streambinop(ostream &fout, Tree t1, const char *op, Tree t2, int curPriority, int upPriority)
Definition: ppbox.cpp:96
bool isBoxVGroup(Tree s)
Definition: boxes.cpp:443
Tree sigLE(Tree x, Tree y)
Definition: signals.hh:168
Tree sigFloatCast(Tree t)
Definition: signals.cpp:170
Tree sigFixDelay(Tree t0, Tree t1)
Definition: signals.cpp:61
int arity() const
return the number of branches (subtrees) of a tree
Definition: tree.hh:144
Tree sigLT(Tree x, Tree y)
Definition: signals.hh:166
bool isBoxFVar(Tree s)
Definition: boxes.cpp:356
const char * name(Symbol *sym)
Returns the name of a symbol.
Definition: symbol.hh:98
Tree sigRem(Tree x, Tree y)
Definition: signals.hh:156
bool isBoxVSlider(Tree s)
Definition: boxes.cpp:399
const char * fflibfile(Tree ff)
Definition: prim2.cpp:50
Definition: ppbox.hh:58
bool isBoxNumEntry(Tree s)
Definition: boxes.cpp:418
bool isBoxSlot(Tree t)
Definition: boxes.cpp:119
bool isBoxInputs(Tree t, Tree &x)
Definition: boxes.cpp:185
void * getUserData(Symbol *sym)
Returns user data.
Definition: symbol.hh:100
bool isBoxPrim3(Tree s)
Definition: boxes.cpp:325
bool isBoxISeq(Tree t, Tree &x, Tree &y, Tree &z)
Definition: boxes.cpp:170
bool isBoxPatternVar(Tree s, Tree &id)
Definition: boxes.cpp:622
Tree sigMul(Tree x, Tree y)
Definition: signals.hh:154
int ffargtype(Tree t, int i)
Definition: prim2.cpp:72
Tree sigSelect3(Tree selector, Tree s1, Tree s2, Tree s3)
Definition: signals.cpp:118
Tree sigOR(Tree x, Tree y)
Definition: signals.hh:159
const char * prim5name(CTree *(*ptr)(CTree *, CTree *, CTree *, CTree *, CTree *))
Definition: ppbox.cpp:89
Definition: ppbox.hh:75
bool isBoxError(Tree t)
Definition: boxes.cpp:249
const char * prim1name(CTree *(*ptr)(CTree *))
Definition: ppbox.cpp:39
bool isBoxMerge(Tree t, Tree &x, Tree &y)
Definition: boxes.cpp:152
bool isBoxFConst(Tree s)
Definition: boxes.cpp:350
Tree sigReadOnlyTable(Tree n, Tree init, Tree ridx)
Definition: signals.hh:104
double min(double x, double y)
Definition: interval.hh:59
bool isBoxPrim2(Tree s)
Definition: boxes.cpp:320
Tree sigDiv(Tree x, Tree y)
Definition: signals.hh:155
const char * prim0name(CTree *(*ptr)())
Definition: ppbox.cpp:34
Tree tl(Tree l)
Definition: list.hh:134
const char * tree2str(Tree t)
if t has a node of type symbol, return its name otherwise error
Definition: tree.cpp:278
Tree fEnv
Definition: ppbox.hh:77
Tree branch(int i) const
return the ith branch (subtree) of a tree
Definition: tree.hh:145
Tree nth(Tree l, int i)
Definition: list.cpp:182
const char * prim4name(CTree *(*ptr)(CTree *, CTree *, CTree *, CTree *))
Definition: ppbox.cpp:83
Tree(* prim0)()
Definition: boxes.hh:208
Tree sigDelay1(Tree t0)
Definition: signals.cpp:57