anchor.diff:                                                  | None      -> ReferenceRange(Env(us.Path, wbname, wsname), rng) :> Reference
                                               )
                                           )
  +                                        <!> "RangeReferenceWorkbook"
       let RangeReferenceWorksheet = getUserState >>=
                                       fun us ->
                                           pipe2
                                               (WorksheetName .>> pstring "!")
                                               R
                                               (fun wsname rng -> ReferenceRange(Env(us.Path, us.WorkbookName, wsname), rng) :> Reference)
  +                                    <!> "RangeReferenceWorksheet"
       let RangeReferenceNoWorksheet = getUserState >>=
                                           fun us ->
                                               R
                                               |>> (fun rng -> ReferenceRange(us, rng) :> Reference)
  +                                    <!> "RangeReferenceNOWorksheet"
       let RangeReference = (attempt RangeReferenceWorkbook)
                            <|> (attempt RangeReferenceWorksheet)
                            <|> RangeReferenceNoWorksheet
  +                         <!> "RangeReference"
   
       let ARWQuoted = (between
                           (pstring "'")
                           (pstring "'")
                           (Workbook .>>. WorksheetNameUnquoted))
  +                    <!> "ARWQuoted"
       let AddressReferenceWorkbook = getUserState >>=
                                       fun us ->
                                           (pipe2
  
positive.code:                             Addr1Abs
                              (fun col row ->
                                  Address.fromA1(row, col, us.WorksheetName, us.WorkbookName, us.Path)))
      let AnyAddr = ((attempt AddrIndirect)
                    <|> (attempt AddrR1C1)
                    <|> AddrA1)
  
      // Ranges
  
      // contiguous ranges
  //    let RangeR1C1 = pipe2 AddrR1C1 (pstring ":" >>. AddrR1C1) (fun a1 a2 -> Range([a1, a2]))
  //    let RangeA1 = pipe2 AddrA1 (pstring ":" >>. AddrA1) (fun a1 a2 -> Range([a1, a2]))
  //    // discontiguous ranges
  //    let DRangeCellFirstR1C1 = pipe2 AddrR1C1 (pstring "," >>. RangesR1C1) (fun r1 r2 -> Range(r1, r2))
  ////    let DiscontRangeR1C1 = pipe2 (RangeR1C1 .>> pstring ",") RangeR1C1 (fun r1 r2 -> Range(r1,r2))
  ////    let DiscontRangeA1 = pipe2 (RangeA1 .>> pstring ",") RangeA1 (fun r1 r2 -> Range(r1,r2))
  //   
  //
  //    let RangesR1C1Impl = RangeR1C1
  //    let RangesA1Impl = RangeA1
  //
  //    //// top-level range
  //    let RangeAny = (attempt RangesR1C1) <|> RangesA1
  
      let RA1TO = (* RTO *)
                  (attempt (pstring ":" >>. AddrA1 .>> pstring ",") <!> """":" A "," """)
                  <|> (pstring ":" >>. AddrA1 <!> """":" A""")
      let RA1TC = (* RTC *)
                  (attempt (pstring "," >>. AddrA1 .>> pstring ","))
                  <|> (pstring "," >>. AddrA1)
      let RA1_1 = (* A RTC *) pipe2 AddrA1 RA1TC (fun a1 a2 -> Range(a1,a2)) <!> "A RTC"
      let RA1_2 = (* A RTO *) pipe2 AddrA1 RA1TO (fun a1 a2 -> Range(a1,a2)) <!> "A RTO"
      let RA1_3 = (* A RTO RTC *) pipe3 AddrA1 RA1TO RA1TC (fun a1 a2 a3 -> Range([(a1,a2);(a3,a3)])) <!> "A RTO RTC"
      let RA1_4 = (* A "," R *) pipe2 (AddrA1 .>> (pstring ",")) RangeA1 (fun a1 r1 -> Range(r1.Ranges() @ [(a1, a1)])) <!> """A "," R"""
      let RA1_5 = (* A RTO R *) pipe3 AddrA1 RA1TO RangeA1 (fun a1 a2 r2 -> Range ((a1,a2) :: r2.Ranges())) <!> "A RTO R"
      do RangeA1Impl :=   (attempt RA1_1)
                          <|> (attempt RA1_2)
                          <|> (attempt RA1_3)
                          <|> (attempt RA1_4)
                          <|> RA1_5
                          
      do RangeR1C1Impl := RangeA1
  
      let R = RangeA1
  //    let R = (attempt RangeR1C1) <|> RangeA1
  
      // Worksheet Names
  
negative.code:                                 AddrC
                                  (fun row col ->
                                      Address.fromR1C1(row, col, us.WorksheetName, us.WorkbookName, us.Path)))
                      <!> "AddrR1C1"
      let AddrA = many1Satisfy isAsciiUpper
      let AddrAAbs = (pstring "$" <|> pstring "") >>. AddrA
      let Addr1 = pint32
  