static CtxExpr ctxParseExpression(Explain exp) { if (exp.is("bracket")) ret ctxParseExpression(exp.sub(0)); if (exp.is("and")) ret new CtxAnd(ctxParseExpression(exp.sub(0)), ctxParseExpression(exp.sub(1))); if (exp.is("or")) ret new CtxOr(ctxParseExpression(exp.sub(0)), ctxParseExpression(exp.sub(1))); if (exp.is("neg")) ret new CtxNeg(ctxParseExpression(exp.sub(0)); if (exp.is("quoted")) ret new CtxRegexp(unquoteCtx(exp.tok().get(1))); if (exp.singleEqualChild()) ret ctxParseExpression(exp.sub(0)); throw todo(exp.className()); }