📄 parser.java
字号:
jj_consume_token(SINGLE_LINE_COMMENT);
break;
default:
jj_la1[3] = jj_gen;
;
}
break;
case MULTI_LINE_COMMENT:
jj_consume_token(MULTI_LINE_COMMENT);
break;
case FORMAL_COMMENT:
jj_consume_token(FORMAL_COMMENT);
break;
default:
jj_la1[4] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
} finally {
if (jjtc000) {
jjtree.closeNodeScope(jjtn000, true);
}
}
}
final public void FloatingPointLiteral() throws ParseException {
/*@bgen(jjtree) FloatingPointLiteral */
ASTFloatingPointLiteral jjtn000 = new ASTFloatingPointLiteral(this, JJTFLOATINGPOINTLITERAL);
boolean jjtc000 = true;
jjtree.openNodeScope(jjtn000);
try {
jj_consume_token(FLOATING_POINT_LITERAL);
} finally {
if (jjtc000) {
jjtree.closeNodeScope(jjtn000, true);
}
}
}
final public void IntegerLiteral() throws ParseException {
/*@bgen(jjtree) IntegerLiteral */
ASTIntegerLiteral jjtn000 = new ASTIntegerLiteral(this, JJTINTEGERLITERAL);
boolean jjtc000 = true;
jjtree.openNodeScope(jjtn000);
try {
jj_consume_token(INTEGER_LITERAL);
} finally {
if (jjtc000) {
jjtree.closeNodeScope(jjtn000, true);
}
}
}
final public void StringLiteral() throws ParseException {
/*@bgen(jjtree) StringLiteral */
ASTStringLiteral jjtn000 = new ASTStringLiteral(this, JJTSTRINGLITERAL);
boolean jjtc000 = true;
jjtree.openNodeScope(jjtn000);
try {
jj_consume_token(STRING_LITERAL);
} finally {
if (jjtc000) {
jjtree.closeNodeScope(jjtn000, true);
}
}
}
/**
* This method corresponds to variable
* references in Velocity templates.
* The following are examples of variable
* references that may be found in a
* template:
*
* $foo
* $bar
*
*/
final public void Identifier() throws ParseException {
/*@bgen(jjtree) Identifier */
ASTIdentifier jjtn000 = new ASTIdentifier(this, JJTIDENTIFIER);
boolean jjtc000 = true;
jjtree.openNodeScope(jjtn000);
try {
jj_consume_token(IDENTIFIER);
} finally {
if (jjtc000) {
jjtree.closeNodeScope(jjtn000, true);
}
}
}
final public void Word() throws ParseException {
/*@bgen(jjtree) Word */
ASTWord jjtn000 = new ASTWord(this, JJTWORD);
boolean jjtc000 = true;
jjtree.openNodeScope(jjtn000);
try {
jj_consume_token(WORD);
} finally {
if (jjtc000) {
jjtree.closeNodeScope(jjtn000, true);
}
}
}
/**
* Supports the arguments for the Pluggable Directives
*/
final public int DirectiveArg() throws ParseException {
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case IDENTIFIER:
case LCURLY:
Reference();
{if (true) return ParserTreeConstants.JJTREFERENCE;}
break;
case WORD:
Word();
{if (true) return ParserTreeConstants.JJTWORD;}
break;
case STRING_LITERAL:
StringLiteral();
{if (true) return ParserTreeConstants.JJTSTRINGLITERAL;}
break;
case INTEGER_LITERAL:
IntegerLiteral();
{if (true) return ParserTreeConstants.JJTINTEGERLITERAL;}
break;
default:
jj_la1[5] = jj_gen;
if (jj_2_3(2147483647)) {
IntegerRange();
{if (true) return ParserTreeConstants.JJTINTEGERRANGE;}
} else {
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case FLOATING_POINT_LITERAL:
FloatingPointLiteral();
{if (true) return ParserTreeConstants.JJTFLOATINGPOINTLITERAL;}
break;
case LEFT_CURLEY:
Map();
{if (true) return ParserTreeConstants.JJTMAP;}
break;
case LBRACKET:
ObjectArray();
{if (true) return ParserTreeConstants.JJTOBJECTARRAY;}
break;
case TRUE:
True();
{if (true) return ParserTreeConstants.JJTTRUE;}
break;
case FALSE:
False();
{if (true) return ParserTreeConstants.JJTFALSE;}
break;
default:
jj_la1[6] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
}
}
throw new Error("Missing return statement in function");
}
/**
* Supports the Pluggable Directives
* #foo( arg+ )
*/
final public SimpleNode Directive() throws ParseException {
/*@bgen(jjtree) Directive */
ASTDirective jjtn000 = new ASTDirective(this, JJTDIRECTIVE);
boolean jjtc000 = true;
jjtree.openNodeScope(jjtn000);Token t = null;
int argType;
int argPos = 0;
Directive d;
int directiveType;
boolean isVM = false;
boolean doItNow = false;
try {
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case WORD:
t = jj_consume_token(WORD);
break;
case BRACKETED_WORD:
t = jj_consume_token(BRACKETED_WORD);
break;
default:
jj_la1[7] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
String directiveName;
if (t.kind == ParserConstants.BRACKETED_WORD)
{
directiveName = t.image.substring(2,t.image.length() - 1);
}
else
{
directiveName = t.image.substring(1);
}
d = (Directive) directives.get(directiveName);
/*
* Velocimacro support : if the directive is macro directive
* then set the flag so after the block parsing, we add the VM
* right then. (So available if used w/in the current template )
*/
if (directiveName.equals("macro"))
{
doItNow = true;
}
/*
* set the directive name from here. No reason for the thing to know
* about parser tokens
*/
jjtn000.setDirectiveName(directiveName);
if ( d == null)
{
/*
* if null, then not a real directive, but maybe a Velocimacro
*/
isVM = rsvc.isVelocimacro(directiveName, currentTemplateName);
if (!isVM)
{
token_source.stateStackPop();
token_source.inDirective = false;
{if (true) return jjtn000;}
}
/*
* Currently, all VMs are LINE directives
*/
directiveType = Directive.LINE;
}
else
{
directiveType = d.getType();
}
/*
* now, switch us out of PRE_DIRECTIVE
*/
token_source.SwitchTo(DIRECTIVE);
argPos = 0;
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case WHITESPACE:
jj_consume_token(WHITESPACE);
break;
default:
jj_la1[8] = jj_gen;
;
}
jj_consume_token(LPAREN);
label_3:
while (true) {
if (jj_2_4(2)) {
;
} else {
break label_3;
}
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case WHITESPACE:
jj_consume_token(WHITESPACE);
break;
default:
jj_la1[9] = jj_gen;
;
}
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case COMMA:
jj_consume_token(COMMA);
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case WHITESPACE:
jj_consume_token(WHITESPACE);
break;
default:
jj_la1[10] = jj_gen;
;
}
break;
default:
jj_la1[11] = jj_gen;
;
}
argType = DirectiveArg();
if (argType == ParserTreeConstants.JJTWORD)
{
if (doItNow && argPos == 0)
{
/* if a VM and it's the 0th arg... ok */
;
}
else if( (t.image.equals("#foreach") || t.image.equals("#{foreach}") ) && argPos == 1)
{
/* if a foreach and it's the 2nd arg ok */
;
}
else
{
{if (true) throw new MacroParseException("Invalid arg #"
+ argPos + " in "
+ (isVM ? "VM " : "directive " )
+ t.image, currentTemplateName, t);}
}
}
else
{
if (doItNow && argPos == 0)
{
/* if a VM and it's the 0th arg, not ok */
{if (true) throw new MacroParseException("Invalid first arg"
+ " in #macro() directive - must be a"
+ " word token (no \' or \" surrounding)", currentTemplateName, t);}
}
}
argPos++;
}
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case WHITESPACE:
jj_consume_token(WHITESPACE);
break;
default:
jj_la1[12] = jj_gen;
;
}
jj_consume_token(RPAREN);
if (directiveType == Directive.LINE)
{
{if (true) return jjtn000;}
}
ASTBlock jjtn001 = new ASTBlock(this, JJTBLOCK);
boolean jjtc001 = true;
jjtree.openNodeScope(jjtn001);
try {
label_4:
while (true) {
Statement();
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case LPAREN:
case RPAREN:
case ESCAPE_DIRECTIVE:
case SET_DIRECTIVE:
case SINGLE_LINE_COMMENT_START:
case DOUBLE_ESCAPE:
case ESCAPE:
case TEXT:
case FORMAL_COMMENT:
case MULTI_LINE_COMMENT:
case STRING_LITERAL:
case IF_DIRECTIVE:
case STOP_DIRECTIVE:
case INTEGER_LITERAL:
case FLOATING_POINT_LITERAL:
case WORD:
case BRACKETED_WORD:
case IDENTIFIER:
case DOT:
case LCURLY:
case RCURLY:
;
break;
default:
jj_la1[13] = jj_gen;
break label_4;
}
}
} catch (Throwable jjte001) {
if (jjtc001) {
jjtree.clearNodeScope(jjtn001);
jjtc001 = false;
} else {
jjtree.popNode();
}
if (jjte001 instanceof RuntimeException) {
{if (true) throw (RuntimeException)jjte001;}
}
if (jjte001 instanceof ParseException) {
{if (true) throw (ParseException)jjte001;}
}
{if (true) throw (Error)jjte001;}
} finally {
if (jjtc001) {
jjtree.closeNodeScope(jjtn001, true);
}
}
jj_consume_token(END);
jjtree.closeNodeScope(jjtn000, true);
jjtc000 = false;
/*
* VM : if we are processing a #macro directive, we need to
* process the block. In truth, I can just register the name
* and do the work later when init-ing. That would work
* as long as things were always defined before use. This way
* we don't have to worry about forward references and such...
*/
if (doItNow)
{
Macro.processAndRegister(rsvc, t, jjtn000, currentTemplateName);
}
/*
* VM : end
*/
{if (true) return jjtn000;}
} catch (Throwable jjte000) {
if (jjtc000) {
jjtree.clearNodeScope(jjtn000);
jjtc000 = false;
} else {
jjtree.popNode();
}
if (jjte000 instanceof RuntimeException) {
{if (true) throw (RuntimeException)jjte000;}
}
if (jjte000 instanceof ParseException) {
{if (true) throw (ParseException)jjte000;}
}
{if (true) throw (Error)jjte000;}
} finally {
if (jjtc000) {
jjtree.closeNodeScope(jjtn000, true);
}
}
throw new Error("Missing return statement in function");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -