* Added an operator `?' to test for attribute existence, e.g.,
`attrs ? x' yields true iff `attrs' has an attribute named `x'.
This commit is contained in:
		
							parent
							
								
									f958bcdf1f
								
							
						
					
					
						commit
						ac4d39f9db
					
				
					 2 changed files with 10 additions and 1 deletions
				
			
		|  | @ -288,10 +288,17 @@ Expr evalExpr2(EvalState & state, Expr e) | |||
|     if (atMatch(m, e) >> "OpOr" >> e1 >> e2) | ||||
|         return makeBool(evalBool(state, e1) || evalBool(state, e2)); | ||||
| 
 | ||||
|     /* Attribut set update (//). */ | ||||
|     /* Attribute set update (//). */ | ||||
|     if (atMatch(m, e) >> "OpUpdate" >> e1 >> e2) | ||||
|         return updateAttrs(evalExpr(state, e1), evalExpr(state, e2)); | ||||
| 
 | ||||
|     /* Attribute existence test (?). */ | ||||
|     if (atMatch(m, e) >> "OpHasAttr" >> e1 >> name) { | ||||
|         ATermMap attrs; | ||||
|         queryAllAttrs(evalExpr(state, e1), attrs); | ||||
|         return makeBool(attrs.get(name) != 0); | ||||
|     } | ||||
| 
 | ||||
|     /* Barf. */ | ||||
|     throw badTerm("invalid expression", e); | ||||
| } | ||||
|  |  | |||
|  | @ -44,6 +44,7 @@ void yyerror(YYLTYPE * loc, yyscan_t scanner, void * data, char * s) | |||
| %nonassoc EQ NEQ | ||||
| %right UPDATE | ||||
| %left NEG | ||||
| %nonassoc '?' | ||||
| %nonassoc '~' | ||||
| 
 | ||||
| %% | ||||
|  | @ -81,6 +82,7 @@ expr_op | |||
|   | expr_op IMPL expr_op { $$ = ATmake("OpImpl(<term>, <term>)", $1, $3); } | ||||
|   | expr_op UPDATE expr_op { $$ = ATmake("OpUpdate(<term>, <term>)", $1, $3); } | ||||
|   | expr_op '~' expr_op { $$ = ATmake("SubPath(<term>, <term>)", $1, $3); } | ||||
|   | expr_op '?' ID { $$ = ATmake("OpHasAttr(<term>, <term>)", $1, $3); } | ||||
|   | expr_app | ||||
|   ; | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue