* Bottomup rewrite function.

This commit is contained in:
Eelco Dolstra 2003-10-30 16:11:24 +00:00
parent 442b09ea33
commit e537844f4e
2 changed files with 60 additions and 0 deletions

33
src/fix-ng/fix-expr.cc Normal file
View file

@ -0,0 +1,33 @@
#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);
}

27
src/fix-ng/fix-expr.hh Normal file
View file

@ -0,0 +1,27 @@
#ifndef __FIXEXPR_H
#define __FIXEXPR_H
#include <aterm2.h>
#include "util.hh"
/* Fix expressions are represented as ATerms. The maximal sharing
property of the ATerm library allows us to implement caching of
normals forms efficiently. */
typedef ATerm Expr;
/* Generic bottomup traversal over ATerms. The traversal first
recursively descends into subterms, and then applies the given term
function to the resulting term. */
struct TermFun
{
virtual ATerm operator () (ATerm e) = 0;
};
ATerm bottomupRewrite(TermFun & f, ATerm e);
#endif /* !__FIXEXPR_H */