anchor.diff:    else if (s = '(') then
     begin
       node.nodeType := xentGroup;
  -    node.group := TXPathExpressionNode.Create;
  -    s := readXpathExpression(node.Group, [')']);
  +    s := readXPathToken(true, true);
  +    if s <> ')' then
  +    begin
  +      node.group := TXPathExpressionNode.Create;
  +      s := readXpathExpression(node.Group, [')'], s);
  +    end;
       rule(s = ')', 'Expected ''('' at this point but found '+s);
     end
     else if (s = '/') then
  
positive.code:     property Group : TXPathExpressionNode read FGroup write SetGroup;
      property Params : TAdvList<TXPathExpressionNode> read GetParams;
      property value : String read FValue write FValue;
    end;
  
    TMXmlElementType = (ntElement, ntText, ntComment, ntDocument, ntAttribute, ntProcessingInstruction, ntDocumentDeclaration, ntCData);
  
  
negative.code:       result := result + ''''+tokens[0]+'''';
      result := result + ']';
    end;
  end;
  
  type
    TExpressionSyntaxMode = (esmNormal, esmForLoop, esmIfStmt);
  
  function TMXmlParser.readXpathExpression(node: TXPathExpressionNode; endTokens : Array of String; alreadyRead : String = '') : String;
  var
    p, f : TXPathExpressionNode;
    done, readNext : boolean;
    s : String;
    mode : TExpressionSyntaxMode;
  begin
    mode := esmNormal;
    readNext := true;
    if alreadyRead = '' then
      s := readXPathToken(true)
  