forked from lix-project/lix
34 lines
772 B
C++
34 lines
772 B
C++
|
#include "fix-expr.hh"
|
||
|
#include "expr.hh"
|
||
|
|
||
|
|
||
|
ATerm bottomupRewrite(TermFun & f, ATerm e)
|
||
|
{
|
||
|
e = f(e);
|
||
|
|
||
|
if (ATgetType(e) == AT_APPL) {
|
||
|
AFun fun = ATgetAFun(e);
|
||
|
int arity = ATgetArity(fun);
|
||
|
ATermList args = ATempty;
|
||
|
|
||
|
for (int i = arity - 1; i >= 0; i--)
|
||
|
args = ATinsert(args, bottomupRewrite(f, ATgetArgument(e, i)));
|
||
|
|
||
|
return (ATerm) ATmakeApplList(fun, args);
|
||
|
}
|
||
|
|
||
|
if (ATgetType(e) == AT_LIST) {
|
||
|
ATermList in = (ATermList) e;
|
||
|
ATermList out = ATempty;
|
||
|
|
||
|
while (!ATisEmpty(in)) {
|
||
|
out = ATinsert(out, bottomupRewrite(f, ATgetFirst(in)));
|
||
|
in = ATgetNext(in);
|
||
|
}
|
||
|
|
||
|
return (ATerm) ATreverse(out);
|
||
|
}
|
||
|
|
||
|
throw badTerm("cannot rewrite", e);
|
||
|
}
|