mirror of
https://github.com/NixOS/nix.git
synced 2024-11-26 00:32:28 +00:00
* Bottomup rewrite function.
This commit is contained in:
parent
442b09ea33
commit
e537844f4e
33
src/fix-ng/fix-expr.cc
Normal file
33
src/fix-ng/fix-expr.cc
Normal 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
27
src/fix-ng/fix-expr.hh
Normal 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 */
|
Loading…
Reference in New Issue
Block a user