* Inherited attributes in recursive attribute sets are in scope of the

non-inherited attributes.
This commit is contained in:
Eelco Dolstra 2004-02-16 09:18:35 +00:00
parent 76c0e85929
commit fbc48a469c
2 changed files with 18 additions and 10 deletions

View File

@ -100,22 +100,25 @@ static Expr substArgs(Expr body, ATermList formals, Expr arg)
ATerm expandRec(ATerm e, ATermList rbnds, ATermList nrbnds) ATerm expandRec(ATerm e, ATermList rbnds, ATermList nrbnds)
{ {
ATMatcher m; ATMatcher m;
ATerm name;
Expr e2;
/* Create the substitution list. */ /* Create the substitution list. */
ATermMap subs; ATermMap subs;
for (ATermIterator i(rbnds); i; ++i) { for (ATermIterator i(rbnds); i; ++i) {
ATerm name;
Expr e2;
if (!(atMatch(m, *i) >> "Bind" >> name >> e2)) if (!(atMatch(m, *i) >> "Bind" >> name >> e2))
abort(); /* can't happen */ abort(); /* can't happen */
subs.set(name, ATmake("Select(<term>, <term>)", e, name)); subs.set(name, ATmake("Select(<term>, <term>)", e, name));
} }
for (ATermIterator i(nrbnds); i; ++i) {
if (!(atMatch(m, *i) >> "Bind" >> name >> e2))
abort(); /* can't happen */
subs.set(name, e2);
}
/* Create the non-recursive set. */ /* Create the non-recursive set. */
ATermMap as; ATermMap as;
for (ATermIterator i(rbnds); i; ++i) { for (ATermIterator i(rbnds); i; ++i) {
ATerm name;
Expr e2;
if (!(atMatch(m, *i) >> "Bind" >> name >> e2)) if (!(atMatch(m, *i) >> "Bind" >> name >> e2))
abort(); /* can't happen */ abort(); /* can't happen */
as.set(name, substitute(subs, e2)); as.set(name, substitute(subs, e2));
@ -123,8 +126,6 @@ ATerm expandRec(ATerm e, ATermList rbnds, ATermList nrbnds)
/* Copy the non-recursive bindings. !!! inefficient */ /* Copy the non-recursive bindings. !!! inefficient */
for (ATermIterator i(nrbnds); i; ++i) { for (ATermIterator i(nrbnds); i; ++i) {
ATerm name;
Expr e2;
if (!(atMatch(m, *i) >> "Bind" >> name >> e2)) if (!(atMatch(m, *i) >> "Bind" >> name >> e2))
abort(); /* can't happen */ abort(); /* can't happen */
as.set(name, e2); as.set(name, e2);

View File

@ -205,8 +205,11 @@ Expr substitute(const ATermMap & subs, Expr e)
for (ATermIterator i(rbnds); i; ++i) for (ATermIterator i(rbnds); i; ++i)
if (atMatch(m, *i) >> "Bind" >> name) if (atMatch(m, *i) >> "Bind" >> name)
subs2.remove(name); subs2.remove(name);
else else abort(); /* can't happen */
abort(); /* can't happen */ for (ATermIterator i(nrbnds); i; ++i)
if (atMatch(m, *i) >> "Bind" >> name)
subs2.remove(name);
else abort(); /* can't happen */
return ATmake("Rec(<term>, <term>)", return ATmake("Rec(<term>, <term>)",
substitute(subs2, (ATerm) rbnds), substitute(subs2, (ATerm) rbnds),
substitute(subs, (ATerm) nrbnds)); substitute(subs, (ATerm) nrbnds));
@ -264,14 +267,18 @@ void checkVarDefs(const ATermMap & defs, Expr e)
} }
else if (atMatch(m, e) >> "Rec" >> rbnds >> nrbnds) { else if (atMatch(m, e) >> "Rec" >> rbnds >> nrbnds) {
checkVarDefs(defs checkVarDefs(defs, (ATerm) nrbnds);
, (ATerm) nrbnds);
ATermMap defs2(defs); ATermMap defs2(defs);
for (ATermIterator i(rbnds); i; ++i) { for (ATermIterator i(rbnds); i; ++i) {
if (!(atMatch(m, *i) >> "Bind" >> name)) if (!(atMatch(m, *i) >> "Bind" >> name))
abort(); /* can't happen */ abort(); /* can't happen */
defs2.set(name, (ATerm) ATempty); defs2.set(name, (ATerm) ATempty);
} }
for (ATermIterator i(nrbnds); i; ++i) {
if (!(atMatch(m, *i) >> "Bind" >> name))
abort(); /* can't happen */
defs2.set(name, (ATerm) ATempty);
}
checkVarDefs(defs2, (ATerm) rbnds); checkVarDefs(defs2, (ATerm) rbnds);
} }