abstract sclass CtxExpr { // assumes that ctxContext() is set abstract bool get(); } CtxExpr > CtxNeg { CtxExpr e; *() {} *(CtxExpr *e) {} bool get() { ret !e.get(); } } CtxExpr > CtxAnd { CtxExpr a, b; *() {} *(CtxExpr *a, CtxExpr *b) {} bool get() { ret a.get() && b.get(); } } CtxExpr > CtxOr { CtxExpr a, b; *() {} *(CtxExpr *a, CtxExpr *b) {} bool get() { ret a.get() || b.get(); } } CtxExpr > CtxRegexp { S pattern; *() {} *(S *pattern) {} bool get() { ret ctxEvalPattern(pattern); } } CtxExpr > CtxComp { S var1, var2; *() {} *(S *var1, S *var2) {} bool get() { ret eq(ctxGetVar(var1), ctxGetVar(var2)); } } CtxExpr > CtxMatch { S var, pattern; *() {} *(S *var, S *pattern) {} bool get() { ret ctxEvalPattern(pattern), ctxGetVar(var)); } }