anchor.diff:  /// Parser for `skip` commands.
   /// Skip is inserted when we're in command position, but see a semicolon.
   let parseSkip
  -    = stringReturn ";" Skip .>> ws
  +    = stringReturn ";" Skip
       // ^- ;
   
   /// Parser for simple commands (atomics, skips, and bracketed commands).
   do parseCommandRef :=
       choice [parseSkip
  -            // ^- `;'
  +            // ^- ;
               parseAtomicCommand
               // ^- < <atomic> > ;
               parseIf
  
positive.code: /// view using `ctor`, substituting in an empty list if none exists.
  /// view in `Apply` if the optional argument list exists.
  let addViewArgs ctor vname x =
      match x with
      | Some args -> ctor (vname, args)
      | None -> ctor (vname, [])
  
  /// Parses a possible argument list for an application of a parametric view.
  let parseFuncLike argp = ws >>. opt (parseParamList argp) .>> ws
  
negative.code: // Whitespace.
  //   TODO(CaptainHayashi): is some of this redundant?
  
  /// Parser for skipping line comments.
  let lcom = skipString "//" .>> skipRestOfLine true
  
  /// Parser for skipping block comments.
  let bcom = skipString "/*" .>> skipManyTill anyChar (pstring "*/")
  
  /// Parser for skipping comments.
  let com = (lcom <|> bcom) <?> "comment" 
  
  /// Parser for skipping zero or more whitespace characters.
  let ws = many (com <|> spaces1)
  
  /// As pipe2, but with automatic whitespace parsing after each parser.
  let pipe2ws x y f = pipe2 (x .>> ws) (y .>> ws) f
  