anchor.diff:     case Node^.NodeType of
       ntALT:begin
        if assigned(Node^.Left) then begin
  -      if Node^.Left^.NodeType in [ntCAT] then begin
  -       result:=result+'(?:'+ProcessNode(Node^.Left)+')';
  +      if NodePrecedences[Node^.Left^.NodeType]>NodePrecedences[Node^.NodeType] then begin
  +       result:=result+'(?:'+ProcessNode(Node^.Left,NodePrecedences[Node^.NodeType])+')';
         end else begin
  -       result:=result+ProcessNode(Node^.Left);
  +       result:=result+ProcessNode(Node^.Left,NodePrecedences[Node^.NodeType]);
         end;
        end;
        result:=result+'|';
        if assigned(Node^.Right) then begin
  -      if Node^.Right^.NodeType in [ntCAT] then begin
  -       result:=result+'(?:'+ProcessNode(Node^.Right)+')';
  +      if NodePrecedences[Node^.Right^.NodeType]>NodePrecedences[Node^.NodeType] then begin
  +       result:=result+'(?:'+ProcessNode(Node^.Right,NodePrecedences[Node^.NodeType])+')';
         end else begin
  -       result:=result+ProcessNode(Node^.Right);
  +       result:=result+ProcessNode(Node^.Right,NodePrecedences[Node^.NodeType]);
         end;
        end;
       end;
       ntCAT:begin
        if assigned(Node^.Left) then begin
  -      if Node^.Left^.NodeType in [ntALT] then begin
  -       result:=result+'(?:'+ProcessNode(Node^.Left)+')';
  +      if NodePrecedences[Node^.Left^.NodeType]>NodePrecedences[Node^.NodeType] then begin
  +       result:=result+'(?:'+ProcessNode(Node^.Left,NodePrecedences[Node^.NodeType])+')';
         end else begin
  -       result:=result+ProcessNode(Node^.Left);
  +       result:=result+ProcessNode(Node^.Left,NodePrecedences[Node^.NodeType]);
         end;
        end;
        if assigned(Node^.Right) then begin
  -      if Node^.Right^.NodeType in [ntALT] then begin
  -       result:=result+'(?:'+ProcessNode(Node^.Right)+')';
  +      if NodePrecedences[Node^.Right^.NodeType]>NodePrecedences[Node^.NodeType] then begin
  +       result:=result+'(?:'+ProcessNode(Node^.Right,NodePrecedences[Node^.NodeType])+')';
         end else begin
  -       result:=result+ProcessNode(Node^.Right);
  +       result:=result+ProcessNode(Node^.Right,NodePrecedences[Node^.NodeType]);
         end;
        end;
       end;
  
positive.code: {$endif}
       if assigned(Node) and ((Argument<>0) or (NodeStack.IndexOf(Node)<0)) then begin
        case Node^.NodeType of
         ntNOP:begin
         end;
         ntALT:begin
          case Argument of
           0:begin
  
negative.code: 
        ucACCEPT=0;
        ucERROR=16;
  
        // Node precedences
        npAtom=0;
        npUnary=1;
        npConcat=2;
        npAlternate=3;
        npZeroWidth=4;
        npParen=5;
        npMultiMatch=6;
        npTopLevel=7;
  
        NodePrecedences:array[ntALT..ntBACKREFERENCEIGNORECASE] of longint=(
         npAlternate,   // ntALT=0;
         npConcat,      // ntCAT=1;
         npAtom,        // ntCHAR=2;
         npParen,       // ntPAREN=3;
         npUnary,       // ntQUEST=4;
         npUnary,       // ntSTAR=5;
         npUnary,       // ntPLUS=6;
         npMultiMatch,  // ntMULTIMATCH=7;
         npZeroWidth,   // ntZEROWIDTH=8;
         npZeroWidth,   // ntLOOKBEHINDNEGATIVE=9;
         npZeroWidth,   // ntLOOKBEHINDPOSITIVE=10;
         npZeroWidth,   // ntLOOKAHEADNEGATIVE=11;
         npZeroWidth,   // ntLOOKAHEADPOSITIVE=12;
         npZeroWidth,   // ntBACKREFERENCE=13;
         npZeroWidth);  // ntBACKREFERENCEIGNORECASE=14;
  
        FLREInitialized:longbool=false;
  
  