* An attribute set update operator (//). E.g.,
{x=1; y=2; z=3;} // {y=4;}  =>  {x=1; y=4; z=3;}
			
			
This commit is contained in:
		
							parent
							
								
									6d46e647ba
								
							
						
					
					
						commit
						9d25466b34
					
				
					 3 changed files with 19 additions and 0 deletions
				
			
		|  | @ -134,6 +134,18 @@ ATerm expandRec(ATerm e, ATermList rbnds, ATermList nrbnds) | |||
| } | ||||
| 
 | ||||
| 
 | ||||
| static Expr updateAttrs(Expr e1, Expr e2) | ||||
| { | ||||
|     /* Note: e1 and e2 should be in normal form. */ | ||||
| 
 | ||||
|     ATermMap attrs; | ||||
|     queryAllAttrs(e1, attrs); | ||||
|     queryAllAttrs(e2, attrs); | ||||
| 
 | ||||
|     return makeAttrs(attrs); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| string evalString(EvalState & state, Expr e) | ||||
| { | ||||
|     e = evalExpr(state, e); | ||||
|  | @ -264,6 +276,10 @@ Expr evalExpr2(EvalState & state, Expr e) | |||
|     if (atMatch(m, e) >> "OpOr" >> e1 >> e2) | ||||
|         return makeBool(evalBool(state, e1) || evalBool(state, e2)); | ||||
| 
 | ||||
|     /* Attribut set update (//). */ | ||||
|     if (atMatch(m, e) >> "OpUpdate" >> e1 >> e2) | ||||
|         return updateAttrs(evalExpr(state, e1), evalExpr(state, e2)); | ||||
| 
 | ||||
|     /* Barf. */ | ||||
|     throw badTerm("invalid expression", e); | ||||
| } | ||||
|  |  | |||
|  | @ -57,6 +57,7 @@ inherit     { return INHERIT; } | |||
| \&\&        { return AND; } | ||||
| \|\|        { return OR; } | ||||
| \-\>        { return IMPL; } | ||||
| \/\/        { return UPDATE; } | ||||
| 
 | ||||
| {ID}        { yylval->t = ATmake("<str>", yytext); return ID; /* !!! alloc */ } | ||||
| {INT}       { int n = atoi(yytext); /* !!! overflow */ | ||||
|  |  | |||
|  | @ -42,6 +42,7 @@ void yyerror(YYLTYPE * loc, yyscan_t scanner, void * data, char * s) | |||
| %left OR | ||||
| %left AND | ||||
| %nonassoc EQ NEQ | ||||
| %right UPDATE | ||||
| %left NEG | ||||
| 
 | ||||
| %% | ||||
|  | @ -69,6 +70,7 @@ expr_op | |||
|   | expr_op AND expr_op { $$ = ATmake("OpAnd(<term>, <term>)", $1, $3); } | ||||
|   | expr_op OR expr_op { $$ = ATmake("OpOr(<term>, <term>)", $1, $3); } | ||||
|   | expr_op IMPL expr_op { $$ = ATmake("OpImpl(<term>, <term>)", $1, $3); } | ||||
|   | expr_op UPDATE expr_op { $$ = ATmake("OpUpdate(<term>, <term>)", $1, $3); } | ||||
|   | expr_app | ||||
|   ; | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue