abstract sclass PartialAttractor implements Runnable { VF1 action; LS tok; IntRange matchedRange; public abstract bool find(); // uses tok public void run { callF(action, this); } toString { ret standard_toString(this); } bool acceptFull() { matchedRange = intRange(0, l(tok)); true; } } // attracts everything sclass PDefaultAttractor > PartialAttractor { public bool find() { ret acceptFull(); } } // uses find3 sclass PFind3Attractor > PartialAttractor { S pattern; *(S *pattern) {} public bool find() { matchedRange = find2_range(pattern, tok); ret matchedRange != null; } } // uses jfind (case-insensitive) sclass PJFindAttractor > PartialAttractor { S pattern; S[] tokens; *(S *pattern) {} public bool find() if (tokens == null) tokens = javaTokForJFind_array(pattern); int i = findCodeTokens(tok, true, tokens); if (i < 0) false; matchedRange = intRange(i, i+l(tokens)*2-1); true; } }