* 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) |     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 (//). */ |     /* Attribute set update (//). */ | ||||||
|     if (atMatch(m, e) >> "OpUpdate" >> e1 >> e2) |     if (atMatch(m, e) >> "OpUpdate" >> e1 >> e2) | ||||||
|         return updateAttrs(evalExpr(state, e1), evalExpr(state, 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. */ |     /* Barf. */ | ||||||
|     throw badTerm("invalid expression", e); |     throw badTerm("invalid expression", e); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -44,6 +44,7 @@ void yyerror(YYLTYPE * loc, yyscan_t scanner, void * data, char * s) | ||||||
| %nonassoc EQ NEQ | %nonassoc EQ NEQ | ||||||
| %right UPDATE | %right UPDATE | ||||||
| %left NEG | %left NEG | ||||||
|  | %nonassoc '?' | ||||||
| %nonassoc '~' | %nonassoc '~' | ||||||
| 
 | 
 | ||||||
| %% | %% | ||||||
|  | @ -81,6 +82,7 @@ expr_op | ||||||
|   | 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_op UPDATE expr_op { $$ = ATmake("OpUpdate(<term>, <term>)", $1, $3); } | ||||||
|   | expr_op '~' expr_op { $$ = ATmake("SubPath(<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 |   | expr_app | ||||||
|   ; |   ; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue