anchor.diff:  abstract class Ast {
     static int ctr = 0;
     String name = "f${ctr++}";
  +  int get minWidth;
  +  int get maxWidth;
   
     // Prints the dot-file (graphviz) output for each AST node.
     void dump() {
  
positive.code: abstract class BinaryAst extends Ast {
    BinaryAst(this.l, this.r);
    Ast l, r;
  
    void dump() {
      super.dump();
  
negative.code:     l.gen(state, r.name);
      r.gen(state, succ);
    }
    bool isAnchored() {
      if (l.maxWidth == 0) return l.isAnchored() || r.isAnchored();
      return l.isAnchored();
    }
    int get minWidth {
      if (minWidthIsCalculated) return minWidthCached;
      minWidthIsCalculated = true;
      return minWidthCached = l.minWidth + r.minWidth;
    }
    int get maxWidth {
      if (maxWidthIsCalculated) return maxWidthCached;
      maxWidthIsCalculated = true;
      int rw = r.maxWidth;
      if (rw == null) return null;
      int lw = l.maxWidth;
      if (lw == null) return null;
      return maxWidthCached = lw + rw;
    }
  }
  
  class EmptyAlternative extends Ast {
  