JspParser.java
0001 /* Generated By:JJTree&JavaCC: Do not edit this line. JspParser.java */
0002 package net.sourceforge.pmd.lang.jsp.ast;
0003 
0004 import net.sourceforge.pmd.lang.ast.CharStream;
0005 import net.sourceforge.pmd.lang.ast.TokenMgrError;
0006 
0007 /** 
0008  * JSP Parser for PMD.
0009  @author Pieter, Application Engineers NV/SA, http://www.ae.be
0010  */
0011 public class JspParser/*@bgen(jjtree)*/implements JspParserTreeConstants, JspParserConstants {/*@bgen(jjtree)*/
0012   protected JJTJspParserState jjtree = new JJTJspParserState();
0013         /**
0014    * Return the contents of a quote.
0015    @param quote String - starting and ending with " or '
0016    @return String a substring of quote: quote without the first and list
0017    * character.
0018    */
0019         private static String quoteContent(String quote) {
0020                 return quote.substring(1, quote.length()-1);
0021         }
0022 
0023         /**
0024    * Return the contents of a EL expression or a Value Binding expression.
0025    @param expression String - starting with ${ or #{ and ending with }
0026    @return String a substring of expression: expression without the first two and list
0027    * characters.
0028    */
0029         private static String expressionContent(String expression) {
0030                 return expression.substring(2, expression.length()-1).trim();
0031         }
0032 
0033 /** ******************************************************************** */
0034 /** *************************  JSP GRAMMAR  **************************** */
0035 /** ******************************************************************** */
0036 
0037 /**
0038  * The root of the AST of a JSP.
0039  */
0040   final public ASTCompilationUnit CompilationUnit() throws ParseException {
0041  /*@bgen(jjtree) CompilationUnit */
0042   ASTCompilationUnit jjtn000 = new ASTCompilationUnit(this, JJTCOMPILATIONUNIT);
0043   boolean jjtc000 = true;
0044   jjtree.openNodeScope(jjtn000);
0045     try {
0046       Prolog();
0047       Content();
0048       jj_consume_token(0);
0049     jjtree.closeNodeScope(jjtn000, true);
0050     jjtc000 = false;
0051     {if (truereturn jjtn000;}
0052     catch (Throwable jjte000) {
0053     if (jjtc000) {
0054       jjtree.clearNodeScope(jjtn000);
0055       jjtc000 = false;
0056     else {
0057       jjtree.popNode();
0058     }
0059     if (jjte000 instanceof RuntimeException) {
0060       {if (truethrow (RuntimeException)jjte000;}
0061     }
0062     if (jjte000 instanceof ParseException) {
0063       {if (truethrow (ParseException)jjte000;}
0064     }
0065     {if (truethrow (Error)jjte000;}
0066     finally {
0067     if (jjtc000) {
0068       jjtree.closeNodeScope(jjtn000, true);
0069     }
0070     }
0071     throw new RuntimeException("Missing return statement in function");
0072   }
0073 
0074 /**
0075  * The optional prolog of a JSP, including (xml) declarations and DTD.
0076  */
0077   final public void Prolog() throws ParseException {
0078     if (jj_2_1(2147483647)) {
0079       label_1:
0080       while (true) {
0081         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
0082         case COMMENT_START:
0083         case JSP_COMMENT_START:
0084           ;
0085           break;
0086         default:
0087           jj_la1[0= jj_gen;
0088           break label_1;
0089         }
0090         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
0091         case COMMENT_START:
0092           CommentTag();
0093           break;
0094         case JSP_COMMENT_START:
0095           JspComment();
0096           break;
0097         default:
0098           jj_la1[1= jj_gen;
0099           jj_consume_token(-1);
0100           throw new ParseException();
0101         }
0102       }
0103       Declaration();
0104     else {
0105       ;
0106     }
0107     if (jj_2_2(2147483647)) {
0108       label_2:
0109       while (true) {
0110         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
0111         case COMMENT_START:
0112         case JSP_COMMENT_START:
0113           ;
0114           break;
0115         default:
0116           jj_la1[2= jj_gen;
0117           break label_2;
0118         }
0119         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
0120         case COMMENT_START:
0121           CommentTag();
0122           break;
0123         case JSP_COMMENT_START:
0124           JspComment();
0125           break;
0126         default:
0127           jj_la1[3= jj_gen;
0128           jj_consume_token(-1);
0129           throw new ParseException();
0130         }
0131       }
0132       DoctypeDeclaration();
0133     else {
0134       ;
0135     }
0136   }
0137 
0138 /**
0139  * Everything between a start-tag and the corresponding end-tag of an element.
0140  */
0141   final public void Content() throws ParseException {
0142  /*@bgen(jjtree) Content */
0143   ASTContent jjtn000 = new ASTContent(this, JJTCONTENT);
0144   boolean jjtc000 = true;
0145   jjtree.openNodeScope(jjtn000);
0146     try {
0147       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
0148       case EL_EXPRESSION:
0149       case UNPARSED_TEXT:
0150         Text();
0151         break;
0152       case TAG_START:
0153       case COMMENT_START:
0154       case CDATA_START:
0155       case JSP_COMMENT_START:
0156       case JSP_DECLARATION_START:
0157       case JSP_EXPRESSION_START:
0158       case JSP_SCRIPTLET_START:
0159       case JSP_DIRECTIVE_START:
0160         ContentElementPossiblyWithText();
0161         break;
0162       default:
0163         jj_la1[4= jj_gen;
0164         jj_consume_token(-1);
0165         throw new ParseException();
0166       }
0167       label_3:
0168       while (true) {
0169         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
0170         case TAG_START:
0171         case COMMENT_START:
0172         case CDATA_START:
0173         case JSP_COMMENT_START:
0174         case JSP_DECLARATION_START:
0175         case JSP_EXPRESSION_START:
0176         case JSP_SCRIPTLET_START:
0177         case JSP_DIRECTIVE_START:
0178           ;
0179           break;
0180         default:
0181           jj_la1[5= jj_gen;
0182           break label_3;
0183         }
0184         ContentElementPossiblyWithText();
0185       }
0186     catch (Throwable jjte000) {
0187           if (jjtc000) {
0188             jjtree.clearNodeScope(jjtn000);
0189             jjtc000 = false;
0190           else {
0191             jjtree.popNode();
0192           }
0193           if (jjte000 instanceof RuntimeException) {
0194             {if (truethrow (RuntimeException)jjte000;}
0195           }
0196           if (jjte000 instanceof ParseException) {
0197             {if (truethrow (ParseException)jjte000;}
0198           }
0199           {if (truethrow (Error)jjte000;}
0200     finally {
0201           if (jjtc000) {
0202             jjtree.closeNodeScope(jjtn000, true);
0203           }
0204     }
0205   }
0206 
0207 /**
0208  * A single (non-text) element that can occur between a start- and end-tag of an element.
0209  * Possibly followed by text.
0210  */
0211   final public void ContentElementPossiblyWithText() throws ParseException {
0212     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
0213     case COMMENT_START:
0214       CommentTag();
0215       break;
0216     case TAG_START:
0217       Element();
0218       break;
0219     case CDATA_START:
0220       CData();
0221       break;
0222     case JSP_COMMENT_START:
0223       JspComment();
0224       break;
0225     case JSP_DECLARATION_START:
0226       JspDeclaration();
0227       break;
0228     case JSP_EXPRESSION_START:
0229       JspExpression();
0230       break;
0231     case JSP_SCRIPTLET_START:
0232       JspScriptlet();
0233       break;
0234     case JSP_DIRECTIVE_START:
0235       JspDirective();
0236       break;
0237     default:
0238       jj_la1[6= jj_gen;
0239       jj_consume_token(-1);
0240       throw new ParseException();
0241     }
0242     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
0243     case EL_EXPRESSION:
0244     case UNPARSED_TEXT:
0245       Text();
0246       break;
0247     default:
0248       jj_la1[7= jj_gen;
0249       ;
0250     }
0251   }
0252 
0253   final public void JspDirective() throws ParseException {
0254  /*@bgen(jjtree) JspDirective */
0255         ASTJspDirective jjtn000 = new ASTJspDirective(this, JJTJSPDIRECTIVE);
0256         boolean jjtc000 = true;
0257         jjtree.openNodeScope(jjtn000);Token t;
0258     try {
0259       jj_consume_token(JSP_DIRECTIVE_START);
0260       t = jj_consume_token(JSP_DIRECTIVE_NAME);
0261                                    jjtn000.setName(t.image);
0262       label_4:
0263       while (true) {
0264         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
0265         case JSP_DIRECTIVE_ATTRIBUTE_NAME:
0266           ;
0267           break;
0268         default:
0269           jj_la1[8= jj_gen;
0270           break label_4;
0271         }
0272         JspDirectiveAttribute();
0273       }
0274       jj_consume_token(JSP_DIRECTIVE_END);
0275     catch (Throwable jjte000) {
0276           if (jjtc000) {
0277             jjtree.clearNodeScope(jjtn000);
0278             jjtc000 = false;
0279           else {
0280             jjtree.popNode();
0281           }
0282           if (jjte000 instanceof RuntimeException) {
0283             {if (truethrow (RuntimeException)jjte000;}
0284           }
0285           if (jjte000 instanceof ParseException) {
0286             {if (truethrow (ParseException)jjte000;}
0287           }
0288           {if (truethrow (Error)jjte000;}
0289     finally {
0290           if (jjtc000) {
0291             jjtree.closeNodeScope(jjtn000, true);
0292           }
0293     }
0294   }
0295 
0296   final public void JspDirectiveAttribute() throws ParseException {
0297  /*@bgen(jjtree) JspDirectiveAttribute */
0298         ASTJspDirectiveAttribute jjtn000 = new ASTJspDirectiveAttribute(this, JJTJSPDIRECTIVEATTRIBUTE);
0299         boolean jjtc000 = true;
0300         jjtree.openNodeScope(jjtn000);Token t;
0301     try {
0302       t = jj_consume_token(JSP_DIRECTIVE_ATTRIBUTE_NAME);
0303                                              jjtn000.setName(t.image);
0304       jj_consume_token(JSP_DIRECTIVE_ATTRIBUTE_EQUALS);
0305       t = jj_consume_token(JSP_DIRECTIVE_ATTRIBUTE_VALUE);
0306                                               jjtree.closeNodeScope(jjtn000, true);
0307                                               jjtc000 = false;
0308                                               jjtn000.setValue(quoteContent(t.image));
0309     finally {
0310           if (jjtc000) {
0311             jjtree.closeNodeScope(jjtn000, true);
0312           }
0313     }
0314   }
0315 
0316   final public void JspScriptlet() throws ParseException {
0317  /*@bgen(jjtree) JspScriptlet */
0318         ASTJspScriptlet jjtn000 = new ASTJspScriptlet(this, JJTJSPSCRIPTLET);
0319         boolean jjtc000 = true;
0320         jjtree.openNodeScope(jjtn000);Token t;
0321     try {
0322       jj_consume_token(JSP_SCRIPTLET_START);
0323       t = jj_consume_token(JSP_SCRIPTLET);
0324                               jjtn000.setImage(t.image.trim());
0325       jj_consume_token(JSP_SCRIPTLET_END);
0326     finally {
0327           if (jjtc000) {
0328             jjtree.closeNodeScope(jjtn000, true);
0329           }
0330     }
0331   }
0332 
0333   final public void JspExpression() throws ParseException {
0334  /*@bgen(jjtree) JspExpression */
0335         ASTJspExpression jjtn000 = new ASTJspExpression(this, JJTJSPEXPRESSION);
0336         boolean jjtc000 = true;
0337         jjtree.openNodeScope(jjtn000);Token t;
0338     try {
0339       jj_consume_token(JSP_EXPRESSION_START);
0340       t = jj_consume_token(JSP_EXPRESSION);
0341                                jjtn000.setImage(t.image.trim());
0342       jj_consume_token(JSP_EXPRESSION_END);
0343     finally {
0344           if (jjtc000) {
0345             jjtree.closeNodeScope(jjtn000, true);
0346           }
0347     }
0348   }
0349 
0350   final public void JspDeclaration() throws ParseException {
0351  /*@bgen(jjtree) JspDeclaration */
0352         ASTJspDeclaration jjtn000 = new ASTJspDeclaration(this, JJTJSPDECLARATION);
0353         boolean jjtc000 = true;
0354         jjtree.openNodeScope(jjtn000);Token t;
0355     try {
0356       jj_consume_token(JSP_DECLARATION_START);
0357       t = jj_consume_token(JSP_DECLARATION);
0358                                 jjtn000.setImage(t.image.trim());
0359       jj_consume_token(JSP_DECLARATION_END);
0360     finally {
0361           if (jjtc000) {
0362             jjtree.closeNodeScope(jjtn000, true);
0363           }
0364     }
0365   }
0366 
0367   final public void JspComment() throws ParseException {
0368  /*@bgen(jjtree) JspComment */
0369         ASTJspComment jjtn000 = new ASTJspComment(this, JJTJSPCOMMENT);
0370         boolean jjtc000 = true;
0371         jjtree.openNodeScope(jjtn000);Token t;
0372     try {
0373       jj_consume_token(JSP_COMMENT_START);
0374       t = jj_consume_token(JSP_COMMENT_CONTENT);
0375                                     jjtn000.setImage(t.image.trim());
0376       jj_consume_token(JSP_COMMENT_END);
0377     finally {
0378           if (jjtc000) {
0379             jjtree.closeNodeScope(jjtn000, true);
0380           }
0381     }
0382   }
0383 
0384 /**
0385  * This production groups all characters between two tags, where
0386  * tag is an xml-tag "<...>" or a jsp-page-tag "<%...%>" or CDATA "<![CDATA[...]]>".
0387  * Text consists of unparsed text and/or Expression Language expressions.
0388  */
0389   final public void Text() throws ParseException {
0390  /*@bgen(jjtree) Text */
0391         ASTText jjtn000 = new ASTText(this, JJTTEXT);
0392         boolean jjtc000 = true;
0393         jjtree.openNodeScope(jjtn000);StringBuffer content = new StringBuffer();
0394         String tmp;
0395     try {
0396       label_5:
0397       while (true) {
0398         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
0399         case UNPARSED_TEXT:
0400           tmp = UnparsedText();
0401                                        content.append(tmp);
0402           break;
0403         case EL_EXPRESSION:
0404           tmp = ElExpression();
0405                                        content.append(tmp);
0406           break;
0407         default:
0408           jj_la1[9= jj_gen;
0409           jj_consume_token(-1);
0410           throw new ParseException();
0411         }
0412         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
0413         case EL_EXPRESSION:
0414         case UNPARSED_TEXT:
0415           ;
0416           break;
0417         default:
0418           jj_la1[10= jj_gen;
0419           break label_5;
0420         }
0421       }
0422           jjtree.closeNodeScope(jjtn000, true);
0423           jjtc000 = false;
0424           jjtn000.setImage(content.toString());
0425     catch (Throwable jjte000) {
0426           if (jjtc000) {
0427             jjtree.clearNodeScope(jjtn000);
0428             jjtc000 = false;
0429           else {
0430             jjtree.popNode();
0431           }
0432           if (jjte000 instanceof RuntimeException) {
0433             {if (truethrow (RuntimeException)jjte000;}
0434           }
0435           if (jjte000 instanceof ParseException) {
0436             {if (truethrow (ParseException)jjte000;}
0437           }
0438           {if (truethrow (Error)jjte000;}
0439     finally {
0440           if (jjtc000) {
0441             jjtree.closeNodeScope(jjtn000, true);
0442           }
0443     }
0444   }
0445 
0446   final public String UnparsedText() throws ParseException {
0447  /*@bgen(jjtree) UnparsedText */
0448   ASTUnparsedText jjtn000 = new ASTUnparsedText(this, JJTUNPARSEDTEXT);
0449   boolean jjtc000 = true;
0450   jjtree.openNodeScope(jjtn000);Token t;
0451     try {
0452       t = jj_consume_token(UNPARSED_TEXT);
0453           jjtree.closeNodeScope(jjtn000, true);
0454           jjtc000 = false;
0455                 jjtn000.setImage(t.image);
0456                 {if (truereturn t.image;}
0457     finally {
0458           if (jjtc000) {
0459             jjtree.closeNodeScope(jjtn000, true);
0460           }
0461     }
0462     throw new RuntimeException("Missing return statement in function");
0463   }
0464 
0465 /**
0466  * Text that contains no single quotes, and that does not contain the start
0467  * of a EL expression or value binding.
0468  */
0469   final public String UnparsedTextNoSingleQuotes() throws ParseException {
0470  /*@bgen(jjtree) UnparsedText */
0471   ASTUnparsedText jjtn000 = new ASTUnparsedText(this, JJTUNPARSEDTEXT);
0472   boolean jjtc000 = true;
0473   jjtree.openNodeScope(jjtn000);Token t;
0474     try {
0475       t = jj_consume_token(UNPARSED_TEXT_NO_SINGLE_QUOTES);
0476           jjtree.closeNodeScope(jjtn000, true);
0477           jjtc000 = false;
0478                 jjtn000.setImage(t.image);
0479                 {if (truereturn t.image;}
0480     finally {
0481           if (jjtc000) {
0482             jjtree.closeNodeScope(jjtn000, true);
0483           }
0484     }
0485     throw new RuntimeException("Missing return statement in function");
0486   }
0487 
0488 /**
0489  * Text that contains no double quotes, and that does not contain the start
0490  * of a EL expression or value binding.
0491  */
0492   final public String UnparsedTextNoDoubleQuotes() throws ParseException {
0493  /*@bgen(jjtree) UnparsedText */
0494   ASTUnparsedText jjtn000 = new ASTUnparsedText(this, JJTUNPARSEDTEXT);
0495   boolean jjtc000 = true;
0496   jjtree.openNodeScope(jjtn000);Token t;
0497     try {
0498       t = jj_consume_token(UNPARSED_TEXT_NO_DOUBLE_QUOTES);
0499           jjtree.closeNodeScope(jjtn000, true);
0500           jjtc000 = false;
0501                 jjtn000.setImage(t.image);
0502                 {if (truereturn t.image;}
0503     finally {
0504           if (jjtc000) {
0505             jjtree.closeNodeScope(jjtn000, true);
0506           }
0507     }
0508     throw new RuntimeException("Missing return statement in function");
0509   }
0510 
0511 /**
0512  * An EL expression, not within an attribute value.
0513  */
0514   final public String ElExpression() throws ParseException {
0515  /*@bgen(jjtree) ElExpression */
0516         ASTElExpression jjtn000 = new ASTElExpression(this, JJTELEXPRESSION);
0517         boolean jjtc000 = true;
0518         jjtree.openNodeScope(jjtn000);Token t;
0519     try {
0520       t = jj_consume_token(EL_EXPRESSION);
0521           jjtree.closeNodeScope(jjtn000, true);
0522           jjtc000 = false;
0523                 jjtn000.setImage(expressionContent(t.image));
0524                 {if (truereturn t.image;}
0525     finally {
0526           if (jjtc000) {
0527             jjtree.closeNodeScope(jjtn000, true);
0528           }
0529     }
0530     throw new RuntimeException("Missing return statement in function");
0531   }
0532 
0533   final public String ValueBindingInAttribute() throws ParseException {
0534  /*@bgen(jjtree) ValueBinding */
0535         ASTValueBinding jjtn000 = new ASTValueBinding(this, JJTVALUEBINDING);
0536         boolean jjtc000 = true;
0537         jjtree.openNodeScope(jjtn000);Token t;
0538     try {
0539       t = jj_consume_token(VALUE_BINDING_IN_ATTRIBUTE);
0540           jjtree.closeNodeScope(jjtn000, true);
0541           jjtc000 = false;
0542                 jjtn000.setImage(expressionContent(t.image));
0543                 {if (truereturn t.image;}
0544     finally {
0545           if (jjtc000) {
0546             jjtree.closeNodeScope(jjtn000, true);
0547           }
0548     }
0549     throw new RuntimeException("Missing return statement in function");
0550   }
0551 
0552   final public String ElExpressionInAttribute() throws ParseException {
0553  /*@bgen(jjtree) ElExpression */
0554         ASTElExpression jjtn000 = new ASTElExpression(this, JJTELEXPRESSION);
0555         boolean jjtc000 = true;
0556         jjtree.openNodeScope(jjtn000);Token t;
0557     try {
0558       t = jj_consume_token(EL_EXPRESSION_IN_ATTRIBUTE);
0559           jjtree.closeNodeScope(jjtn000, true);
0560           jjtc000 = false;
0561                 jjtn000.setImage(expressionContent(t.image));
0562                 {if (truereturn t.image;}
0563     finally {
0564           if (jjtc000) {
0565             jjtree.closeNodeScope(jjtn000, true);
0566           }
0567     }
0568     throw new RuntimeException("Missing return statement in function");
0569   }
0570 
0571   final public void CData() throws ParseException {
0572  /*@bgen(jjtree) CData */
0573         ASTCData jjtn000 = new ASTCData(this, JJTCDATA);
0574         boolean jjtc000 = true;
0575         jjtree.openNodeScope(jjtn000);StringBuffer content = new StringBuffer();
0576         Token t;
0577     try {
0578       jj_consume_token(CDATA_START);
0579       label_6:
0580       while (true) {
0581         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
0582         case UNPARSED:
0583           ;
0584           break;
0585         default:
0586           jj_la1[11= jj_gen;
0587           break label_6;
0588         }
0589         t = jj_consume_token(UNPARSED);
0590                                           content.append(t.image);
0591       }
0592       jj_consume_token(CDATA_END);
0593           jjtree.closeNodeScope(jjtn000, true);
0594           jjtc000 = false;
0595                 jjtn000.setImage(content.toString());
0596     finally {
0597           if (jjtc000) {
0598             jjtree.closeNodeScope(jjtn000, true);
0599           }
0600     }
0601   }
0602 
0603 /**
0604  * A XML element, either with a single empty tag, or with a starting and closing tag
0605  * with optional contained content.
0606  */
0607   final public void Element() throws ParseException {
0608  /*@bgen(jjtree) Element */
0609         ASTElement jjtn000 = new ASTElement(this, JJTELEMENT);
0610         boolean jjtc000 = true;
0611         jjtree.openNodeScope(jjtn000);Token startTagName;
0612         Token endTagName;
0613         String tagName;
0614     try {
0615       jj_consume_token(TAG_START);
0616       startTagName = jj_consume_token(TAG_NAME);
0617                                 tagName = startTagName.image; jjtn000.setName(tagName);
0618       label_7:
0619       while (true) {
0620         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
0621         case ATTR_NAME:
0622           ;
0623           break;
0624         default:
0625           jj_la1[12= jj_gen;
0626           break label_7;
0627         }
0628         Attribute();
0629       }
0630       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
0631       case TAG_END:
0632         jj_consume_token(TAG_END);
0633                   jjtn000.setEmpty(false);
0634         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
0635         case TAG_START:
0636         case COMMENT_START:
0637         case CDATA_START:
0638         case JSP_COMMENT_START:
0639         case JSP_DECLARATION_START:
0640         case JSP_EXPRESSION_START:
0641         case JSP_SCRIPTLET_START:
0642         case JSP_DIRECTIVE_START:
0643         case EL_EXPRESSION:
0644         case UNPARSED_TEXT:
0645           Content();
0646           break;
0647         default:
0648           jj_la1[13= jj_gen;
0649           ;
0650         }
0651         jj_consume_token(ENDTAG_START);
0652         endTagName = jj_consume_token(TAG_NAME);
0653                         if (! tagName.equalsIgnoreCase(endTagName.image)) {
0654                                 {if (truethrow new StartAndEndTagMismatchException(
0655                                         startTagName.beginLine, startTagName.beginColumn,
0656                                         startTagName.image,
0657                                         endTagName.beginLine, endTagName.beginColumn,
0658                                         endTagName.image  );}
0659                         }
0660         jj_consume_token(TAG_END);
0661         break;
0662       case TAG_SLASHEND:
0663         jj_consume_token(TAG_SLASHEND);
0664                           jjtree.closeNodeScope(jjtn000, true);
0665                           jjtc000 = false;
0666                           jjtn000.setEmpty(true);
0667         break;
0668       default:
0669         jj_la1[14= jj_gen;
0670         jj_consume_token(-1);
0671         throw new ParseException();
0672       }
0673     catch (Throwable jjte000) {
0674       if (jjtc000) {
0675         jjtree.clearNodeScope(jjtn000);
0676         jjtc000 = false;
0677       else {
0678         jjtree.popNode();
0679       }
0680       if (jjte000 instanceof RuntimeException) {
0681         {if (truethrow (RuntimeException)jjte000;}
0682       }
0683       if (jjte000 instanceof ParseException) {
0684         {if (truethrow (ParseException)jjte000;}
0685       }
0686       {if (truethrow (Error)jjte000;}
0687     finally {
0688       if (jjtc000) {
0689         jjtree.closeNodeScope(jjtn000, true);
0690       }
0691     }
0692   }
0693 
0694   final public void Attribute() throws ParseException {
0695  /*@bgen(jjtree) Attribute */
0696         ASTAttribute jjtn000 = new ASTAttribute(this, JJTATTRIBUTE);
0697         boolean jjtc000 = true;
0698         jjtree.openNodeScope(jjtn000);Token t;
0699     try {
0700       t = jj_consume_token(ATTR_NAME);
0701                     jjtn000.setName(t.image);
0702       jj_consume_token(ATTR_EQ);
0703       AttributeValue();
0704     catch (Throwable jjte000) {
0705     if (jjtc000) {
0706       jjtree.clearNodeScope(jjtn000);
0707       jjtc000 = false;
0708     else {
0709       jjtree.popNode();
0710     }
0711     if (jjte000 instanceof RuntimeException) {
0712       {if (truethrow (RuntimeException)jjte000;}
0713     }
0714     if (jjte000 instanceof ParseException) {
0715       {if (truethrow (ParseException)jjte000;}
0716     }
0717     {if (truethrow (Error)jjte000;}
0718     finally {
0719     if (jjtc000) {
0720       jjtree.closeNodeScope(jjtn000, true);
0721     }
0722     }
0723   }
0724 
0725 /**
0726  * The value of an attribute of an element.
0727  * EL expressions, JSF value bindings, and JSP expressions
0728  * are parsed as sub-nodes of the AttributeValue node.
0729  */
0730   final public void AttributeValue() throws ParseException {
0731  /*@bgen(jjtree) AttributeValue */
0732         ASTAttributeValue jjtn000 = new ASTAttributeValue(this, JJTATTRIBUTEVALUE);
0733         boolean jjtc000 = true;
0734         jjtree.openNodeScope(jjtn000);StringBuffer content = new StringBuffer();
0735         String tmp;
0736         Token t;
0737     try {
0738       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
0739       case DOUBLE_QUOTE:
0740         jj_consume_token(DOUBLE_QUOTE);
0741         label_8:
0742         while (true) {
0743           switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
0744           case EL_EXPRESSION_IN_ATTRIBUTE:
0745           case VALUE_BINDING_IN_ATTRIBUTE:
0746           case JSP_EXPRESSION_IN_ATTRIBUTE:
0747           case UNPARSED_TEXT_NO_DOUBLE_QUOTES:
0748             ;
0749             break;
0750           default:
0751             jj_la1[15= jj_gen;
0752             break label_8;
0753           }
0754           switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
0755           case UNPARSED_TEXT_NO_DOUBLE_QUOTES:
0756             tmp = UnparsedTextNoDoubleQuotes();
0757             break;
0758           case EL_EXPRESSION_IN_ATTRIBUTE:
0759           case VALUE_BINDING_IN_ATTRIBUTE:
0760           case JSP_EXPRESSION_IN_ATTRIBUTE:
0761             tmp = QuoteIndependentAttributeValueContent();
0762             break;
0763           default:
0764             jj_la1[16= jj_gen;
0765             jj_consume_token(-1);
0766             throw new ParseException();
0767           }
0768                             content.append(tmp);
0769         }
0770         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
0771         case ENDING_DOUBLE_QUOTE:
0772           jj_consume_token(ENDING_DOUBLE_QUOTE);
0773           break;
0774         case DOLLAR_OR_HASH_DOUBLE_QUOTE:
0775           t = jj_consume_token(DOLLAR_OR_HASH_DOUBLE_QUOTE);
0776                                                                     content.append(t.image.substring(01));
0777           break;
0778         default:
0779           jj_la1[17= jj_gen;
0780           jj_consume_token(-1);
0781           throw new ParseException();
0782         }
0783         break;
0784       case SINGLE_QUOTE:
0785         jj_consume_token(SINGLE_QUOTE);
0786         label_9:
0787         while (true) {
0788           switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
0789           case EL_EXPRESSION_IN_ATTRIBUTE:
0790           case VALUE_BINDING_IN_ATTRIBUTE:
0791           case JSP_EXPRESSION_IN_ATTRIBUTE:
0792           case UNPARSED_TEXT_NO_SINGLE_QUOTES:
0793             ;
0794             break;
0795           default:
0796             jj_la1[18= jj_gen;
0797             break label_9;
0798           }
0799           switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
0800           case UNPARSED_TEXT_NO_SINGLE_QUOTES:
0801             tmp = UnparsedTextNoSingleQuotes();
0802             break;
0803           case EL_EXPRESSION_IN_ATTRIBUTE:
0804           case VALUE_BINDING_IN_ATTRIBUTE:
0805           case JSP_EXPRESSION_IN_ATTRIBUTE:
0806             tmp = QuoteIndependentAttributeValueContent();
0807             break;
0808           default:
0809             jj_la1[19= jj_gen;
0810             jj_consume_token(-1);
0811             throw new ParseException();
0812           }
0813                             content.append(tmp);
0814         }
0815         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
0816         case ENDING_SINGLE_QUOTE:
0817           jj_consume_token(ENDING_SINGLE_QUOTE);
0818           break;
0819         case DOLLAR_OR_HASH_SINGLE_QUOTE:
0820           t = jj_consume_token(DOLLAR_OR_HASH_SINGLE_QUOTE);
0821                                                                  content.append(t.image.substring(01));
0822           break;
0823         default:
0824           jj_la1[20= jj_gen;
0825           jj_consume_token(-1);
0826           throw new ParseException();
0827         }
0828         break;
0829       default:
0830         jj_la1[21= jj_gen;
0831         jj_consume_token(-1);
0832         throw new ParseException();
0833       }
0834           jjtree.closeNodeScope(jjtn000, true);
0835           jjtc000 = false;
0836           jjtn000.setImagecontent.toString() );
0837     catch (Throwable jjte000) {
0838           if (jjtc000) {
0839             jjtree.clearNodeScope(jjtn000);
0840             jjtc000 = false;
0841           else {
0842             jjtree.popNode();
0843           }
0844           if (jjte000 instanceof RuntimeException) {
0845             {if (truethrow (RuntimeException)jjte000;}
0846           }
0847           if (jjte000 instanceof ParseException) {
0848             {if (truethrow (ParseException)jjte000;}
0849           }
0850           {if (truethrow (Error)jjte000;}
0851     finally {
0852           if (jjtc000) {
0853             jjtree.closeNodeScope(jjtn000, true);
0854           }
0855     }
0856   }
0857 
0858 /**
0859  * Partial content of an attribute value that can contain all quotes.
0860  * This groups EL expressions, value bindings, and JSP expressions.
0861  */
0862   final public String QuoteIndependentAttributeValueContent() throws ParseException {
0863         String tmp;
0864     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
0865     case EL_EXPRESSION_IN_ATTRIBUTE:
0866       tmp = ElExpressionInAttribute();
0867       break;
0868     case VALUE_BINDING_IN_ATTRIBUTE:
0869       tmp = ValueBindingInAttribute();
0870       break;
0871     case JSP_EXPRESSION_IN_ATTRIBUTE:
0872       tmp = JspExpressionInAttribute();
0873       break;
0874     default:
0875       jj_la1[22= jj_gen;
0876       jj_consume_token(-1);
0877       throw new ParseException();
0878     }
0879           {if (truereturn tmp;}
0880     throw new RuntimeException("Missing return statement in function");
0881   }
0882 
0883   final public String JspExpressionInAttribute() throws ParseException {
0884  /*@bgen(jjtree) JspExpressionInAttribute */
0885         ASTJspExpressionInAttribute jjtn000 = new ASTJspExpressionInAttribute(this, JJTJSPEXPRESSIONINATTRIBUTE);
0886         boolean jjtc000 = true;
0887         jjtree.openNodeScope(jjtn000);Token t;
0888     try {
0889       t = jj_consume_token(JSP_EXPRESSION_IN_ATTRIBUTE);
0890           jjtree.closeNodeScope(jjtn000, true);
0891           jjtc000 = false;
0892                 jjtn000.setImage(t.image.substring(3, t.image.length()-2).trim())// without <% and %>
0893                 {if (truereturn t.image;}
0894     finally {
0895           if (jjtc000) {
0896             jjtree.closeNodeScope(jjtn000, true);
0897           }
0898     }
0899     throw new RuntimeException("Missing return statement in function");
0900   }
0901 
0902   final public void CommentTag() throws ParseException {
0903  /*@bgen(jjtree) CommentTag */
0904         ASTCommentTag jjtn000 = new ASTCommentTag(this, JJTCOMMENTTAG);
0905         boolean jjtc000 = true;
0906         jjtree.openNodeScope(jjtn000);StringBuffer content = new StringBuffer();
0907         Token t;
0908     try {
0909       jj_consume_token(COMMENT_START);
0910       label_10:
0911       while (true) {
0912         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
0913         case COMMENT_TEXT:
0914           ;
0915           break;
0916         default:
0917           jj_la1[23= jj_gen;
0918           break label_10;
0919         }
0920         t = jj_consume_token(COMMENT_TEXT);
0921                          content.append(t.image);
0922       }
0923       jj_consume_token(COMMENT_END);
0924           jjtree.closeNodeScope(jjtn000, true);
0925           jjtc000 = false;
0926                 jjtn000.setImage(content.toString().trim());
0927     finally {
0928     if (jjtc000) {
0929       jjtree.closeNodeScope(jjtn000, true);
0930     }
0931     }
0932   }
0933 
0934   final public void Declaration() throws ParseException {
0935  /*@bgen(jjtree) Declaration */
0936         ASTDeclaration jjtn000 = new ASTDeclaration(this, JJTDECLARATION);
0937         boolean jjtc000 = true;
0938         jjtree.openNodeScope(jjtn000);Token t;
0939     try {
0940       jj_consume_token(DECL_START);
0941       t = jj_consume_token(TAG_NAME);
0942                    jjtn000.setName(t.image);
0943       label_11:
0944       while (true) {
0945         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
0946         case ATTR_NAME:
0947           ;
0948           break;
0949         default:
0950           jj_la1[24= jj_gen;
0951           break label_11;
0952         }
0953         Attribute();
0954       }
0955       jj_consume_token(DECL_END);
0956     catch (Throwable jjte000) {
0957     if (jjtc000) {
0958       jjtree.clearNodeScope(jjtn000);
0959       jjtc000 = false;
0960     else {
0961       jjtree.popNode();
0962     }
0963     if (jjte000 instanceof RuntimeException) {
0964       {if (truethrow (RuntimeException)jjte000;}
0965     }
0966     if (jjte000 instanceof ParseException) {
0967       {if (truethrow (ParseException)jjte000;}
0968     }
0969     {if (truethrow (Error)jjte000;}
0970     finally {
0971     if (jjtc000) {
0972       jjtree.closeNodeScope(jjtn000, true);
0973     }
0974     }
0975   }
0976 
0977   final public void DoctypeDeclaration() throws ParseException {
0978  /*@bgen(jjtree) DoctypeDeclaration */
0979         ASTDoctypeDeclaration jjtn000 = new ASTDoctypeDeclaration(this, JJTDOCTYPEDECLARATION);
0980         boolean jjtc000 = true;
0981         jjtree.openNodeScope(jjtn000);Token t;
0982     try {
0983       jj_consume_token(DOCTYPE_DECL_START);
0984       jj_consume_token(WHITESPACES);
0985       t = jj_consume_token(NAME);
0986                       jjtn000.setName(t.image);
0987       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
0988       case WHITESPACES:
0989         jj_consume_token(WHITESPACES);
0990         break;
0991       default:
0992         jj_la1[25= jj_gen;
0993         ;
0994       }
0995       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
0996       case PUBLIC:
0997       case SYSTEM:
0998         DoctypeExternalId();
0999         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1000         case WHITESPACES:
1001           jj_consume_token(WHITESPACES);
1002           break;
1003         default:
1004           jj_la1[26= jj_gen;
1005           ;
1006         }
1007         break;
1008       default:
1009         jj_la1[27= jj_gen;
1010         ;
1011       }
1012       jj_consume_token(DOCTYPE_DECL_END);
1013     catch (Throwable jjte000) {
1014           if (jjtc000) {
1015             jjtree.clearNodeScope(jjtn000);
1016             jjtc000 = false;
1017           else {
1018             jjtree.popNode();
1019           }
1020           if (jjte000 instanceof RuntimeException) {
1021             {if (truethrow (RuntimeException)jjte000;}
1022           }
1023           if (jjte000 instanceof ParseException) {
1024             {if (truethrow (ParseException)jjte000;}
1025           }
1026           {if (truethrow (Error)jjte000;}
1027     finally {
1028           if (jjtc000) {
1029             jjtree.closeNodeScope(jjtn000, true);
1030           }
1031     }
1032   }
1033 
1034   final public void DoctypeExternalId() throws ParseException {
1035  /*@bgen(jjtree) DoctypeExternalId */
1036         ASTDoctypeExternalId jjtn000 = new ASTDoctypeExternalId(this, JJTDOCTYPEEXTERNALID);
1037         boolean jjtc000 = true;
1038         jjtree.openNodeScope(jjtn000);Token systemLiteral;
1039         Token pubIdLiteral;
1040     try {
1041       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1042       case SYSTEM:
1043         jj_consume_token(SYSTEM);
1044         jj_consume_token(WHITESPACES);
1045         systemLiteral = jj_consume_token(QUOTED_LITERAL);
1046                                   jjtree.closeNodeScope(jjtn000, true);
1047                                   jjtc000 = false;
1048                                   jjtn000.setUri(quoteContent(systemLiteral.image));
1049         break;
1050       case PUBLIC:
1051         jj_consume_token(PUBLIC);
1052         jj_consume_token(WHITESPACES);
1053         pubIdLiteral = jj_consume_token(QUOTED_LITERAL);
1054                                   jjtn000.setPublicId(quoteContent(pubIdLiteral.image));
1055         jj_consume_token(WHITESPACES);
1056         systemLiteral = jj_consume_token(QUOTED_LITERAL);
1057                                   jjtree.closeNodeScope(jjtn000, true);
1058                                   jjtc000 = false;
1059                                   jjtn000.setUri(quoteContent(systemLiteral.image));
1060         break;
1061       default:
1062         jj_la1[28= jj_gen;
1063         jj_consume_token(-1);
1064         throw new ParseException();
1065       }
1066     finally {
1067                   if (jjtc000) {
1068                     jjtree.closeNodeScope(jjtn000, true);
1069                   }
1070     }
1071   }
1072 
1073   private boolean jj_2_1(int xla) {
1074     jj_la = xla; jj_lastpos = jj_scanpos = token;
1075     try return !jj_3_1()}
1076     catch(LookaheadSuccess ls) { return true}
1077     finally jj_save(0, xla)}
1078   }
1079 
1080   private boolean jj_2_2(int xla) {
1081     jj_la = xla; jj_lastpos = jj_scanpos = token;
1082     try return !jj_3_2()}
1083     catch(LookaheadSuccess ls) { return true}
1084     finally jj_save(1, xla)}
1085   }
1086 
1087   private boolean jj_3R_30() {
1088     if (jj_scan_token(DOUBLE_QUOTE)) return true;
1089     Token xsp;
1090     while (true) {
1091       xsp = jj_scanpos;
1092       if (jj_3R_32()) { jj_scanpos = xsp; break}
1093     }
1094     xsp = jj_scanpos;
1095     if (jj_scan_token(72)) {
1096     jj_scanpos = xsp;
1097     if (jj_3R_33()) return true;
1098     }
1099     return false;
1100   }
1101 
1102   private boolean jj_3R_29() {
1103     if (jj_scan_token(PUBLIC)) return true;
1104     if (jj_scan_token(WHITESPACES)) return true;
1105     if (jj_scan_token(QUOTED_LITERAL)) return true;
1106     if (jj_scan_token(WHITESPACES)) return true;
1107     if (jj_scan_token(QUOTED_LITERAL)) return true;
1108     return false;
1109   }
1110 
1111   private boolean jj_3R_47() {
1112     if (jj_scan_token(VALUE_BINDING_IN_ATTRIBUTE)) return true;
1113     return false;
1114   }
1115 
1116   private boolean jj_3R_27() {
1117     Token xsp;
1118     xsp = jj_scanpos;
1119     if (jj_3R_30()) {
1120     jj_scanpos = xsp;
1121     if (jj_3R_31()) return true;
1122     }
1123     return false;
1124   }
1125 
1126   private boolean jj_3R_25() {
1127     Token xsp;
1128     xsp = jj_scanpos;
1129     if (jj_3R_28()) {
1130     jj_scanpos = xsp;
1131     if (jj_3R_29()) return true;
1132     }
1133     return false;
1134   }
1135 
1136   private boolean jj_3R_28() {
1137     if (jj_scan_token(SYSTEM)) return true;
1138     if (jj_scan_token(WHITESPACES)) return true;
1139     if (jj_scan_token(QUOTED_LITERAL)) return true;
1140     return false;
1141   }
1142 
1143   private boolean jj_3R_21() {
1144     if (jj_3R_25()) return true;
1145     Token xsp;
1146     xsp = jj_scanpos;
1147     if (jj_scan_token(48)) jj_scanpos = xsp;
1148     return false;
1149   }
1150 
1151   private boolean jj_3R_40() {
1152     if (jj_scan_token(UNPARSED_TEXT_NO_DOUBLE_QUOTES)) return true;
1153     return false;
1154   }
1155 
1156   private boolean jj_3R_15() {
1157     if (jj_scan_token(DOCTYPE_DECL_START)) return true;
1158     if (jj_scan_token(WHITESPACES)) return true;
1159     if (jj_scan_token(NAME)) return true;
1160     Token xsp;
1161     xsp = jj_scanpos;
1162     if (jj_scan_token(48)) jj_scanpos = xsp;
1163     xsp = jj_scanpos;
1164     if (jj_3R_21()) jj_scanpos = xsp;
1165     if (jj_scan_token(DOCTYPE_DECL_END)) return true;
1166     return false;
1167   }
1168 
1169   private boolean jj_3R_24() {
1170     if (jj_scan_token(ATTR_NAME)) return true;
1171     if (jj_scan_token(ATTR_EQ)) return true;
1172     if (jj_3R_27()) return true;
1173     return false;
1174   }
1175 
1176   private boolean jj_3R_20() {
1177     if (jj_3R_23()) return true;
1178     return false;
1179   }
1180 
1181   private boolean jj_3R_42() {
1182     if (jj_scan_token(UNPARSED_TEXT_NO_SINGLE_QUOTES)) return true;
1183     return false;
1184   }
1185 
1186   private boolean jj_3R_18() {
1187     if (jj_3R_24()) return true;
1188     return false;
1189   }
1190 
1191   private boolean jj_3R_13() {
1192     if (jj_scan_token(DECL_START)) return true;
1193     if (jj_scan_token(TAG_NAME)) return true;
1194     Token xsp;
1195     while (true) {
1196       xsp = jj_scanpos;
1197       if (jj_3R_18()) { jj_scanpos = xsp; break}
1198     }
1199     if (jj_scan_token(DECL_END)) return true;
1200     return false;
1201   }
1202 
1203   private boolean jj_3R_17() {
1204     if (jj_3R_23()) return true;
1205     return false;
1206   }
1207 
1208   private boolean jj_3R_26() {
1209     if (jj_scan_token(COMMENT_TEXT)) return true;
1210     return false;
1211   }
1212 
1213   private boolean jj_3R_19() {
1214     if (jj_3R_22()) return true;
1215     return false;
1216   }
1217 
1218   private boolean jj_3R_14() {
1219     Token xsp;
1220     xsp = jj_scanpos;
1221     if (jj_3R_19()) {
1222     jj_scanpos = xsp;
1223     if (jj_3R_20()) return true;
1224     }
1225     return false;
1226   }
1227 
1228   private boolean jj_3R_22() {
1229     if (jj_scan_token(COMMENT_START)) return true;
1230     Token xsp;
1231     while (true) {
1232       xsp = jj_scanpos;
1233       if (jj_3R_26()) { jj_scanpos = xsp; break}
1234     }
1235     if (jj_scan_token(COMMENT_END)) return true;
1236     return false;
1237   }
1238 
1239   private boolean jj_3_2() {
1240     Token xsp;
1241     while (true) {
1242       xsp = jj_scanpos;
1243       if (jj_3R_14()) { jj_scanpos = xsp; break}
1244     }
1245     if (jj_3R_15()) return true;
1246     return false;
1247   }
1248 
1249   private boolean jj_3R_12() {
1250     Token xsp;
1251     xsp = jj_scanpos;
1252     if (jj_3R_16()) {
1253     jj_scanpos = xsp;
1254     if (jj_3R_17()) return true;
1255     }
1256     return false;
1257   }
1258 
1259   private boolean jj_3R_16() {
1260     if (jj_3R_22()) return true;
1261     return false;
1262   }
1263 
1264   private boolean jj_3R_48() {
1265     if (jj_scan_token(JSP_EXPRESSION_IN_ATTRIBUTE)) return true;
1266     return false;
1267   }
1268 
1269   private boolean jj_3R_45() {
1270     if (jj_3R_48()) return true;
1271     return false;
1272   }
1273 
1274   private boolean jj_3_1() {
1275     Token xsp;
1276     while (true) {
1277       xsp = jj_scanpos;
1278       if (jj_3R_12()) { jj_scanpos = xsp; break}
1279     }
1280     if (jj_3R_13()) return true;
1281     return false;
1282   }
1283 
1284   private boolean jj_3R_44() {
1285     if (jj_3R_47()) return true;
1286     return false;
1287   }
1288 
1289   private boolean jj_3R_43() {
1290     if (jj_3R_46()) return true;
1291     return false;
1292   }
1293 
1294   private boolean jj_3R_39() {
1295     if (jj_3R_41()) return true;
1296     return false;
1297   }
1298 
1299   private boolean jj_3R_35() {
1300     if (jj_scan_token(DOLLAR_OR_HASH_SINGLE_QUOTE)) return true;
1301     return false;
1302   }
1303 
1304   private boolean jj_3R_38() {
1305     if (jj_3R_42()) return true;
1306     return false;
1307   }
1308 
1309   private boolean jj_3R_33() {
1310     if (jj_scan_token(DOLLAR_OR_HASH_DOUBLE_QUOTE)) return true;
1311     return false;
1312   }
1313 
1314   private boolean jj_3R_41() {
1315     Token xsp;
1316     xsp = jj_scanpos;
1317     if (jj_3R_43()) {
1318     jj_scanpos = xsp;
1319     if (jj_3R_44()) {
1320     jj_scanpos = xsp;
1321     if (jj_3R_45()) return true;
1322     }
1323     }
1324     return false;
1325   }
1326 
1327   private boolean jj_3R_34() {
1328     Token xsp;
1329     xsp = jj_scanpos;
1330     if (jj_3R_38()) {
1331     jj_scanpos = xsp;
1332     if (jj_3R_39()) return true;
1333     }
1334     return false;
1335   }
1336 
1337   private boolean jj_3R_37() {
1338     if (jj_3R_41()) return true;
1339     return false;
1340   }
1341 
1342   private boolean jj_3R_36() {
1343     if (jj_3R_40()) return true;
1344     return false;
1345   }
1346 
1347   private boolean jj_3R_23() {
1348     if (jj_scan_token(JSP_COMMENT_START)) return true;
1349     if (jj_scan_token(JSP_COMMENT_CONTENT)) return true;
1350     if (jj_scan_token(JSP_COMMENT_END)) return true;
1351     return false;
1352   }
1353 
1354   private boolean jj_3R_32() {
1355     Token xsp;
1356     xsp = jj_scanpos;
1357     if (jj_3R_36()) {
1358     jj_scanpos = xsp;
1359     if (jj_3R_37()) return true;
1360     }
1361     return false;
1362   }
1363 
1364   private boolean jj_3R_31() {
1365     if (jj_scan_token(SINGLE_QUOTE)) return true;
1366     Token xsp;
1367     while (true) {
1368       xsp = jj_scanpos;
1369       if (jj_3R_34()) { jj_scanpos = xsp; break}
1370     }
1371     xsp = jj_scanpos;
1372     if (jj_scan_token(69)) {
1373     jj_scanpos = xsp;
1374     if (jj_3R_35()) return true;
1375     }
1376     return false;
1377   }
1378 
1379   private boolean jj_3R_46() {
1380     if (jj_scan_token(EL_EXPRESSION_IN_ATTRIBUTE)) return true;
1381     return false;
1382   }
1383 
1384   /** Generated Token Manager. */
1385   public JspParserTokenManager token_source;
1386   /** Current token. */
1387   public Token token;
1388   /** Next token. */
1389   public Token jj_nt;
1390   private int jj_ntk;
1391   private Token jj_scanpos, jj_lastpos;
1392   private int jj_la;
1393   private int jj_gen;
1394   final private int[] jj_la1 = new int[29];
1395   static private int[] jj_la1_0;
1396   static private int[] jj_la1_1;
1397   static private int[] jj_la1_2;
1398   static {
1399       jj_la1_init_0();
1400       jj_la1_init_1();
1401       jj_la1_init_2();
1402    }
1403    private static void jj_la1_init_0() {
1404       jj_la1_0 = new int[] {0x11000000,0x11000000,0x11000000,0x11000000,0xf9400000,0xf9400000,0xf9400000,0x0,0x0,0x0,0x0,0x0,0x0,0xf9400000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,};
1405    }
1406    private static void jj_la1_init_1() {
1407       jj_la1_1 = new int[] {0x0,0x0,0x0,0x0,0x7,0x1,0x1,0x6,0x10,0x6,0x6,0x400000,0x4000000,0x7,0x28000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x4000000,0x10000,0x10000,0xc0000,0xc0000,};
1408    }
1409    private static void jj_la1_init_2() {
1410       jj_la1_2 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x21c,0x21c,0x500,0x5c,0x5c,0xa0,0x3,0x1c,0x1000,0x0,0x0,0x0,0x0,0x0,};
1411    }
1412   final private JJCalls[] jj_2_rtns = new JJCalls[2];
1413   private boolean jj_rescan = false;
1414   private int jj_gc = 0;
1415 
1416   /** Constructor with user supplied CharStream. */
1417   public JspParser(CharStream stream) {
1418     token_source = new JspParserTokenManager(stream);
1419     token = new Token();
1420     jj_ntk = -1;
1421     jj_gen = 0;
1422     for (int i = 0; i < 29; i++jj_la1[i= -1;
1423     for (int i = 0; i < jj_2_rtns.length; i++jj_2_rtns[inew JJCalls();
1424   }
1425 
1426   /** Reinitialise. */
1427   public void ReInit(CharStream stream) {
1428     token_source.ReInit(stream);
1429     token = new Token();
1430     jj_ntk = -1;
1431     jjtree.reset();
1432     jj_gen = 0;
1433     for (int i = 0; i < 29; i++jj_la1[i= -1;
1434     for (int i = 0; i < jj_2_rtns.length; i++jj_2_rtns[inew JJCalls();
1435   }
1436 
1437   /** Constructor with generated Token Manager. */
1438   public JspParser(JspParserTokenManager tm) {
1439     token_source = tm;
1440     token = new Token();
1441     jj_ntk = -1;
1442     jj_gen = 0;
1443     for (int i = 0; i < 29; i++jj_la1[i= -1;
1444     for (int i = 0; i < jj_2_rtns.length; i++jj_2_rtns[inew JJCalls();
1445   }
1446 
1447   /** Reinitialise. */
1448   public void ReInit(JspParserTokenManager tm) {
1449     token_source = tm;
1450     token = new Token();
1451     jj_ntk = -1;
1452     jjtree.reset();
1453     jj_gen = 0;
1454     for (int i = 0; i < 29; i++jj_la1[i= -1;
1455     for (int i = 0; i < jj_2_rtns.length; i++jj_2_rtns[inew JJCalls();
1456   }
1457 
1458   private Token jj_consume_token(int kindthrows ParseException {
1459     Token oldToken;
1460     if ((oldToken = token).next != nulltoken = token.next;
1461     else token = token.next = token_source.getNextToken();
1462     jj_ntk = -1;
1463     if (token.kind == kind) {
1464       jj_gen++;
1465       if (++jj_gc > 100) {
1466         jj_gc = 0;
1467         for (int i = 0; i < jj_2_rtns.length; i++) {
1468           JJCalls c = jj_2_rtns[i];
1469           while (c != null) {
1470             if (c.gen < jj_genc.first = null;
1471             c = c.next;
1472           }
1473         }
1474       }
1475       return token;
1476     }
1477     token = oldToken;
1478     jj_kind = kind;
1479     throw generateParseException();
1480   }
1481 
1482   static private final class LookaheadSuccess extends java.lang.Error { }
1483   final private LookaheadSuccess jj_ls = new LookaheadSuccess();
1484   private boolean jj_scan_token(int kind) {
1485     if (jj_scanpos == jj_lastpos) {
1486       jj_la--;
1487       if (jj_scanpos.next == null) {
1488         jj_lastpos = jj_scanpos = jj_scanpos.next = token_source.getNextToken();
1489       else {
1490         jj_lastpos = jj_scanpos = jj_scanpos.next;
1491       }
1492     else {
1493       jj_scanpos = jj_scanpos.next;
1494     }
1495     if (jj_rescan) {
1496       int i = 0; Token tok = token;
1497       while (tok != null && tok != jj_scanpos) { i++; tok = tok.next; }
1498       if (tok != nulljj_add_error_token(kind, i);
1499     }
1500     if (jj_scanpos.kind != kindreturn true;
1501     if (jj_la == && jj_scanpos == jj_lastposthrow jj_ls;
1502     return false;
1503   }
1504 
1505 
1506 /** Get the next Token. */
1507   final public Token getNextToken() {
1508     if (token.next != nulltoken = token.next;
1509     else token = token.next = token_source.getNextToken();
1510     jj_ntk = -1;
1511     jj_gen++;
1512     return token;
1513   }
1514 
1515 /** Get the specific Token. */
1516   final public Token getToken(int index) {
1517     Token t = token;
1518     for (int i = 0; i < index; i++) {
1519       if (t.next != nullt = t.next;
1520       else t = t.next = token_source.getNextToken();
1521     }
1522     return t;
1523   }
1524 
1525   private int jj_ntk() {
1526     if ((jj_nt=token.next== null)
1527       return (jj_ntk = (token.next=token_source.getNextToken()).kind);
1528     else
1529       return (jj_ntk = jj_nt.kind);
1530   }
1531 
1532   private java.util.List jj_expentries = new java.util.ArrayList();
1533   private int[] jj_expentry;
1534   private int jj_kind = -1;
1535   private int[] jj_lasttokens = new int[100];
1536   private int jj_endpos;
1537 
1538   private void jj_add_error_token(int kind, int pos) {
1539     if (pos >= 100return;
1540     if (pos == jj_endpos + 1) {
1541       jj_lasttokens[jj_endpos++= kind;
1542     else if (jj_endpos != 0) {
1543       jj_expentry = new int[jj_endpos];
1544       for (int i = 0; i < jj_endpos; i++) {
1545         jj_expentry[i= jj_lasttokens[i];
1546       }
1547       jj_entries_loop: for (java.util.Iterator it = jj_expentries.iterator(); it.hasNext();) {
1548         int[] oldentry = (int[])(it.next());
1549         if (oldentry.length == jj_expentry.length) {
1550           for (int i = 0; i < jj_expentry.length; i++) {
1551             if (oldentry[i!= jj_expentry[i]) {
1552               continue jj_entries_loop;
1553             }
1554           }
1555           jj_expentries.add(jj_expentry);
1556           break jj_entries_loop;
1557         }
1558       }
1559       if (pos != 0jj_lasttokens[(jj_endpos = pos1= kind;
1560     }
1561   }
1562 
1563   /** Generate ParseException. */
1564   public ParseException generateParseException() {
1565     jj_expentries.clear();
1566     boolean[] la1tokens = new boolean[77];
1567     if (jj_kind >= 0) {
1568       la1tokens[jj_kindtrue;
1569       jj_kind = -1;
1570     }
1571     for (int i = 0; i < 29; i++) {
1572       if (jj_la1[i== jj_gen) {
1573         for (int j = 0; j < 32; j++) {
1574           if ((jj_la1_0[i(1<<j)) != 0) {
1575             la1tokens[jtrue;
1576           }
1577           if ((jj_la1_1[i(1<<j)) != 0) {
1578             la1tokens[32+jtrue;
1579           }
1580           if ((jj_la1_2[i(1<<j)) != 0) {
1581             la1tokens[64+jtrue;
1582           }
1583         }
1584       }
1585     }
1586     for (int i = 0; i < 77; i++) {
1587       if (la1tokens[i]) {
1588         jj_expentry = new int[1];
1589         jj_expentry[0= i;
1590         jj_expentries.add(jj_expentry);
1591       }
1592     }
1593     jj_endpos = 0;
1594     jj_rescan_token();
1595     jj_add_error_token(00);
1596     int[][] exptokseq = new int[jj_expentries.size()][];
1597     for (int i = 0; i < jj_expentries.size(); i++) {
1598       exptokseq[i(int[])jj_expentries.get(i);
1599     }
1600     return new ParseException(token, exptokseq, tokenImage);
1601   }
1602 
1603   /** Enable tracing. */
1604   final public void enable_tracing() {
1605   }
1606 
1607   /** Disable tracing. */
1608   final public void disable_tracing() {
1609   }
1610 
1611   private void jj_rescan_token() {
1612     jj_rescan = true;
1613     for (int i = 0; i < 2; i++) {
1614     try {
1615       JJCalls p = jj_2_rtns[i];
1616       do {
1617         if (p.gen > jj_gen) {
1618           jj_la = p.arg; jj_lastpos = jj_scanpos = p.first;
1619           switch (i) {
1620             case 0: jj_3_1()break;
1621             case 1: jj_3_2()break;
1622           }
1623         }
1624         p = p.next;
1625       while (p != null);
1626       catch(LookaheadSuccess ls) { }
1627     }
1628     jj_rescan = false;
1629   }
1630 
1631   private void jj_save(int index, int xla) {
1632     JJCalls p = jj_2_rtns[index];
1633     while (p.gen > jj_gen) {
1634       if (p.next == null) { p = p.next = new JJCalls()break}
1635       p = p.next;
1636     }
1637     p.gen = jj_gen + xla - jj_la; p.first = token; p.arg = xla;
1638   }
1639 
1640   static final class JJCalls {
1641     int gen;
1642     Token first;
1643     int arg;
1644     JJCalls next;
1645   }
1646 
1647 }