Coverage Report - org.apache.commons.configuration.plist.PropertyListParser
 
Classes in this File Line Coverage Branch Coverage Complexity
PropertyListParser
67%
214/315
54%
112/204
4,872
PropertyListParser$1
N/A
N/A
4,872
PropertyListParser$JJCalls
100%
1/1
N/A
4,872
PropertyListParser$LookaheadSuccess
100%
1/1
N/A
4,872
 
 1  
 /* Generated By:JavaCC: Do not edit this line. PropertyListParser.java */
 2  
 package org.apache.commons.configuration.plist;
 3  
 
 4  
 import java.util.Date;
 5  
 import java.util.List;
 6  
 import java.util.ArrayList;
 7  
 
 8  
 import org.apache.commons.configuration.HierarchicalConfiguration;
 9  
 import org.apache.commons.configuration.HierarchicalConfiguration.Node;
 10  
 
 11  
 import org.apache.commons.codec.binary.Hex;
 12  
 
 13  
 /**
 14  
  * JavaCC based parser for the PropertyList format.
 15  
  *
 16  
  * @author Emmanuel Bourg
 17  
  * @version $Revision$, $Date$
 18  
  */
 19  
 class PropertyListParser implements PropertyListParserConstants {
 20  
 
 21  
     /**
 22  
      * Remove the quotes at the beginning and at the end of the specified String.
 23  
      */
 24  
     protected String removeQuotes(String s)
 25  
     {
 26  216
         if (s == null)
 27  
         {
 28  1
             return null;
 29  
         }
 30  
 
 31  215
         if (s.startsWith("\u005c"") && s.endsWith("\u005c"") && s.length() >= 2)
 32  
         {
 33  213
             s = s.substring(1, s.length() - 1);
 34  
         }
 35  
 
 36  215
         return s;
 37  
     }
 38  
 
 39  
     protected String unescapeQuotes(String s)
 40  
     {
 41  213
         return s.replaceAll("\u005c\u005c\u005c\u005c\u005c"", "\u005c"");
 42  
     }
 43  
 
 44  
     /**
 45  
      * Remove the white spaces and the data delimiters from the specified
 46  
      * string and parse it as a byte array.
 47  
      */
 48  
     protected byte[] filterData(String s) throws ParseException
 49  
     {
 50  57
         if (s == null)
 51  
         {
 52  1
             return null;
 53  
         }
 54  
 
 55  
         // remove the delimiters
 56  56
         if (s.startsWith("<") && s.endsWith(">") && s.length() >= 2)
 57  
         {
 58  53
             s = s.substring(1, s.length() - 1);
 59  
         }
 60  
 
 61  
         // remove the white spaces
 62  56
         s = s.replaceAll("\u005c\u005cs", "");
 63  
 
 64  
         // add a leading 0 to ensure well formed bytes
 65  56
         if (s.length() % 2 != 0)
 66  
         {
 67  1
             s = "0" + s;
 68  
         }
 69  
 
 70  
         // parse and return the bytes
 71  
         try
 72  
         {
 73  56
             return Hex.decodeHex(s.toCharArray());
 74  
         }
 75  0
         catch (Exception e)
 76  
         {
 77  0
             throw (ParseException) new ParseException("Unable to parse the byte[] : " + e.getMessage());
 78  
         }
 79  
     }
 80  
 
 81  
     /**
 82  
      * Parse a date formatted as <*D2002-03-22 11:30:00 +0100>
 83  
      */
 84  
     protected Date parseDate(String s) throws ParseException
 85  
     {
 86  26
         return PropertyListConfiguration.parseDate(s);
 87  
     }
 88  
 
 89  
   final public PropertyListConfiguration parse() throws ParseException {
 90  28
     PropertyListConfiguration configuration = null;
 91  28
     configuration = Dictionary();
 92  27
     jj_consume_token(0);
 93  27
       {if (true) return configuration;}
 94  
     throw new Error("Missing return statement in function");
 95  
   }
 96  
 
 97  
   final public PropertyListConfiguration Dictionary() throws ParseException {
 98  203
     PropertyListConfiguration configuration = new PropertyListConfiguration();
 99  203
     List<Node> children = new ArrayList<Node>();
 100  203
     Node child = null;
 101  203
     jj_consume_token(DICT_BEGIN);
 102  
     label_1:
 103  
     while (true) {
 104  729
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
 105  
       case STRING:
 106  
       case QUOTED_STRING:
 107  
         ;
 108  527
         break;
 109  
       default:
 110  202
         jj_la1[0] = jj_gen;
 111  202
         break label_1;
 112  
       }
 113  527
       child = Property();
 114  527
             if (child.getValue() instanceof HierarchicalConfiguration)
 115  
             {
 116  
                 // prune & graft the nested configuration to the parent configuration
 117  125
                 HierarchicalConfiguration conf = (HierarchicalConfiguration) child.getValue();
 118  125
                 Node root = conf.getRoot();
 119  125
                 root.setName(child.getName());
 120  125
                 children.add(root);
 121  125
             }
 122  
             else
 123  
             {
 124  402
                 children.add(child);
 125  
             }
 126  
     }
 127  202
     jj_consume_token(DICT_END);
 128  729
         for (int i = 0; i < children.size(); i++)
 129  
         {
 130  527
             child = children.get(i);
 131  527
             configuration.getRoot().addChild(child);
 132  
         }
 133  
 
 134  202
         {if (true) return configuration;}
 135  
     throw new Error("Missing return statement in function");
 136  
   }
 137  
 
 138  
   final public Node Property() throws ParseException {
 139  527
     String key = null;
 140  527
     Object value = null;
 141  527
     Node node = new Node();
 142  527
     key = String();
 143  527
       node.setName(key);
 144  527
     jj_consume_token(EQUAL);
 145  527
     value = Element();
 146  527
       node.setValue(value);
 147  527
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
 148  
     case DICT_SEPARATOR:
 149  358
       jj_consume_token(DICT_SEPARATOR);
 150  358
       break;
 151  
     default:
 152  169
       jj_la1[1] = jj_gen;
 153  
       ;
 154  
     }
 155  527
       {if (true) return node;}
 156  
     throw new Error("Missing return statement in function");
 157  
   }
 158  
 
 159  
   final public Object Element() throws ParseException {
 160  802
     Object value = null;
 161  802
     if (jj_2_1(2)) {
 162  150
       value = Array();
 163  150
       {if (true) return value;}
 164  
     } else {
 165  652
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
 166  
       case DICT_BEGIN:
 167  175
         value = Dictionary();
 168  175
       {if (true) return value;}
 169  
         break;
 170  
       case STRING:
 171  
       case QUOTED_STRING:
 172  400
         value = String();
 173  400
       {if (true) return value;}
 174  
         break;
 175  
       case DATA:
 176  52
         value = Data();
 177  52
       {if (true) return value;}
 178  
         break;
 179  
       case DATE:
 180  25
         value = Date();
 181  25
       {if (true) return value;}
 182  
         break;
 183  
       default:
 184  0
         jj_la1[2] = jj_gen;
 185  0
         jj_consume_token(-1);
 186  0
         throw new ParseException();
 187  
       }
 188  
     }
 189  
     throw new Error("Missing return statement in function");
 190  
   }
 191  
 
 192  
   final public List Array() throws ParseException {
 193  150
     List<Object> list = new ArrayList<Object>();
 194  150
     Object element = null;
 195  150
     jj_consume_token(ARRAY_BEGIN);
 196  150
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
 197  
     case ARRAY_BEGIN:
 198  
     case DICT_BEGIN:
 199  
     case DATA:
 200  
     case DATE:
 201  
     case STRING:
 202  
     case QUOTED_STRING:
 203  125
       element = Element();
 204  125
           list.add(element);
 205  
       label_2:
 206  
       while (true) {
 207  275
         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
 208  
         case ARRAY_SEPARATOR:
 209  
           ;
 210  150
           break;
 211  
         default:
 212  125
           jj_la1[3] = jj_gen;
 213  125
           break label_2;
 214  
         }
 215  150
         jj_consume_token(ARRAY_SEPARATOR);
 216  150
         element = Element();
 217  150
               list.add(element);
 218  
       }
 219  
       break;
 220  
     default:
 221  25
       jj_la1[4] = jj_gen;
 222  
       ;
 223  
     }
 224  150
     jj_consume_token(ARRAY_END);
 225  150
       {if (true) return list;}
 226  
     throw new Error("Missing return statement in function");
 227  
   }
 228  
 
 229  
   final public String String() throws ParseException {
 230  927
     Token token = null;
 231  927
     String value = null;
 232  927
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
 233  
     case QUOTED_STRING:
 234  211
       token = jj_consume_token(QUOTED_STRING);
 235  211
       {if (true) return unescapeQuotes(removeQuotes(token.image));}
 236  
       break;
 237  
     case STRING:
 238  716
       token = jj_consume_token(STRING);
 239  716
       {if (true) return token.image;}
 240  
       break;
 241  
     default:
 242  0
       jj_la1[5] = jj_gen;
 243  0
       jj_consume_token(-1);
 244  0
       throw new ParseException();
 245  
     }
 246  
     throw new Error("Missing return statement in function");
 247  
   }
 248  
 
 249  
   final public byte[] Data() throws ParseException {
 250  
     Token token;
 251  52
     token = jj_consume_token(DATA);
 252  52
       {if (true) return filterData(token.image);}
 253  
     throw new Error("Missing return statement in function");
 254  
   }
 255  
 
 256  
   final public Date Date() throws ParseException {
 257  
     Token token;
 258  25
     token = jj_consume_token(DATE);
 259  25
       {if (true) return parseDate(token.image);}
 260  
     throw new Error("Missing return statement in function");
 261  
   }
 262  
 
 263  
   private boolean jj_2_1(int xla) {
 264  802
     jj_la = xla; jj_lastpos = jj_scanpos = token;
 265  802
     try { return !jj_3_1(); }
 266  150
     catch(LookaheadSuccess ls) { return true; }
 267  802
     finally { jj_save(0, xla); }
 268  
   }
 269  
 
 270  
   private boolean jj_3_1() {
 271  952
     if (jj_3R_3()) return true;
 272  0
     return false;
 273  
   }
 274  
 
 275  
   private boolean jj_3R_5() {
 276  
     Token xsp;
 277  150
     xsp = jj_scanpos;
 278  150
     if (jj_3_1()) {
 279  125
     jj_scanpos = xsp;
 280  125
     if (jj_3R_6()) {
 281  100
     jj_scanpos = xsp;
 282  100
     if (jj_3R_7()) {
 283  25
     jj_scanpos = xsp;
 284  25
     if (jj_3R_8()) {
 285  25
     jj_scanpos = xsp;
 286  25
     if (jj_3R_9()) return true;
 287  
     }
 288  
     }
 289  
     }
 290  
     }
 291  0
     return false;
 292  
   }
 293  
 
 294  
   private boolean jj_3R_14() {
 295  100
     if (jj_scan_token(QUOTED_STRING)) return true;
 296  0
     return false;
 297  
   }
 298  
 
 299  
   private boolean jj_3R_11() {
 300  
     Token xsp;
 301  100
     xsp = jj_scanpos;
 302  100
     if (jj_3R_14()) {
 303  77
     jj_scanpos = xsp;
 304  77
     if (jj_3R_15()) return true;
 305  
     }
 306  0
     return false;
 307  
   }
 308  
 
 309  
   private boolean jj_3R_13() {
 310  25
     if (jj_scan_token(DATE)) return true;
 311  0
     return false;
 312  
   }
 313  
 
 314  
   private boolean jj_3R_10() {
 315  125
     if (jj_scan_token(DICT_BEGIN)) return true;
 316  0
     return false;
 317  
   }
 318  
 
 319  
   private boolean jj_3R_9() {
 320  25
     if (jj_3R_13()) return true;
 321  0
     return false;
 322  
   }
 323  
 
 324  
   private boolean jj_3R_8() {
 325  25
     if (jj_3R_12()) return true;
 326  0
     return false;
 327  
   }
 328  
 
 329  
   private boolean jj_3R_12() {
 330  25
     if (jj_scan_token(DATA)) return true;
 331  0
     return false;
 332  
   }
 333  
 
 334  
   private boolean jj_3R_7() {
 335  100
     if (jj_3R_11()) return true;
 336  0
     return false;
 337  
   }
 338  
 
 339  
   private boolean jj_3R_4() {
 340  150
     if (jj_3R_5()) return true;
 341  0
     return false;
 342  
   }
 343  
 
 344  
   private boolean jj_3R_6() {
 345  125
     if (jj_3R_10()) return true;
 346  0
     return false;
 347  
   }
 348  
 
 349  
   private boolean jj_3R_15() {
 350  77
     if (jj_scan_token(STRING)) return true;
 351  0
     return false;
 352  
   }
 353  
 
 354  
   private boolean jj_3R_3() {
 355  952
     if (jj_scan_token(ARRAY_BEGIN)) return true;
 356  
     Token xsp;
 357  150
     xsp = jj_scanpos;
 358  150
     if (jj_3R_4()) jj_scanpos = xsp;
 359  25
     if (jj_scan_token(ARRAY_END)) return true;
 360  0
     return false;
 361  
   }
 362  
 
 363  
   /** Generated Token Manager. */
 364  
   public PropertyListParserTokenManager token_source;
 365  
   SimpleCharStream jj_input_stream;
 366  
   /** Current token. */
 367  
   public Token token;
 368  
   /** Next token. */
 369  
   public Token jj_nt;
 370  
   private int jj_ntk;
 371  
   private Token jj_scanpos, jj_lastpos;
 372  
   private int jj_la;
 373  
   private int jj_gen;
 374  32
   final private int[] jj_la1 = new int[6];
 375  
   static private int[] jj_la1_0;
 376  
   static {
 377  1
       jj_la1_init_0();
 378  1
    }
 379  
    private static void jj_la1_init_0() {
 380  1
       jj_la1_0 = new int[] {0x18000000,0x10000,0x1e004000,0x2000,0x1e004800,0x18000000,};
 381  1
    }
 382  32
   final private JJCalls[] jj_2_rtns = new JJCalls[1];
 383  32
   private boolean jj_rescan = false;
 384  32
   private int jj_gc = 0;
 385  
 
 386  
   /** Constructor with InputStream. */
 387  
   public PropertyListParser(java.io.InputStream stream) {
 388  0
      this(stream, null);
 389  0
   }
 390  
   /** Constructor with InputStream and supplied encoding */
 391  0
   public PropertyListParser(java.io.InputStream stream, String encoding) {
 392  0
     try { jj_input_stream = new SimpleCharStream(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
 393  0
     token_source = new PropertyListParserTokenManager(jj_input_stream);
 394  0
     token = new Token();
 395  0
     jj_ntk = -1;
 396  0
     jj_gen = 0;
 397  0
     for (int i = 0; i < 6; i++) jj_la1[i] = -1;
 398  0
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
 399  0
   }
 400  
 
 401  
   /** Reinitialise. */
 402  
   public void ReInit(java.io.InputStream stream) {
 403  0
      ReInit(stream, null);
 404  0
   }
 405  
   /** Reinitialise. */
 406  
   public void ReInit(java.io.InputStream stream, String encoding) {
 407  0
     try { jj_input_stream.ReInit(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
 408  0
     token_source.ReInit(jj_input_stream);
 409  0
     token = new Token();
 410  0
     jj_ntk = -1;
 411  0
     jj_gen = 0;
 412  0
     for (int i = 0; i < 6; i++) jj_la1[i] = -1;
 413  0
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
 414  0
   }
 415  
 
 416  
   /** Constructor. */
 417  32
   public PropertyListParser(java.io.Reader stream) {
 418  32
     jj_input_stream = new SimpleCharStream(stream, 1, 1);
 419  32
     token_source = new PropertyListParserTokenManager(jj_input_stream);
 420  32
     token = new Token();
 421  32
     jj_ntk = -1;
 422  32
     jj_gen = 0;
 423  32
     for (int i = 0; i < 6; i++) jj_la1[i] = -1;
 424  32
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
 425  32
   }
 426  
 
 427  
   /** Reinitialise. */
 428  
   public void ReInit(java.io.Reader stream) {
 429  0
     jj_input_stream.ReInit(stream, 1, 1);
 430  0
     token_source.ReInit(jj_input_stream);
 431  0
     token = new Token();
 432  0
     jj_ntk = -1;
 433  0
     jj_gen = 0;
 434  0
     for (int i = 0; i < 6; i++) jj_la1[i] = -1;
 435  0
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
 436  0
   }
 437  
 
 438  
   /** Constructor with generated Token Manager. */
 439  0
   public PropertyListParser(PropertyListParserTokenManager tm) {
 440  0
     token_source = tm;
 441  0
     token = new Token();
 442  0
     jj_ntk = -1;
 443  0
     jj_gen = 0;
 444  0
     for (int i = 0; i < 6; i++) jj_la1[i] = -1;
 445  0
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
 446  0
   }
 447  
 
 448  
   /** Reinitialise. */
 449  
   public void ReInit(PropertyListParserTokenManager tm) {
 450  0
     token_source = tm;
 451  0
     token = new Token();
 452  0
     jj_ntk = -1;
 453  0
     jj_gen = 0;
 454  0
     for (int i = 0; i < 6; i++) jj_la1[i] = -1;
 455  0
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
 456  0
   }
 457  
 
 458  
   private Token jj_consume_token(int kind) throws ParseException {
 459  
     Token oldToken;
 460  2771
     if ((oldToken = token).next != null) token = token.next;
 461  582
     else token = token.next = token_source.getNextToken();
 462  2771
     jj_ntk = -1;
 463  2771
     if (token.kind == kind) {
 464  2770
       jj_gen++;
 465  2770
       if (++jj_gc > 100) {
 466  25
         jj_gc = 0;
 467  50
         for (int i = 0; i < jj_2_rtns.length; i++) {
 468  25
           JJCalls c = jj_2_rtns[i];
 469  75
           while (c != null) {
 470  50
             if (c.gen < jj_gen) c.first = null;
 471  50
             c = c.next;
 472  
           }
 473  
         }
 474  
       }
 475  2770
       return token;
 476  
     }
 477  1
     token = oldToken;
 478  1
     jj_kind = kind;
 479  1
     throw generateParseException();
 480  
   }
 481  
 
 482  64
   static private final class LookaheadSuccess extends java.lang.Error { }
 483  32
   final private LookaheadSuccess jj_ls = new LookaheadSuccess();
 484  
   private boolean jj_scan_token(int kind) {
 485  1329
     if (jj_scanpos == jj_lastpos) {
 486  952
       jj_la--;
 487  952
       if (jj_scanpos.next == null) {
 488  827
         jj_lastpos = jj_scanpos = jj_scanpos.next = token_source.getNextToken();
 489  
       } else {
 490  125
         jj_lastpos = jj_scanpos = jj_scanpos.next;
 491  
       }
 492  
     } else {
 493  377
       jj_scanpos = jj_scanpos.next;
 494  
     }
 495  1329
     if (jj_rescan) {
 496  0
       int i = 0; Token tok = token;
 497  0
       while (tok != null && tok != jj_scanpos) { i++; tok = tok.next; }
 498  0
       if (tok != null) jj_add_error_token(kind, i);
 499  
     }
 500  1329
     if (jj_scanpos.kind != kind) return true;
 501  300
     if (jj_la == 0 && jj_scanpos == jj_lastpos) throw jj_ls;
 502  150
     return false;
 503  
   }
 504  
 
 505  
 
 506  
 /** Get the next Token. */
 507  
   final public Token getNextToken() {
 508  0
     if (token.next != null) token = token.next;
 509  0
     else token = token.next = token_source.getNextToken();
 510  0
     jj_ntk = -1;
 511  0
     jj_gen++;
 512  0
     return token;
 513  
   }
 514  
 
 515  
 /** Get the specific Token. */
 516  
   final public Token getToken(int index) {
 517  0
     Token t = token;
 518  0
     for (int i = 0; i < index; i++) {
 519  0
       if (t.next != null) t = t.next;
 520  0
       else t = t.next = token_source.getNextToken();
 521  
     }
 522  0
     return t;
 523  
   }
 524  
 
 525  
   private int jj_ntk() {
 526  2064
     if ((jj_nt=token.next) == null)
 527  1362
       return (jj_ntk = (token.next=token_source.getNextToken()).kind);
 528  
     else
 529  702
       return (jj_ntk = jj_nt.kind);
 530  
   }
 531  
 
 532  32
   private java.util.List<int[]> jj_expentries = new java.util.ArrayList<int[]>();
 533  
   private int[] jj_expentry;
 534  32
   private int jj_kind = -1;
 535  32
   private int[] jj_lasttokens = new int[100];
 536  
   private int jj_endpos;
 537  
 
 538  
   private void jj_add_error_token(int kind, int pos) {
 539  1
     if (pos >= 100) return;
 540  1
     if (pos == jj_endpos + 1) {
 541  0
       jj_lasttokens[jj_endpos++] = kind;
 542  1
     } else if (jj_endpos != 0) {
 543  0
       jj_expentry = new int[jj_endpos];
 544  0
       for (int i = 0; i < jj_endpos; i++) {
 545  0
         jj_expentry[i] = jj_lasttokens[i];
 546  
       }
 547  0
       jj_entries_loop: for (java.util.Iterator<?> it = jj_expentries.iterator(); it.hasNext();) {
 548  0
         int[] oldentry = (int[])(it.next());
 549  0
         if (oldentry.length == jj_expentry.length) {
 550  0
           for (int i = 0; i < jj_expentry.length; i++) {
 551  0
             if (oldentry[i] != jj_expentry[i]) {
 552  0
               continue jj_entries_loop;
 553  
             }
 554  
           }
 555  0
           jj_expentries.add(jj_expentry);
 556  0
           break jj_entries_loop;
 557  
         }
 558  0
       }
 559  0
       if (pos != 0) jj_lasttokens[(jj_endpos = pos) - 1] = kind;
 560  
     }
 561  1
   }
 562  
 
 563  
   /** Generate ParseException. */
 564  
   public ParseException generateParseException() {
 565  1
     jj_expentries.clear();
 566  1
     boolean[] la1tokens = new boolean[30];
 567  1
     if (jj_kind >= 0) {
 568  1
       la1tokens[jj_kind] = true;
 569  1
       jj_kind = -1;
 570  
     }
 571  7
     for (int i = 0; i < 6; i++) {
 572  6
       if (jj_la1[i] == jj_gen) {
 573  0
         for (int j = 0; j < 32; j++) {
 574  0
           if ((jj_la1_0[i] & (1<<j)) != 0) {
 575  0
             la1tokens[j] = true;
 576  
           }
 577  
         }
 578  
       }
 579  
     }
 580  31
     for (int i = 0; i < 30; i++) {
 581  30
       if (la1tokens[i]) {
 582  1
         jj_expentry = new int[1];
 583  1
         jj_expentry[0] = i;
 584  1
         jj_expentries.add(jj_expentry);
 585  
       }
 586  
     }
 587  1
     jj_endpos = 0;
 588  1
     jj_rescan_token();
 589  1
     jj_add_error_token(0, 0);
 590  1
     int[][] exptokseq = new int[jj_expentries.size()][];
 591  2
     for (int i = 0; i < jj_expentries.size(); i++) {
 592  1
       exptokseq[i] = jj_expentries.get(i);
 593  
     }
 594  1
     return new ParseException(token, exptokseq, tokenImage);
 595  
   }
 596  
 
 597  
   /** Enable tracing. */
 598  
   final public void enable_tracing() {
 599  0
   }
 600  
 
 601  
   /** Disable tracing. */
 602  
   final public void disable_tracing() {
 603  0
   }
 604  
 
 605  
   private void jj_rescan_token() {
 606  1
     jj_rescan = true;
 607  2
     for (int i = 0; i < 1; i++) {
 608  
     try {
 609  1
       JJCalls p = jj_2_rtns[i];
 610  
       do {
 611  1
         if (p.gen > jj_gen) {
 612  0
           jj_la = p.arg; jj_lastpos = jj_scanpos = p.first;
 613  0
           switch (i) {
 614  0
             case 0: jj_3_1(); break;
 615  
           }
 616  
         }
 617  1
         p = p.next;
 618  1
       } while (p != null);
 619  1
       } catch(LookaheadSuccess ls) { }
 620  
     }
 621  1
     jj_rescan = false;
 622  1
   }
 623  
 
 624  
   private void jj_save(int index, int xla) {
 625  802
     JJCalls p = jj_2_rtns[index];
 626  877
     while (p.gen > jj_gen) {
 627  100
       if (p.next == null) { p = p.next = new JJCalls(); break; }
 628  75
       p = p.next;
 629  
     }
 630  802
     p.gen = jj_gen + xla - jj_la; p.first = token; p.arg = xla;
 631  802
   }
 632  
 
 633  57
   static final class JJCalls {
 634  
     int gen;
 635  
     Token first;
 636  
     int arg;
 637  
     JJCalls next;
 638  
   }
 639  
 
 640  
 }