anchor.diff:      RBRACK
       ;
   
  -predictDatasetdecl: type declarator (LBRACK RBRACK)? LT;
  -
  -datasetdecl [StringTemplate code]
  -{StringTemplate dataset=null, t=null, m=null, d=null;}
  -    :   t=type d=declarator (b1:LBRACK RBRACK)? LT (m=mappingdecl | f:STRING_LITERAL) GT SEMI
  +predictDatasetdecl: (LBRACK RBRACK)? LT;
  +
  +datasetdecl [StringTemplate code, StringTemplate t, StringTemplate d]
  +{StringTemplate dataset=null, m=null;}
  +    :  (b1:LBRACK RBRACK)? LT (m=mappingdecl | f:STRING_LITERAL) GT SEMI
       {
          dataset=template("dataset");
          dataset.setAttribute("type", t);
  
positive.code: predictDeclaration : type declarator ;
  
  declaration [StringTemplate code]
  {StringTemplate d=null;}
      :
       (functioncallStatAssignOneReturnParamAsDecl) => d=functioncallStatAssignOneReturnParamAsDecl
         {
          code.setAttribute("statements",d);
          setReturnVariables(code, d);
         }
      | (variableDecl[code]) => variableDecl[code]
      | (predictDatasetdecl) => datasetdecl[code]
      ;
  
  variableDecl [StringTemplate code]
  {StringTemplate v1=null, v2=null,t=null, d=null, i1=null, i2=null;}
      :   t=type d=declarator (b1:LBRACK RBRACK)? i1=varInitializer
  
      {
          if ( currentFunctionName==null ) {
  
negative.code:     :  code=ll1statement
      |  (functioncallStatNoAssign) => code=functioncallStatNoAssign
      |   (functioncallStatAssignManyReturnParam) => code=functioncallStatAssignManyReturnParam
  // TODO fix this... need to pull in types to pass in that we've factored out
  // which I guess really means this ceases to be a general statement.
  // I think its only used in switch anyway...
      |   (functioncallStatAssignOneReturnParamAsDecl[null,null]) => code=functioncallStatAssignOneReturnParamAsDecl[null,null]
      |  (predictAssignStat) => code=assignStat
      ;
  
  