* Inherited attributes in recursive attribute sets are in scope of the
non-inherited attributes.
This commit is contained in:
		
							parent
							
								
									76c0e85929
								
							
						
					
					
						commit
						fbc48a469c
					
				
					 2 changed files with 18 additions and 10 deletions
				
			
		|  | @ -100,22 +100,25 @@ static Expr substArgs(Expr body, ATermList formals, Expr arg) | |||
| ATerm expandRec(ATerm e, ATermList rbnds, ATermList nrbnds) | ||||
| { | ||||
|     ATMatcher m; | ||||
|     ATerm name; | ||||
|     Expr e2; | ||||
| 
 | ||||
|     /* Create the substitution list. */ | ||||
|     ATermMap subs; | ||||
|     for (ATermIterator i(rbnds); i; ++i) { | ||||
|         ATerm name; | ||||
|         Expr e2; | ||||
|         if (!(atMatch(m, *i) >> "Bind" >> name >> e2)) | ||||
|             abort(); /* can't happen */ | ||||
|         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. */ | ||||
|     ATermMap as; | ||||
|     for (ATermIterator i(rbnds); i; ++i) { | ||||
|         ATerm name; | ||||
|         Expr e2; | ||||
|         if (!(atMatch(m, *i) >> "Bind" >> name >> e2)) | ||||
|             abort(); /* can't happen */ | ||||
|         as.set(name, substitute(subs, e2)); | ||||
|  | @ -123,8 +126,6 @@ ATerm expandRec(ATerm e, ATermList rbnds, ATermList nrbnds) | |||
| 
 | ||||
|     /* Copy the non-recursive bindings.  !!! inefficient */ | ||||
|     for (ATermIterator i(nrbnds); i; ++i) { | ||||
|         ATerm name; | ||||
|         Expr e2; | ||||
|         if (!(atMatch(m, *i) >> "Bind" >> name >> e2)) | ||||
|             abort(); /* can't happen */ | ||||
|         as.set(name, e2); | ||||
|  |  | |||
|  | @ -205,8 +205,11 @@ Expr substitute(const ATermMap & subs, Expr e) | |||
|         for (ATermIterator i(rbnds); i; ++i) | ||||
|             if (atMatch(m, *i) >> "Bind" >> name) | ||||
|                 subs2.remove(name); | ||||
|             else | ||||
|                 abort(); /* can't happen */ | ||||
|             else 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>)", | ||||
|             substitute(subs2, (ATerm) rbnds), | ||||
|             substitute(subs, (ATerm) nrbnds)); | ||||
|  | @ -264,14 +267,18 @@ void checkVarDefs(const ATermMap & defs, Expr e) | |||
|     } | ||||
|          | ||||
|     else if (atMatch(m, e) >> "Rec" >> rbnds >> nrbnds) { | ||||
|         checkVarDefs(defs | ||||
|             , (ATerm) nrbnds); | ||||
|         checkVarDefs(defs, (ATerm) nrbnds); | ||||
|         ATermMap defs2(defs); | ||||
|         for (ATermIterator i(rbnds); i; ++i) { | ||||
|             if (!(atMatch(m, *i) >> "Bind" >> name)) | ||||
|                 abort(); /* can't happen */ | ||||
|             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); | ||||
|     } | ||||
|      | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue