antlrparserplugin.java
来自「Groovy动态语言 运行在JVM中的动态语言 可以方便的处理业务逻辑变化大的业」· Java 代码 · 共 1,753 行 · 第 1/5 页
JAVA
1,753 行
answer = new CaseStatement((Expression) expressions.get(0), statement);
} else {
// multiple cases in casegroup are grouped as an expression
// doesn't seem to mix well with certain case expressions, e.g. regex
ListExpression listExpression = new ListExpression(expressions);
answer = new CaseStatement(listExpression, statement);
}
configureAST(answer, node);
return answer;
}
protected Statement synchronizedStatement(AST syncNode) {
AST node = syncNode.getFirstChild();
Expression expression = expression(node);
Statement code = statement(node.getNextSibling());
SynchronizedStatement synchronizedStatement = new SynchronizedStatement(expression, code);
configureAST(synchronizedStatement, syncNode);
return synchronizedStatement;
}
protected Statement throwStatement(AST node) {
AST expressionNode = node.getFirstChild();
if (expressionNode == null) {
expressionNode = node.getNextSibling();
}
if (expressionNode == null) {
throw new ASTRuntimeException(node, "No expression available");
}
ThrowStatement throwStatement = new ThrowStatement(expression(expressionNode));
configureAST(throwStatement, node);
return throwStatement;
}
protected Statement tryStatement(AST tryStatementNode) {
AST tryNode = tryStatementNode.getFirstChild();
Statement tryStatement = statement(tryNode);
Statement finallyStatement = EmptyStatement.INSTANCE;
AST node = tryNode.getNextSibling();
// lets do the catch nodes
List catches = new ArrayList();
for (; node != null && isType(LITERAL_catch, node); node = node.getNextSibling()) {
catches.add(catchStatement(node));
}
if (isType(LITERAL_finally, node)) {
finallyStatement = statement(node);
node = node.getNextSibling();
}
TryCatchStatement tryCatchStatement = new TryCatchStatement(tryStatement, finallyStatement);
configureAST(tryCatchStatement, tryStatementNode);
for (Iterator iter = catches.iterator(); iter.hasNext();) {
CatchStatement statement = (CatchStatement) iter.next();
tryCatchStatement.addCatch(statement);
}
return tryCatchStatement;
}
protected CatchStatement catchStatement(AST catchNode) {
AST node = catchNode.getFirstChild();
Parameter parameter = parameter(node);
ClassNode exceptionType = parameter.getType();
String variable = parameter.getName();
node = node.getNextSibling();
Statement code = statement(node);
Parameter catchParameter = new Parameter(exceptionType,variable);
CatchStatement answer = new CatchStatement(catchParameter, code);
configureAST(answer, catchNode);
return answer;
}
protected Statement whileStatement(AST whileNode) {
AST node = whileNode.getFirstChild();
assertNodeType(EXPR, node);
BooleanExpression booleanExpression = booleanExpression(node);
node = node.getNextSibling();
Statement block = statement(node);
WhileStatement whileStatement = new WhileStatement(booleanExpression, block);
configureAST(whileStatement, whileNode);
return whileStatement;
}
protected Statement withStatement(AST node) {
notImplementedYet(node);
return null; /** TODO */
}
// Expressions
//-------------------------------------------------------------------------
protected Expression expression(AST node) {
return expression(node,false);
}
protected Expression expression(AST node, boolean convertToConstant) {
Expression expression = expressionSwitch(node);
if (convertToConstant) {
// a method name can never be a VariableExprssion, so it must converted
// to a ConstantExpression then. This is needed as the expression
// method doesn't know we want a ConstantExpression instead of a
// VariableExpression
if ( expression != VariableExpression.THIS_EXPRESSION &&
expression != VariableExpression.SUPER_EXPRESSION &&
expression instanceof VariableExpression)
{
VariableExpression ve = (VariableExpression) expression;
expression = new ConstantExpression(ve.getName());
}
}
configureAST(expression, node);
return expression;
}
protected Expression expressionSwitch(AST node) {
int type = node.getType();
switch (type) {
case EXPR:
return expression(node.getFirstChild());
case ELIST:
return expressionList(node);
case SLIST:
return blockExpression(node);
case CLOSABLE_BLOCK:
return closureExpression(node);
case SUPER_CTOR_CALL:
return specialConstructorCallExpression(node,ClassNode.SUPER);
case METHOD_CALL:
return methodCallExpression(node);
case LITERAL_new:
return constructorCallExpression(node.getFirstChild());
case CTOR_CALL:
return specialConstructorCallExpression(node,ClassNode.THIS);
case QUESTION:
return ternaryExpression(node);
case OPTIONAL_DOT:
case SPREAD_DOT:
case DOT:
return dotExpression(node);
case IDENT:
case LITERAL_boolean:
case LITERAL_byte:
case LITERAL_char:
case LITERAL_double:
case LITERAL_float:
case LITERAL_int:
case LITERAL_long:
case LITERAL_short:
case LITERAL_void:
return variableExpression(node);
case LIST_CONSTRUCTOR:
return listExpression(node);
case MAP_CONSTRUCTOR:
return mapExpression(node);
case LABELED_ARG:
return mapEntryExpression(node);
case SPREAD_ARG:
return spreadExpression(node);
case SPREAD_MAP_ARG:
return spreadMapExpression(node);
// commented out of groovy.g due to non determinisms
//case MEMBER_POINTER_DEFAULT:
// return defaultMethodPointerExpression(node);
case MEMBER_POINTER:
return methodPointerExpression(node);
case INDEX_OP:
return indexExpression(node);
case LITERAL_instanceof:
return instanceofExpression(node);
case LITERAL_as:
return asExpression(node);
case TYPECAST:
return castExpression(node);
// literals
case LITERAL_true:
return ConstantExpression.TRUE;
case LITERAL_false:
return ConstantExpression.FALSE;
case LITERAL_null:
return ConstantExpression.NULL;
case STRING_LITERAL:
ConstantExpression constantExpression = new ConstantExpression(node.getText());
configureAST(constantExpression, node);
return constantExpression;
case STRING_CONSTRUCTOR:
return gstring(node);
case NUM_DOUBLE:
case NUM_FLOAT:
case NUM_BIG_DECIMAL:
return decimalExpression(node);
case NUM_BIG_INT:
case NUM_INT:
case NUM_LONG:
return integerExpression(node);
case LITERAL_this:
return VariableExpression.THIS_EXPRESSION;
case LITERAL_super:
return VariableExpression.SUPER_EXPRESSION;
// Unary expressions
case LNOT:
NotExpression notExpression = new NotExpression(expression(node.getFirstChild()));
configureAST(notExpression, node);
return notExpression;
case UNARY_MINUS:
return negateExpression(node);
case BNOT:
BitwiseNegExpression bitwiseNegExpression = new BitwiseNegExpression(expression(node.getFirstChild()));
configureAST(bitwiseNegExpression, node);
return bitwiseNegExpression;
case UNARY_PLUS:
return expression(node.getFirstChild());
// Prefix expressions
case INC:
return prefixExpression(node, Types.PLUS_PLUS);
case DEC:
return prefixExpression(node, Types.MINUS_MINUS);
// Postfix expressions
case POST_INC:
return postfixExpression(node, Types.PLUS_PLUS);
case POST_DEC:
return postfixExpression(node, Types.MINUS_MINUS);
// Binary expressions
case ASSIGN:
return binaryExpression(Types.ASSIGN, node);
case EQUAL:
return binaryExpression(Types.COMPARE_EQUAL, node);
case NOT_EQUAL:
return binaryExpression(Types.COMPARE_NOT_EQUAL, node);
case COMPARE_TO:
return binaryExpression(Types.COMPARE_TO, node);
case LE:
return binaryExpression(Types.COMPARE_LESS_THAN_EQUAL, node);
case LT:
return binaryExpression(Types.COMPARE_LESS_THAN, node);
case GT:
return binaryExpression(Types.COMPARE_GREATER_THAN, node);
case GE:
return binaryExpression(Types.COMPARE_GREATER_THAN_EQUAL, node);
/**
* TODO treble equal?
return binaryExpression(Types.COMPARE_IDENTICAL, node);
case ???:
return binaryExpression(Types.LOGICAL_AND_EQUAL, node);
case ???:
return binaryExpression(Types.LOGICAL_OR_EQUAL, node);
*/
case LAND:
return binaryExpression(Types.LOGICAL_AND, node);
case LOR:
return binaryExpression(Types.LOGICAL_OR, node);
case BAND:
return binaryExpression(Types.BITWISE_AND, node);
case BAND_ASSIGN:
return binaryExpression(Types.BITWISE_AND_EQUAL, node);
case BOR:
return binaryExpression(Types.BITWISE_OR, node);
case BOR_ASSIGN:
return binaryExpression(Types.BITWISE_OR_EQUAL, node);
case BXOR:
return binaryExpression(Types.BITWISE_XOR, node);
case BXOR_ASSIGN:
return binaryExpression(Types.BITWISE_XOR_EQUAL, node);
case PLUS:
return binaryExpression(Types.PLUS, node);
case PLUS_ASSIGN:
return binaryExpression(Types.PLUS_EQUAL, node);
case MINUS:
return binaryExpression(Types.MINUS, node);
case MINUS_ASSIGN:
return binaryExpression(Types.MINUS_EQUAL, node);
case STAR:
return binaryExpression(Types.MULTIPLY, node);
case STAR_ASSIGN:
return binaryExpression(Types.MULTIPLY_EQUAL, node);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?