anchor.diff:   end;
   end;
   
  +function TFLRE.CopyNode(Node:PFLRENode):PFLRENode;
  +begin
  + if assigned(Node) then begin
  +  result:=NewNode(Node^.NodeType,nil,nil,nil,Node^.Value);
  +  result^.CharClass:=Node^.CharClass;
  +  result^.Group:=Node^.Group;
  +  result^.MinCount:=Node^.MinCount;
  +  result^.MaxCount:=Node^.MaxCount;
  +  result^.Name:=Node^.Name;
  +  if assigned(Node^.Left) then begin
  +   result^.Left:=CopyNode(Node^.Left);
  +  end;
  +  if assigned(Node^.Right) then begin
  +   result^.Right:=CopyNode(Node^.Right);
  +  end;
  +  if assigned(Node^.Extra) then begin
  +   result^.Extra:=CopyNode(Node^.Extra);
  +  end;
  + end else begin
  +  result:=nil;
  + end;
  +end;
  +
   function TFLRE.AreNodesEqual(NodeA,NodeB:PFLRENode):boolean;
   begin
    result:=(NodeA=NodeB) or
  
positive.code:   end;
   end;
   function ParseTerm:PFLRENode;
   var MinCount,MaxCount:longint;
   begin
    result:=nil;
    try
  
negative.code:   result^.NodeType:=ntSTAR;
   end else begin
    result:=NewNode(ntQUEST,Node,nil,nil,Kind);
   end;
  end;
  
  function TFLRE.NewExact(Node:PFLRENode;MinCount,MaxCount,Kind:longint):PFLRENode;
  var Counter:longint;
      OptionalNode:PFLRENode;
  begin
   if (MinCount>=0) and (MaxCount<0) then begin
    case MinCount of
     0:begin
      // x{0,} is x*
      result:=NewStar(StarDenull(Node),Kind);
     end;
     1:begin
      // x{1,} is x+
      result:=NewPlus(Node,Kind);
     end;
     else begin
      // x{2,} is xx+, x{3,} is xxx+, x{4,} is xxxx+ and so on...
      result:=Node;
      for Counter:=3 to MinCount do begin
       result:=Concat(result,CopyNode(Node));
      end;
      result:=Concat(result,NewPlus(CopyNode(Node),Kind));
     end;
    end;
   end else if (MinCount=0) and (MaxCount=0) then begin
    // x{0,0} is nothing
    result:=nil;
   end else if (MinCount=0) and (MaxCount=1) then begin
    // x{0,1} is x?
    result:=NewQuest(Node,Kind);
   end else if (MinCount=1) and (MaxCount=1) then begin
    // x{1,1} is just x
    result:=Node;
   end else if (MinCount>0) and (MinCount=MaxCount) then begin
    // x{n,m}, when where n equals to m, is n-multiple x
    result:=Node;
    for Counter:=2 to MaxCount do begin
     result:=Concat(result,CopyNode(Node));
    end;
   end else if (MinCount>=0) and (MinCount<MaxCount) then begin
    // x{n,m} is n-multiple x + m-multiple x?
    if MinCount=0 then begin
     result:=nil;
    end else begin
     result:=Node;
     for Counter:=2 to MinCount do begin
      result:=Concat(result,CopyNode(Node));
     end;
    end;
    if MaxCount>MinCount then begin
     OptionalNode:=NewQuest(CopyNode(Node),Kind);
     for Counter:=MinCount+2 to MaxCount do begin
      OptionalNode:=NewQuest(Concat(CopyNode(Node),OptionalNode),Kind);
     end;
     result:=Concat(result,OptionalNode);
    end;
   end else begin
    // Oops, this should never happen, so cases like min > max, or min < max < 0, but the parser rejects such cases.
    result:=Node;
    raise EFLRE.Create('Syntax error');
   end;
  end;
  
  