anchor.diff:  
       String peek() => index + 1 < textLength ? text[index + 1] : "EOF";
   
  +    breakWhile() { throw new BreakException(); }
  +    whileChars(fn(), [endFn()]) {
  +      while (index < textLength) {
  +        ch = text[index];
  +        int lastIndex = index;
  +	      try {
  +          fn();
  +	      } on BreakException catch(e) {
  +	        endFn = null;
  +          break;
  +	      }
  +        if (lastIndex == index) {
  +	        throw "while chars loop must advance at index $index";
  +	      }
  +      }
  +      if (endFn != null) { endFn(); }
  +    }
  +
       readNumber() {
         String number = "";
         int start = index;
  -      while (index < textLength) {
  -        ch = text[index];
  +      whileChars(() {
           if (ch == '.' || isNumber()) {
             number += ch;
           } else {
  
positive.code:           throw "Unexpected next character $index $ch";
          }
        }
        if (index == lastIndex) {
          throw "Lex loop must advance: $index";
        }
      }
  
      while (index < textLength) {
        try {
          oneLexLoop();
        } catch (e, s) {
          throw "index: $index $e\nORIG STACK:\n" + s.toString();
        }
  
      }
      return tokens;
  
    }
  
  
  
  }
negative.code:     return (a == null ? 0 : a) - (b == null ? 0 : b);
    }
  };
  
  class BreakException {}
  
  class Parser {
  
  