anchor.diff:              | MatchTuple of PosAdorn<PosAdorn<Pattern> list>
               | MatchEmpty
   
  +// Elements of a function clause.
   and FunctionClause = {returnTy : PosAdorn<TyExpr>; arguments : PosAdorn<(PosAdorn<TyExpr> * PosAdorn<string>) list>; body : PosAdorn<Expr>}
   
  +// Module qualifier.
   and ModQualifierRec = { module_ : PosAdorn<string>; name : PosAdorn<string> }
   
   and Direction = Upto
                 | Downto
   
  +// Other AST objects and their definitions. Most of them are explained within their names.
  +// Binary operation
   and BinaryOpRec =     { left : PosAdorn<Expr>; op : PosAdorn<BinaryOps>; right : PosAdorn<Expr> }
   and IfElseRec =       { condition : PosAdorn<Expr>; trueBranch : PosAdorn<Expr>; falseBranch : PosAdorn<Expr> }
   and LetRec =          { left : PosAdorn<Pattern>; right : PosAdorn<Expr> }
  +// Variable assign
   and AssignRec =       { left : PosAdorn<LeftAssign>; right : PosAdorn<Expr>; ref : PosAdorn<bool> }
   and ForLoopRec =      { typ : PosAdorn<TyExpr>; varName : PosAdorn<string>; start : PosAdorn<Expr>; direction : PosAdorn<Direction>; end_ : PosAdorn<Expr>; body : PosAdorn<Expr> }
   and WhileLoopRec =    { condition : PosAdorn<Expr>; body : PosAdorn<Expr> }
   and DoWhileLoopRec =  { condition : PosAdorn<Expr>; body: PosAdorn<Expr> }
  +// Pattern matching
   and CaseRec =         { on : PosAdorn<Expr>; clauses : PosAdorn<(PosAdorn<Pattern> * PosAdorn<Expr>) list> }
  +// Unary operation
   and UnaryOpRec =      { op : PosAdorn<UnaryOps>; exp : PosAdorn<Expr> }
   and RecordAccessRec = { record : PosAdorn<Expr>; fieldName : PosAdorn<string> }
   and ArrayAccessRec =  { array : PosAdorn<Expr>; index : PosAdorn<Expr> }
   and VarExpRec =       { name : PosAdorn<string> }
  +// Lambda function
   and LambdaRec =       { clause : PosAdorn<FunctionClause> }
   and InternalDeclareVarExpRec = { varName : PosAdorn<string>; typ : PosAdorn<TyExpr> option; right : PosAdorn<Expr> }
   and InternalValConAccessRec = { valCon : PosAdorn<Expr>; typ : PosAdorn<TyExpr> }
  +// Function call/apply
   and CallRec =         { func : PosAdorn<Expr>; args : PosAdorn<PosAdorn<Expr> list> }
  +// Applying the template of a function
   and TemplateApplyExpRec = { func : PosAdorn<Expr>; templateArgs : PosAdorn<TemplateApply> }
   and RecordExprRec =   { recordTy : PosAdorn<TyExpr>; templateArgs : PosAdorn<TemplateApply> option; initFields : PosAdorn<(PosAdorn<string> * PosAdorn<Expr>) list> }
   and ArrayMakeExpRec = { typ : PosAdorn<TyExpr>; initializer : PosAdorn<Expr> }
  
positive.code:            | RefTy of PosAdorn<TyExpr>
             | TupleTy of PosAdorn<TyExpr> list
  
  and MatchVarRec = {varName : PosAdorn<string>; mutable_ : PosAdorn<bool>; typ : PosAdorn<TyExpr> option}
  and MatchValConRec = { name : PosAdorn<string>; template : PosAdorn<TemplateApply> option; innerPattern : PosAdorn<Pattern>; id : int option }
  and MatchValConModQualifierRec = { modQualifier : PosAdorn<ModQualifierRec>; template : PosAdorn<TemplateApply> option; innerPattern : PosAdorn<Pattern>; id : int option }
  
negative.code: 
  open Microsoft.FSharp.Text.Lexing
  
  // Allows for module type to be used for declaring modules.
  type Module = Module of PosAdorn<Declaration> list
  
  // Tuple of starting position and ending position
  // Note: The 'option' keyword indicates that field is optional (can have 'none' as assignment)
  
  // PosAdorn wraps a an AST object in a start and end line position for helpful debugging
  // messages. It also includes the type of the object, which starts as 'none'.
  // Virtually every object in the AST is a PosAdorn wrapping another object.
  and PosAdorn<'a> = (Position * Position) * TyExpr option * 'a
  
  // Top level declarations
  // Function object. Template is optional.
  and FunctionRec = { name     : PosAdorn<string>; 
                      template : PosAdorn<Template> option;
                      clause   : PosAdorn<FunctionClause> }
  
  // Record object. Template is optional.
  and RecordRec =   { name     : PosAdorn<string>;
                      fields   : PosAdorn<(TyExpr * string) list>;
                      template : PosAdorn<Template> option }
  
  // Value constructor. Type is optional.
  and ValueCon =    PosAdorn<string> * (PosAdorn<TyExpr> option)
  
  // Union algrebraic datatype. Template is optional.
  and UnionRec =    { name     : PosAdorn<string>;
                      valCons  : PosAdorn<ValueCon list>;
                      template : PosAdorn<Template> option }
  
  // Let statement for functional-style declarations.
  and LetDecRec = { varName : PosAdorn<string>;
                    typ     : PosAdorn<TyExpr>;
                    right   : PosAdorn<Expr>; }
  
  // Declaration defined as any of the above.
  and Declaration = FunctionDec   of FunctionRec
                  | RecordDec     of RecordRec
                  | UnionDec      of UnionRec
  