anchor.diff:          (* Or *)
           // Nested Or patterns should skew towards the left.
           | Or (r, Or (s, t)) ->
  -            return! simplify <| Or (Or (r, s), t)
  +            return! simplifyRec <| Or (Or (r, s), t)
           | Or (regex1, regex2) ->
               // Simplify the two sub-regexes first.
  -            let! regex1 = simplify regex1
  -            let! regex2 = simplify regex2
  +            let! regex1 = simplifyRec regex1
  +            let! regex2 = simplifyRec regex2
   
               match regex1, regex2 with
               | Empty, regex
  
positive.code:         (* Negate *)
          // Double-negation cancels out.
          | Negate (Negate regex) ->
              return! simplify regex
          | Negate regex ->
              // Simplify the inner regex first.
              let! regex = simplify regex
              match regex with
              | Epsilon ->
                  return empty
  
negative.code: 
  open System.Diagnostics
  open ExtCore.Control.Cps
  open FSharpLex.SpecializedCollections
  
  (*  Turn off warning about uppercase variable identifiers; some variables
  