Coverage Report - com.quiotix.html.parser.HtmlParser
 
Classes in this File Line Coverage Branch Coverage Complexity
HtmlParser
31%
125/399
24%
57/235
6.065
HtmlParser$1
N/A
N/A
6.065
HtmlParser$JJCalls
100%
1/1
N/A
6.065
HtmlParser$LookaheadSuccess
100%
1/1
N/A
6.065
 
 1  
 /* Generated By:JavaCC: Do not edit this line. HtmlParser.java */
 2  
 package com.quiotix.html.parser;
 3  
 
 4  
 /**
 5  
  * This grammar parses an HTML document and produces a (flat) parse "tree" 
 6  
  * representing the document.  It preserves almost all information in the
 7  
  * source document, including carriage control and spacing (except inside
 8  
  * of tags.)  See the HtmlDocument and HtmlDocument.* classes for a 
 9  
  * description of the parse tree.  The parse tree supports traversal using
 10  
  * the commonly used "Visitor" pattern.  The HtmlDumper class is a visitor
 11  
  * which dumps out the tree to an output stream.  
 12  
  * 
 13  
  * It does not require begin tags to be matched with end tags, or validate
 14  
  * the names or contents of the tags (this can easily be done post-parsing; 
 15  
  * see the HtmlCollector class (which matches begin tags with end tags) 
 16  
  * for an example.)  
 17  
  * 
 18  
  * Notable edge cases include: 
 19  
  * - Quoted string processing.  Quoted strings are matched inside of comments, and
 20  
  *   as tag attribute values.  Quoted strings are matched in normal text only
 21  
  *   to the extent that they do not span line breaks.  
 22  
  * 
 23  
  * Please direct comments, questions, gripes or praise to 
 24  
  * html-parser@quiotix.com.  If you like it/hate it/use it, please let us know!  
 25  
  */
 26  
 public class HtmlParser implements HtmlParserConstants {
 27  
 
 28  2
   final static String NL = System.getProperty("line.separator");
 29  
 
 30  
   private static String getTokenText(Token first, Token cur) {
 31  
     Token t;
 32  0
     StringBuffer sb = new StringBuffer();
 33  
 
 34  0
     for (t=first; t != cur.next; t = t.next) {
 35  0
       if (t.specialToken != null) {
 36  0
         Token tt=t.specialToken;
 37  0
         while (tt.specialToken != null)
 38  0
           tt = tt.specialToken;
 39  0
         for (; tt != null; tt = tt.next)
 40  0
           sb.append(tt.image);
 41  
       };
 42  0
       sb.append(t.image);
 43  
     };
 44  0
     return sb.toString();
 45  
   }
 46  
 
 47  
   /** Runnable. */
 48  
   public static void main(String[] args) throws ParseException {
 49  0
     HtmlParser parser = new HtmlParser(System.in);
 50  0
     HtmlDocument doc = parser.HtmlDocument();
 51  0
     doc.accept(new HtmlDumper(System.out));
 52  0
     System.exit(0);
 53  0
   }
 54  
 
 55  
 /** Constructor. */
 56  
   final public HtmlDocument HtmlDocument() throws ParseException {
 57  
   HtmlDocument.ElementSequence s;
 58  6
     s = ElementSequence();
 59  6
     jj_consume_token(0);
 60  6
     {if (true) return new HtmlDocument(s);}
 61  
     throw new Error("Missing return statement in function");
 62  
   }
 63  
 
 64  
 /** @return a sequence of elements */
 65  
   final public HtmlDocument.ElementSequence ElementSequence() throws ParseException {
 66  6
   HtmlDocument.ElementSequence s = new HtmlDocument.ElementSequence();
 67  
   HtmlDocument.HtmlElement h;
 68  
     label_1:
 69  
     while (true) {
 70  64
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
 71  
       case EOL:
 72  
       case TAG_START:
 73  
       case ENDTAG_START:
 74  
       case COMMENT_START:
 75  
       case DECL_START:
 76  
       case PCDATA:
 77  
         ;
 78  58
         break;
 79  
       default:
 80  6
         jj_la1[0] = jj_gen;
 81  6
         break label_1;
 82  
       }
 83  58
       h = Element();
 84  58
                   s.addElement(h);
 85  
     }
 86  6
     {if (true) return s;}
 87  
     throw new Error("Missing return statement in function");
 88  
   }
 89  
 
 90  
 /** @return an element */
 91  
   final public HtmlDocument.HtmlElement Element() throws ParseException {
 92  
   HtmlDocument.HtmlElement e;
 93  
   Token text;
 94  58
     if (jj_2_1(2)) {
 95  36
       e = Tag();
 96  36
                             {if (true) return e;}
 97  
     } else {
 98  22
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
 99  
       case ENDTAG_START:
 100  0
         e = EndTag();
 101  0
                             {if (true) return e;}
 102  
         break;
 103  
       case COMMENT_START:
 104  0
         e = CommentTag();
 105  0
                             {if (true) return e;}
 106  
         break;
 107  
       case DECL_START:
 108  0
         e = DeclTag();
 109  0
                             {if (true) return e;}
 110  
         break;
 111  
       default:
 112  22
         jj_la1[1] = jj_gen;
 113  22
         if (jj_2_2(2)) {
 114  0
           e = ScriptBlock();
 115  0
                              {if (true) return e;}
 116  22
         } else if (jj_2_3(2)) {
 117  0
           e = StyleBlock();
 118  0
                              {if (true) return e;}
 119  22
         } else if (jj_2_4(2)) {
 120  0
           jj_consume_token(TAG_START);
 121  0
           text = jj_consume_token(LST_ERROR);
 122  0
                             {if (true) return new HtmlDocument.Text("<" + text.image);}
 123  
         } else {
 124  22
           switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
 125  
           case PCDATA:
 126  14
             text = jj_consume_token(PCDATA);
 127  14
                             {if (true) return new HtmlDocument.Text(text.image);}
 128  
             break;
 129  
           case EOL:
 130  8
             jj_consume_token(EOL);
 131  8
                             {if (true) return new HtmlDocument.Newline();}
 132  
             break;
 133  
           default:
 134  0
             jj_la1[2] = jj_gen;
 135  0
             jj_consume_token(-1);
 136  0
             throw new ParseException();
 137  
           }
 138  
         }
 139  
       }
 140  
     }
 141  
     throw new Error("Missing return statement in function");
 142  
   }
 143  
 
 144  
 /** @return an attribute */
 145  
   final public HtmlDocument.Attribute Attribute() throws ParseException {
 146  10
   Token t1, t2=null;
 147  10
     t1 = jj_consume_token(ATTR_NAME);
 148  10
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
 149  
     case ATTR_EQ:
 150  10
       jj_consume_token(ATTR_EQ);
 151  10
       t2 = jj_consume_token(ATTR_VAL);
 152  10
       break;
 153  
     default:
 154  0
       jj_la1[3] = jj_gen;
 155  
       ;
 156  
     }
 157  10
     if (t2 == null)
 158  0
       {if (true) return new HtmlDocument.Attribute(t1.image);}
 159  
     else
 160  10
       {if (true) return new HtmlDocument.Attribute(t1.image, t2.image);}
 161  
     throw new Error("Missing return statement in function");
 162  
   }
 163  
 
 164  
 /** @return an AttributeList */
 165  
   final public HtmlDocument.AttributeList AttributeList() throws ParseException {
 166  36
   HtmlDocument.AttributeList alist = new HtmlDocument.AttributeList();
 167  
   HtmlDocument.Attribute a;
 168  
     label_2:
 169  
     while (true) {
 170  46
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
 171  
       case ATTR_NAME:
 172  
         ;
 173  10
         break;
 174  
       default:
 175  36
         jj_la1[4] = jj_gen;
 176  36
         break label_2;
 177  
       }
 178  10
       a = Attribute();
 179  10
                    alist.addAttribute(a);
 180  
     }
 181  36
     {if (true) return alist;}
 182  
     throw new Error("Missing return statement in function");
 183  
   }
 184  
 
 185  
 /** @return a tag */
 186  
   final public HtmlDocument.HtmlElement Tag() throws ParseException {
 187  
   Token t, et;
 188  
   HtmlDocument.AttributeList alist;
 189  36
   Token firstToken = getToken(1);
 190  
     try {
 191  36
       jj_consume_token(TAG_START);
 192  36
       t = jj_consume_token(TAG_NAME);
 193  36
       alist = AttributeList();
 194  36
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
 195  
       case TAG_END:
 196  36
         et = jj_consume_token(TAG_END);
 197  36
         break;
 198  
       case TAG_SLASHEND:
 199  0
         et = jj_consume_token(TAG_SLASHEND);
 200  0
         break;
 201  
       default:
 202  0
         jj_la1[5] = jj_gen;
 203  0
         jj_consume_token(-1);
 204  0
         throw new ParseException();
 205  
       }
 206  36
       HtmlDocument.Tag tag = new HtmlDocument.Tag(t.image, alist);
 207  36
       if (et.kind == TAG_SLASHEND) tag.setEmpty(true);
 208  36
       {if (true) return tag;}
 209  0
     } catch (ParseException ex) {
 210  0
     token_source.SwitchTo(DEFAULT);
 211  0
     String s = getTokenText(firstToken, getNextToken());
 212  0
     {if (true) return new HtmlDocument.Text(s);}
 213  
     }
 214  
     throw new Error("Missing return statement in function");
 215  
   }
 216  
 
 217  
 /** @return the contents of a block */
 218  
   final public HtmlDocument.ElementSequence BlockContents() throws ParseException {
 219  
   Token t;
 220  0
   StringBuffer s = new StringBuffer();
 221  0
   HtmlDocument.ElementSequence e = new HtmlDocument.ElementSequence();
 222  
     label_3:
 223  
     while (true) {
 224  0
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
 225  
       case BLOCK_EOL:
 226  
       case BLOCK_LBR:
 227  
       case BLOCK_WORD:
 228  
         ;
 229  0
         break;
 230  
       default:
 231  0
         jj_la1[6] = jj_gen;
 232  0
         break label_3;
 233  
       }
 234  0
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
 235  
       case BLOCK_EOL:
 236  0
         jj_consume_token(BLOCK_EOL);
 237  0
       if (s.length() > 0) {
 238  0
         e.addElement(new HtmlDocument.Text(s.toString()));
 239  0
         s.setLength(0);
 240  
       };
 241  0
       e.addElement(new HtmlDocument.Newline());
 242  0
         break;
 243  
       case BLOCK_WORD:
 244  0
         t = jj_consume_token(BLOCK_WORD);
 245  0
                        s.append(t.image);
 246  0
         break;
 247  
       case BLOCK_LBR:
 248  0
         t = jj_consume_token(BLOCK_LBR);
 249  0
                        s.append(t.image);
 250  0
         break;
 251  
       default:
 252  0
         jj_la1[7] = jj_gen;
 253  0
         jj_consume_token(-1);
 254  0
         throw new ParseException();
 255  
       }
 256  
     }
 257  0
     if (s.length() > 0)
 258  0
       e.addElement(new HtmlDocument.Text(s.toString()));
 259  0
     e.addElement(new HtmlDocument.Newline());
 260  0
     {if (true) return e;}
 261  
     throw new Error("Missing return statement in function");
 262  
   }
 263  
 
 264  
 /** @return the contents of a script block */
 265  
   final public HtmlDocument.HtmlElement ScriptBlock() throws ParseException {
 266  
   HtmlDocument.AttributeList alist;
 267  
   HtmlDocument.ElementSequence e;
 268  0
   Token firstToken = getToken(1);
 269  
     try {
 270  0
       jj_consume_token(TAG_START);
 271  0
       jj_consume_token(TAG_SCRIPT);
 272  0
       alist = AttributeList();
 273  0
       jj_consume_token(TAG_END);
 274  0
       token_source.SwitchTo(LexScript);
 275  0
       e = BlockContents();
 276  0
       jj_consume_token(SCRIPT_END);
 277  0
       {if (true) return new HtmlDocument.TagBlock("SCRIPT", alist, e);}
 278  0
     } catch (ParseException ex) {
 279  0
     token_source.SwitchTo(DEFAULT);
 280  0
     String s = getTokenText(firstToken, getNextToken());
 281  0
     {if (true) return new HtmlDocument.Text(s);}
 282  
     }
 283  
     throw new Error("Missing return statement in function");
 284  
   }
 285  
 
 286  
 /** @return the contents of a style block */
 287  
   final public HtmlDocument.HtmlElement StyleBlock() throws ParseException {
 288  
   HtmlDocument.AttributeList alist;
 289  
   HtmlDocument.ElementSequence e;
 290  0
   Token firstToken = getToken(1);
 291  
     try {
 292  0
       jj_consume_token(TAG_START);
 293  0
       jj_consume_token(TAG_STYLE);
 294  0
       alist = AttributeList();
 295  0
       jj_consume_token(TAG_END);
 296  0
       token_source.SwitchTo(LexStyle);
 297  0
       e = BlockContents();
 298  0
       jj_consume_token(STYLE_END);
 299  0
       {if (true) return new HtmlDocument.TagBlock("STYLE", alist, e);}
 300  0
     } catch (ParseException ex) {
 301  0
     token_source.SwitchTo(DEFAULT);
 302  0
     String s = getTokenText(firstToken, getNextToken());
 303  0
     {if (true) return new HtmlDocument.Text(s);}
 304  
     }
 305  
     throw new Error("Missing return statement in function");
 306  
   }
 307  
 
 308  
 /** @return the end of a tag */
 309  
   final public HtmlDocument.HtmlElement EndTag() throws ParseException {
 310  
   Token t;
 311  0
   Token firstToken = getToken(1);
 312  
     try {
 313  0
       jj_consume_token(ENDTAG_START);
 314  0
       t = jj_consume_token(TAG_NAME);
 315  0
       jj_consume_token(TAG_END);
 316  0
       {if (true) return new HtmlDocument.EndTag(t.image);}
 317  0
     } catch (ParseException ex) {
 318  0
     token_source.SwitchTo(DEFAULT);
 319  0
     String s = getTokenText(firstToken, getNextToken());
 320  0
     {if (true) return new HtmlDocument.Text(s);}
 321  
     }
 322  
     throw new Error("Missing return statement in function");
 323  
   }
 324  
 
 325  
 /** @return the start of a comment tag */
 326  
   final public HtmlDocument.Comment CommentTag() throws ParseException {
 327  
   Token t;
 328  0
   StringBuffer s = new StringBuffer("--");
 329  0
     jj_consume_token(COMMENT_START);
 330  
     label_4:
 331  
     while (true) {
 332  0
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
 333  
       case DASH:
 334  
       case COMMENT_EOL:
 335  
       case COMMENT_WORD:
 336  
         ;
 337  0
         break;
 338  
       default:
 339  0
         jj_la1[8] = jj_gen;
 340  0
         break label_4;
 341  
       }
 342  0
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
 343  
       case DASH:
 344  0
         t = jj_consume_token(DASH);
 345  0
                s.append(t.image);
 346  0
         break;
 347  
       case COMMENT_EOL:
 348  0
         jj_consume_token(COMMENT_EOL);
 349  0
                        s.append(NL);
 350  0
         break;
 351  
       case COMMENT_WORD:
 352  0
         t = jj_consume_token(COMMENT_WORD);
 353  0
                          s.append(t.image);
 354  0
         break;
 355  
       default:
 356  0
         jj_la1[9] = jj_gen;
 357  0
         jj_consume_token(-1);
 358  0
         throw new ParseException();
 359  
       }
 360  
     }
 361  0
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
 362  
     case 0:
 363  0
       jj_consume_token(0);
 364  0
       break;
 365  
     case COMMENT_END:
 366  0
       jj_consume_token(COMMENT_END);
 367  0
       break;
 368  
     default:
 369  0
       jj_la1[10] = jj_gen;
 370  0
       jj_consume_token(-1);
 371  0
       throw new ParseException();
 372  
     }
 373  0
     {if (true) return new HtmlDocument.Comment(s.append("--").toString());}
 374  
     throw new Error("Missing return statement in function");
 375  
   }
 376  
 
 377  
 /** @return the start of a declaration */
 378  
   final public HtmlDocument.Comment DeclTag() throws ParseException {
 379  
   Token t;
 380  0
     jj_consume_token(DECL_START);
 381  0
     t = jj_consume_token(DECL_ANY);
 382  0
     jj_consume_token(DECL_END);
 383  0
     {if (true) return new HtmlDocument.Comment(t.image);}
 384  
     throw new Error("Missing return statement in function");
 385  
   }
 386  
 
 387  
   private boolean jj_2_1(int xla) {
 388  58
     jj_la = xla; jj_lastpos = jj_scanpos = token;
 389  58
     try { return !jj_3_1(); }
 390  36
     catch(LookaheadSuccess ls) { return true; }
 391  58
     finally { jj_save(0, xla); }
 392  
   }
 393  
 
 394  
   private boolean jj_2_2(int xla) {
 395  22
     jj_la = xla; jj_lastpos = jj_scanpos = token;
 396  22
     try { return !jj_3_2(); }
 397  0
     catch(LookaheadSuccess ls) { return true; }
 398  22
     finally { jj_save(1, xla); }
 399  
   }
 400  
 
 401  
   private boolean jj_2_3(int xla) {
 402  22
     jj_la = xla; jj_lastpos = jj_scanpos = token;
 403  22
     try { return !jj_3_3(); }
 404  0
     catch(LookaheadSuccess ls) { return true; }
 405  22
     finally { jj_save(2, xla); }
 406  
   }
 407  
 
 408  
   private boolean jj_2_4(int xla) {
 409  22
     jj_la = xla; jj_lastpos = jj_scanpos = token;
 410  22
     try { return !jj_3_4(); }
 411  0
     catch(LookaheadSuccess ls) { return true; }
 412  22
     finally { jj_save(3, xla); }
 413  
   }
 414  
 
 415  
   private boolean jj_3_1() {
 416  58
     if (jj_3R_5()) return true;
 417  0
     return false;
 418  
   }
 419  
 
 420  
   private boolean jj_3R_6() {
 421  22
     if (jj_scan_token(TAG_START)) return true;
 422  0
     if (jj_scan_token(TAG_SCRIPT)) return true;
 423  0
     return false;
 424  
   }
 425  
 
 426  
   private boolean jj_3_4() {
 427  22
     if (jj_scan_token(TAG_START)) return true;
 428  0
     if (jj_scan_token(LST_ERROR)) return true;
 429  0
     return false;
 430  
   }
 431  
 
 432  
   private boolean jj_3_3() {
 433  22
     if (jj_3R_7()) return true;
 434  0
     return false;
 435  
   }
 436  
 
 437  
   private boolean jj_3_2() {
 438  22
     if (jj_3R_6()) return true;
 439  0
     return false;
 440  
   }
 441  
 
 442  
   private boolean jj_3R_7() {
 443  22
     if (jj_scan_token(TAG_START)) return true;
 444  0
     if (jj_scan_token(TAG_STYLE)) return true;
 445  0
     return false;
 446  
   }
 447  
 
 448  
   private boolean jj_3R_5() {
 449  58
     if (jj_scan_token(TAG_START)) return true;
 450  36
     if (jj_scan_token(TAG_NAME)) return true;
 451  0
     return false;
 452  
   }
 453  
 
 454  
   /** Generated Token Manager. */
 455  
   public HtmlParserTokenManager token_source;
 456  
   SimpleCharStream jj_input_stream;
 457  
   /** Current token. */
 458  
   public Token token;
 459  
   /** Next token. */
 460  
   public Token jj_nt;
 461  
   private int jj_ntk;
 462  
   private Token jj_scanpos, jj_lastpos;
 463  
   private int jj_la;
 464  
   /** Whether we are looking ahead. */
 465  6
   public boolean lookingAhead = false;
 466  
   // Manually commented out
 467  
   // private boolean jj_semLA;
 468  
   private int jj_gen;
 469  6
   final private int[] jj_la1 = new int[11];
 470  
   static private int[] jj_la1_0;
 471  
   static private int[] jj_la1_1;
 472  
   static {
 473  2
       jj_la1_init_0();
 474  2
       jj_la1_init_1();
 475  2
    }
 476  
    private static void jj_la1_init_0() {
 477  2
       jj_la1_0 = new int[] {0xfc000,0x70000,0x84000,0x10000000,0x2000000,0xc000000,0x0,0x0,0x0,0x0,0x1,};
 478  2
    }
 479  
    private static void jj_la1_init_1() {
 480  2
       jj_la1_1 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x1c00,0x1c00,0x38,0x38,0x4,};
 481  2
    }
 482  6
   final private JJCalls[] jj_2_rtns = new JJCalls[4];
 483  6
   private boolean jj_rescan = false;
 484  6
   private int jj_gc = 0;
 485  
 
 486  
   /** Constructor with InputStream. */
 487  
   public HtmlParser(java.io.InputStream stream) {
 488  6
      this(stream, null);
 489  6
   }
 490  
   /** Constructor with InputStream and supplied encoding */
 491  6
   public HtmlParser(java.io.InputStream stream, String encoding) {
 492  6
     try { jj_input_stream = new SimpleCharStream(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
 493  6
     token_source = new HtmlParserTokenManager(jj_input_stream);
 494  6
     token = new Token();
 495  6
     jj_ntk = -1;
 496  6
     jj_gen = 0;
 497  6
     for (int i = 0; i < 11; i++) jj_la1[i] = -1;
 498  6
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
 499  6
   }
 500  
 
 501  
   /** Reinitialise. */
 502  
   public void ReInit(java.io.InputStream stream) {
 503  0
      ReInit(stream, null);
 504  0
   }
 505  
   /** Reinitialise. */
 506  
   public void ReInit(java.io.InputStream stream, String encoding) {
 507  0
     try { jj_input_stream.ReInit(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
 508  0
     token_source.ReInit(jj_input_stream);
 509  0
     token = new Token();
 510  0
     jj_ntk = -1;
 511  0
     jj_gen = 0;
 512  0
     for (int i = 0; i < 11; i++) jj_la1[i] = -1;
 513  0
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
 514  0
   }
 515  
 
 516  
   /** Constructor. */
 517  0
   public HtmlParser(java.io.Reader stream) {
 518  0
     jj_input_stream = new SimpleCharStream(stream, 1, 1);
 519  0
     token_source = new HtmlParserTokenManager(jj_input_stream);
 520  0
     token = new Token();
 521  0
     jj_ntk = -1;
 522  0
     jj_gen = 0;
 523  0
     for (int i = 0; i < 11; i++) jj_la1[i] = -1;
 524  0
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
 525  0
   }
 526  
 
 527  
   /** Reinitialise. */
 528  
   public void ReInit(java.io.Reader stream) {
 529  0
     jj_input_stream.ReInit(stream, 1, 1);
 530  0
     token_source.ReInit(jj_input_stream);
 531  0
     token = new Token();
 532  0
     jj_ntk = -1;
 533  0
     jj_gen = 0;
 534  0
     for (int i = 0; i < 11; i++) jj_la1[i] = -1;
 535  0
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
 536  0
   }
 537  
 
 538  
   /** Constructor with generated Token Manager. */
 539  0
   public HtmlParser(HtmlParserTokenManager tm) {
 540  0
     token_source = tm;
 541  0
     token = new Token();
 542  0
     jj_ntk = -1;
 543  0
     jj_gen = 0;
 544  0
     for (int i = 0; i < 11; i++) jj_la1[i] = -1;
 545  0
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
 546  0
   }
 547  
 
 548  
   /** Reinitialise. */
 549  
   public void ReInit(HtmlParserTokenManager tm) {
 550  0
     token_source = tm;
 551  0
     token = new Token();
 552  0
     jj_ntk = -1;
 553  0
     jj_gen = 0;
 554  0
     for (int i = 0; i < 11; i++) jj_la1[i] = -1;
 555  0
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
 556  0
   }
 557  
 
 558  
   private Token jj_consume_token(int kind) throws ParseException {
 559  
     Token oldToken;
 560  166
     if ((oldToken = token).next != null) token = token.next;
 561  10
     else token = token.next = token_source.getNextToken();
 562  166
     jj_ntk = -1;
 563  166
     if (token.kind == kind) {
 564  166
       jj_gen++;
 565  166
       if (++jj_gc > 100) {
 566  0
         jj_gc = 0;
 567  0
         for (int i = 0; i < jj_2_rtns.length; i++) {
 568  0
           JJCalls c = jj_2_rtns[i];
 569  0
           while (c != null) {
 570  0
             if (c.gen < jj_gen) c.first = null;
 571  0
             c = c.next;
 572  
           }
 573  
         }
 574  
       }
 575  166
       return token;
 576  
     }
 577  0
     token = oldToken;
 578  0
     jj_kind = kind;
 579  0
     throw generateParseException();
 580  
   }
 581  
 
 582  12
   static private final class LookaheadSuccess extends java.lang.Error {
 583  
     private static final long serialVersionUID = 8768692583578964521L; 
 584  
   }
 585  6
   final private LookaheadSuccess jj_ls = new LookaheadSuccess();
 586  
   private boolean jj_scan_token(int kind) {
 587  160
     if (jj_scanpos == jj_lastpos) {
 588  160
       jj_la--;
 589  160
       if (jj_scanpos.next == null) {
 590  36
         jj_lastpos = jj_scanpos = jj_scanpos.next = token_source.getNextToken();
 591  
       } else {
 592  124
         jj_lastpos = jj_scanpos = jj_scanpos.next;
 593  
       }
 594  
     } else {
 595  0
       jj_scanpos = jj_scanpos.next;
 596  
     }
 597  160
     if (jj_rescan) {
 598  0
       int i = 0; Token tok = token;
 599  0
       while (tok != null && tok != jj_scanpos) { i++; tok = tok.next; }
 600  0
       if (tok != null) jj_add_error_token(kind, i);
 601  
     }
 602  160
     if (jj_scanpos.kind != kind) return true;
 603  72
     if (jj_la == 0 && jj_scanpos == jj_lastpos) throw jj_ls;
 604  36
     return false;
 605  
   }
 606  
 
 607  
 
 608  
 /** Get the next Token. */
 609  
   final public Token getNextToken() {
 610  0
     if (token.next != null) token = token.next;
 611  0
     else token = token.next = token_source.getNextToken();
 612  0
     jj_ntk = -1;
 613  0
     jj_gen++;
 614  0
     return token;
 615  
   }
 616  
 
 617  
 /** Get the specific Token. */
 618  
   final public Token getToken(int index) {
 619  36
     Token t = lookingAhead ? jj_scanpos : token;
 620  72
     for (int i = 0; i < index; i++) {
 621  36
       if (t.next != null) t = t.next;
 622  0
       else t = t.next = token_source.getNextToken();
 623  
     }
 624  36
     return t;
 625  
   }
 626  
 
 627  
   private int jj_ntk() {
 628  120
     if ((jj_nt=token.next) == null)
 629  120
       return (jj_ntk = (token.next=token_source.getNextToken()).kind);
 630  
     else
 631  0
       return (jj_ntk = jj_nt.kind);
 632  
   }
 633  
 
 634  6
   private java.util.List jj_expentries = new java.util.ArrayList();
 635  
   private int[] jj_expentry;
 636  6
   private int jj_kind = -1;
 637  6
   private int[] jj_lasttokens = new int[100];
 638  
   private int jj_endpos;
 639  
 
 640  
   private void jj_add_error_token(int kind, int pos) {
 641  0
     if (pos >= 100) return;
 642  0
     if (pos == jj_endpos + 1) {
 643  0
       jj_lasttokens[jj_endpos++] = kind;
 644  0
     } else if (jj_endpos != 0) {
 645  0
       jj_expentry = new int[jj_endpos];
 646  0
       for (int i = 0; i < jj_endpos; i++) {
 647  0
         jj_expentry[i] = jj_lasttokens[i];
 648  
       }
 649  0
       boolean exists = false;
 650  0
       for (java.util.Iterator it = jj_expentries.iterator(); it.hasNext();) {
 651  0
         int[] oldentry = (int[])(it.next());
 652  0
         if (oldentry.length == jj_expentry.length) {
 653  0
           exists = true;
 654  0
           for (int i = 0; i < jj_expentry.length; i++) {
 655  0
             if (oldentry[i] != jj_expentry[i]) {
 656  0
               exists = false;
 657  0
               break;
 658  
             }
 659  
           }
 660  0
           if (exists) break;
 661  
         }
 662  0
       }
 663  0
       if (!exists) jj_expentries.add(jj_expentry);
 664  0
       if (pos != 0) jj_lasttokens[(jj_endpos = pos) - 1] = kind;
 665  
     }
 666  0
   }
 667  
 
 668  
   /** Generate ParseException. */
 669  
   public ParseException generateParseException() {
 670  0
     jj_expentries.clear();
 671  0
     boolean[] la1tokens = new boolean[45];
 672  0
     if (jj_kind >= 0) {
 673  0
       la1tokens[jj_kind] = true;
 674  0
       jj_kind = -1;
 675  
     }
 676  0
     for (int i = 0; i < 11; i++) {
 677  0
       if (jj_la1[i] == jj_gen) {
 678  0
         for (int j = 0; j < 32; j++) {
 679  0
           if ((jj_la1_0[i] & (1<<j)) != 0) {
 680  0
             la1tokens[j] = true;
 681  
           }
 682  0
           if ((jj_la1_1[i] & (1<<j)) != 0) {
 683  0
             la1tokens[32+j] = true;
 684  
           }
 685  
         }
 686  
       }
 687  
     }
 688  0
     for (int i = 0; i < 45; i++) {
 689  0
       if (la1tokens[i]) {
 690  0
         jj_expentry = new int[1];
 691  0
         jj_expentry[0] = i;
 692  0
         jj_expentries.add(jj_expentry);
 693  
       }
 694  
     }
 695  0
     jj_endpos = 0;
 696  0
     jj_rescan_token();
 697  0
     jj_add_error_token(0, 0);
 698  0
     int[][] exptokseq = new int[jj_expentries.size()][];
 699  0
     for (int i = 0; i < jj_expentries.size(); i++) {
 700  0
       exptokseq[i] = (int[])jj_expentries.get(i);
 701  
     }
 702  0
     return new ParseException(token, exptokseq, tokenImage);
 703  
   }
 704  
 
 705  
   /** Enable tracing. */
 706  
   final public void enable_tracing() {
 707  0
   }
 708  
 
 709  
   /** Disable tracing. */
 710  
   final public void disable_tracing() {
 711  0
   }
 712  
 
 713  
   private void jj_rescan_token() {
 714  0
     jj_rescan = true;
 715  0
     for (int i = 0; i < 4; i++) {
 716  
     try {
 717  0
       JJCalls p = jj_2_rtns[i];
 718  
       do {
 719  0
         if (p.gen > jj_gen) {
 720  0
           jj_la = p.arg; jj_lastpos = jj_scanpos = p.first;
 721  0
           switch (i) {
 722  0
             case 0: jj_3_1(); break;
 723  0
             case 1: jj_3_2(); break;
 724  0
             case 2: jj_3_3(); break;
 725  0
             case 3: jj_3_4(); break;
 726  
           }
 727  
         }
 728  0
         p = p.next;
 729  0
       } while (p != null);
 730  0
       } catch(LookaheadSuccess ls) { }
 731  
     }
 732  0
     jj_rescan = false;
 733  0
   }
 734  
 
 735  
   private void jj_save(int index, int xla) {
 736  124
     JJCalls p = jj_2_rtns[index];
 737  124
     while (p.gen > jj_gen) {
 738  0
       if (p.next == null) { p = p.next = new JJCalls(); break; }
 739  0
       p = p.next;
 740  
     }
 741  124
     p.gen = jj_gen + xla - jj_la; p.first = token; p.arg = xla;
 742  124
   }
 743  
 
 744  24
   static final class JJCalls {
 745  
     int gen;
 746  
     Token first;
 747  
     int arg;
 748  
     JJCalls next;
 749  
   }
 750  
 
 751  
 }