* 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) | string evalString(EvalState & state, Expr e) | ||||||
| { | { | ||||||
|     e = evalExpr(state, e); |     e = evalExpr(state, e); | ||||||
|  | @ -264,6 +276,10 @@ Expr evalExpr2(EvalState & state, Expr e) | ||||||
|     if (atMatch(m, e) >> "OpOr" >> e1 >> e2) |     if (atMatch(m, e) >> "OpOr" >> e1 >> e2) | ||||||
|         return makeBool(evalBool(state, e1) || evalBool(state, 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. */ |     /* Barf. */ | ||||||
|     throw badTerm("invalid expression", e); |     throw badTerm("invalid expression", e); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -57,6 +57,7 @@ inherit     { return INHERIT; } | ||||||
| \&\&        { return AND; } | \&\&        { return AND; } | ||||||
| \|\|        { return OR; } | \|\|        { return OR; } | ||||||
| \-\>        { return IMPL; } | \-\>        { return IMPL; } | ||||||
|  | \/\/        { return UPDATE; } | ||||||
| 
 | 
 | ||||||
| {ID}        { yylval->t = ATmake("<str>", yytext); return ID; /* !!! alloc */ } | {ID}        { yylval->t = ATmake("<str>", yytext); return ID; /* !!! alloc */ } | ||||||
| {INT}       { int n = atoi(yytext); /* !!! overflow */ | {INT}       { int n = atoi(yytext); /* !!! overflow */ | ||||||
|  |  | ||||||
|  | @ -42,6 +42,7 @@ void yyerror(YYLTYPE * loc, yyscan_t scanner, void * data, char * s) | ||||||
| %left OR | %left OR | ||||||
| %left AND | %left AND | ||||||
| %nonassoc EQ NEQ | %nonassoc EQ NEQ | ||||||
|  | %right UPDATE | ||||||
| %left NEG | %left NEG | ||||||
| 
 | 
 | ||||||
| %% | %% | ||||||
|  | @ -69,6 +70,7 @@ expr_op | ||||||
|   | expr_op AND expr_op { $$ = ATmake("OpAnd(<term>, <term>)", $1, $3); } |   | expr_op AND expr_op { $$ = ATmake("OpAnd(<term>, <term>)", $1, $3); } | ||||||
|   | expr_op OR expr_op { $$ = ATmake("OpOr(<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 IMPL expr_op { $$ = ATmake("OpImpl(<term>, <term>)", $1, $3); } | ||||||
|  |   | expr_op UPDATE expr_op { $$ = ATmake("OpUpdate(<term>, <term>)", $1, $3); } | ||||||
|   | expr_app |   | expr_app | ||||||
|   ; |   ; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue