anchor.diff:      processPatterns patterns filenames []
   
   /// Prints the list of filename linenumber message and match string.
  -let printInfo (info : (string * int * Match * string * string) list) =
  -    let printMatchCollection (item : (string * int * Match * string * string)) =
  -        let (fileName, lineNumber, regexMatch, matchString, msg) = item
  -        printfn @"%s(%d): %s ""%s""" fileName lineNumber msg matchString 
  -    let rec printMatchInfoList (list : (string * int * Match * string * string) list) =
  +let printInfo (info : (string * int * int * Match * string * string) list) =
  +    let printMatchCollection (item : (string * int * int * Match * string * string)) =
  +        let (fileName, lineNumber, offset, regexMatch, matchString, msg) = item
  +        printfn @"%s(%d,%d): %s ""%s""" fileName lineNumber offset msg matchString 
  +    let rec printMatchInfoList (list : (string * int * int * Match * string * string) list) =
           match list with
           | hd :: tl -> 
               printMatchCollection hd
  
positive.code:     printMatchInfoList info
  
  /// Adds a message to the list if there is no @ before the string for a parse_term or parse_type.
  let atSignCondition (item : (string * int * Match)) acc : (string * int * Match * string * string) list =
      let (fileName, lineNumber, regexMatch) = item
      let atSignString = regexMatch.Groups.["atSign"].Value
      let atStringCondition = not (atSignString.Contains("@"))
      if atStringCondition 
      then 
          let parseString = regexMatch.Groups.["parseString"].Value
          let msg = "Missing @ before string."
          (fileName, lineNumber, regexMatch, parseString, msg) :: acc
      else acc
      
  /// Adds a message to the list if the substring occurs in the string for a parse_term or parse_type.
  let substringFoundCondtion (item : (string * int * Match)) (substring : string) acc : (string * int * Match * string * string) list =
      let (fileName, lineNumber, regexMatch) = item
      let parseString = regexMatch.Groups.["parseString"].Value
      let parseStringCondition = parseString.Contains(substring)
      if  parseStringCondition 
      then
          let msg = "String contains: " + substring
          (fileName, lineNumber, regexMatch, parseString, msg) :: acc
      else acc
      
  /// Adds a message to the list if "|>" occurs in the string for a parse_term or parse_type.
  let invalidTextCondition (item : (string * int * Match)) acc : (string * int * Match * string * string) list =
      substringFoundCondtion (item : (string * int * Match)) "|>" acc
  
  /// Adds a message to the list if linebreak occurs in the string for a parse_term or parse_type.
  let containsLinebreakCondition (item : (string * int * Match)) acc : (string * int * Match * string * string) list =
      let substring = "\n"
      let (fileName, lineNumber, regexMatch) = item
      let parseString = regexMatch.Groups.["parseString"].Value
      let parseStringCondition = parseString.Contains(substring)
      if  parseStringCondition 
      then
          let msg = "String contains line break: " + substring
          (fileName, lineNumber, regexMatch, parseString, msg) :: acc
      else acc
      
  /// Adds a message to the list if a parsing error occurs for a parse_term or parse_type.
  let parsingErrorCondition (item : (string * int * Match)) acc : (string * int * Match * string * string) list =
      let (fileName, lineNumber, regexMatch) = item
      let parseFunction = regexMatch.Groups.["parse_function"].Value
      let parseString = regexMatch.Groups.["parseString"].Value
      try
  
negative.code: // (?<parseString>[^""]*)        - the named group parseString which is any characters upto the next "
  // (?:\x22)                      - a ending " here as \x22
  
  //let test001 =
  ////    let path = @"E:\Projects\Visual Studio 2012\Github\Harrison\NHol\NHol"
  ////    let path = @"E:\Projects\Visual Studio 2012\Github\Harrison\NHol\NHol\bool.fs"
  ////    let path = ""
  ////    let path = @"theorems.fs"
  ////    let fileList = getFiles path
  //
  //    let parseTermPattern = @"(?<parse_function>parse_term)(?:[ ]?)(?<atSign>[@]?)(?:\x22)(?<parseString>[^""]*)(?:\x22)"
  //    let parseTypePattern = @"(?<parse_function>parse_type)(?:[ ]?)(?<atSign>[@]?)(?:\x22)(?<parseString>[^""]*)(?:\x22)"
  //    let patterns = [parseTermPattern; parseTypePattern]
  //
  ////    let conditions = [atSignCondition; invalidTextCondition; parsingErrorCondition; parsingSuccessCondition; containsLinebreakCondition]
  //    let conditions = [containsLinebreakCondition; parsingErrorCondition; parsingSuccessCondition]
  //
  //    printMessages projectFiles patterns conditions
  
  let test002 =
      let letWithoutArgsPattern = @"(?:let)(?:( )+)(?<functionName>[^ ]*)(?:( )+)(?:=)"
      let patterns = [letWithoutArgsPattern]
      let conditions = [holLightNameCondition]
  
      printMessages projectFiles patterns conditions