antlrparserplugin.java
来自「Groovy动态语言 运行在JVM中的动态语言 可以方便的处理业务逻辑变化大的业」· Java 代码 · 共 1,753 行 · 第 1/5 页
JAVA
1,753 行
case STAR_STAR:
return binaryExpression(Types.POWER, node);
case STAR_STAR_ASSIGN:
return binaryExpression(Types.POWER_EQUAL, node);
case DIV:
return binaryExpression(Types.DIVIDE, node);
case DIV_ASSIGN:
return binaryExpression(Types.DIVIDE_EQUAL, node);
case MOD:
return binaryExpression(Types.MOD, node);
case MOD_ASSIGN:
return binaryExpression(Types.MOD_EQUAL, node);
case SL:
return binaryExpression(Types.LEFT_SHIFT, node);
case SL_ASSIGN:
return binaryExpression(Types.LEFT_SHIFT_EQUAL, node);
case SR:
return binaryExpression(Types.RIGHT_SHIFT, node);
case SR_ASSIGN:
return binaryExpression(Types.RIGHT_SHIFT_EQUAL, node);
case BSR:
return binaryExpression(Types.RIGHT_SHIFT_UNSIGNED, node);
case BSR_ASSIGN:
return binaryExpression(Types.RIGHT_SHIFT_UNSIGNED_EQUAL, node);
// Regex
case REGEX_FIND:
return binaryExpression(Types.FIND_REGEX, node);
case REGEX_MATCH:
return binaryExpression(Types.MATCH_REGEX, node);
// Ranges
case RANGE_INCLUSIVE:
return rangeExpression(node, true);
case RANGE_EXCLUSIVE:
return rangeExpression(node, false);
case DYNAMIC_MEMBER:
return dynamicMemberExpression(node);
case LITERAL_in:
return binaryExpression(Types.KEYWORD_IN,node);
default:
unknownAST(node);
}
return null;
}
protected Expression dynamicMemberExpression(AST dynamicMemberNode) {
AST node = dynamicMemberNode.getFirstChild();
return expression(node);
}
protected Expression ternaryExpression(AST ternaryNode) {
AST node = ternaryNode.getFirstChild();
BooleanExpression booleanExpression = booleanExpression(node);
node = node.getNextSibling();
Expression left = expression(node);
Expression right = expression(node.getNextSibling());
TernaryExpression ternaryExpression = new TernaryExpression(booleanExpression, left, right);
configureAST(ternaryExpression, ternaryNode);
return ternaryExpression;
}
protected Expression variableExpression(AST node) {
String text = node.getText();
// TODO we might wanna only try to resolve the name if we are
// on the left hand side of an expression or before a dot?
VariableExpression variableExpression = new VariableExpression(text);
configureAST(variableExpression, node);
return variableExpression;
}
protected Expression rangeExpression(AST rangeNode, boolean inclusive) {
AST node = rangeNode.getFirstChild();
Expression left = expression(node);
Expression right = expression(node.getNextSibling());
RangeExpression rangeExpression = new RangeExpression(left, right, inclusive);
configureAST(rangeExpression, rangeNode);
return rangeExpression;
}
protected Expression spreadExpression(AST node) {
AST exprNode = node.getFirstChild();
AST listNode = exprNode.getFirstChild();
Expression right = expression(listNode);
SpreadExpression spreadExpression = new SpreadExpression(right);
configureAST(spreadExpression, node);
return spreadExpression;
}
protected Expression spreadMapExpression(AST node) {
AST exprNode = node.getFirstChild();
Expression expr = expression(exprNode);
SpreadMapExpression spreadMapExpression = new SpreadMapExpression(expr);
configureAST(spreadMapExpression, node);
return spreadMapExpression;
}
protected Expression methodPointerExpression(AST node) {
AST exprNode = node.getFirstChild();
String methodName = identifier(exprNode.getNextSibling());
Expression expression = expression(exprNode);
MethodPointerExpression methodPointerExpression = new MethodPointerExpression(expression, methodName);
configureAST(methodPointerExpression, node);
return methodPointerExpression;
}
/* commented out due to groovy.g non-determinisms
protected Expression defaultMethodPointerExpression(AST node) {
AST exprNode = node.getFirstChild();
String methodName = exprNode.toString();
MethodPointerExpression methodPointerExpression = new MethodPointerExpression(null, methodName);
configureAST(methodPointerExpression, node);
return methodPointerExpression;
}
*/
protected Expression listExpression(AST listNode) {
List expressions = new ArrayList();
AST elist = listNode.getFirstChild();
assertNodeType(ELIST, elist);
for (AST node = elist.getFirstChild(); node != null; node = node.getNextSibling()) {
// check for stray labeled arguments:
switch (node.getType()) {
case LABELED_ARG: assertNodeType(COMMA, node); break; // helpful error?
case SPREAD_MAP_ARG: assertNodeType(SPREAD_ARG, node); break; // helpful error
}
expressions.add(expression(node));
}
ListExpression listExpression = new ListExpression(expressions);
configureAST(listExpression, listNode);
return listExpression;
}
/**
* Typically only used for map constructors I think?
*/
protected Expression mapExpression(AST mapNode) {
List expressions = new ArrayList();
AST elist = mapNode.getFirstChild();
if (elist != null) { // totally empty in the case of [:]
assertNodeType(ELIST, elist);
for (AST node = elist.getFirstChild(); node != null; node = node.getNextSibling()) {
switch (node.getType()) {
case LABELED_ARG:
case SPREAD_MAP_ARG:
break; // legal cases
case SPREAD_ARG:
assertNodeType(SPREAD_MAP_ARG, node); break; // helpful error
default:
assertNodeType(LABELED_ARG, node); break; // helpful error
}
expressions.add(mapEntryExpression(node));
}
}
MapExpression mapExpression = new MapExpression(expressions);
configureAST(mapExpression, mapNode);
return mapExpression;
}
protected MapEntryExpression mapEntryExpression(AST node) {
if (node.getType() == SPREAD_MAP_ARG) {
AST rightNode = node.getFirstChild();
Expression keyExpression = spreadMapExpression(node);
Expression rightExpression = expression(rightNode);
MapEntryExpression mapEntryExpression = new MapEntryExpression(keyExpression, rightExpression);
configureAST(mapEntryExpression, node);
return mapEntryExpression;
}
else {
AST keyNode = node.getFirstChild();
Expression keyExpression = expression(keyNode);
AST valueNode = keyNode.getNextSibling();
Expression valueExpression = expression(valueNode);
MapEntryExpression mapEntryExpression = new MapEntryExpression(keyExpression, valueExpression);
configureAST(mapEntryExpression, node);
return mapEntryExpression;
}
}
protected Expression instanceofExpression(AST node) {
AST leftNode = node.getFirstChild();
Expression leftExpression = expression(leftNode);
AST rightNode = leftNode.getNextSibling();
ClassNode type = buildName(rightNode);
assertTypeNotNull(type, rightNode);
Expression rightExpression = new ClassExpression(type);
configureAST(rightExpression, rightNode);
BinaryExpression binaryExpression = new BinaryExpression(leftExpression, makeToken(Types.KEYWORD_INSTANCEOF, node), rightExpression);
configureAST(binaryExpression, node);
return binaryExpression;
}
protected void assertTypeNotNull(ClassNode type, AST rightNode) {
if (type == null) {
throw new ASTRuntimeException(rightNode, "No type available for: " + qualifiedName(rightNode));
}
}
protected Expression asExpression(AST node) {
AST leftNode = node.getFirstChild();
Expression leftExpression = expression(leftNode);
AST rightNode = leftNode.getNextSibling();
ClassNode type = buildName(rightNode);
return CastExpression.asExpression(type, leftExpression);
}
protected Expression castExpression(AST castNode) {
AST node = castNode.getFirstChild();
ClassNode type = buildName(node);
assertTypeNotNull(type, node);
AST expressionNode = node.getNextSibling();
Expression expression = expression(expressionNode);
CastExpression castExpression = new CastExpression(type, expression);
configureAST(castExpression, castNode);
return castExpression;
}
protected Expression indexExpression(AST indexNode) {
AST leftNode = indexNode.getFirstChild();
Expression leftExpression = expression(leftNode);
AST rightNode = leftNode.getNextSibling();
Expression rightExpression = expression(rightNode);
BinaryExpression binaryExpression = new BinaryExpression(leftExpression, makeToken(Types.LEFT_SQUARE_BRACKET, indexNode), rightExpression);
configureAST(binaryExpression, indexNode);
return binaryExpression;
}
protected Expression binaryExpression(int type, AST node) {
Token token = makeToken(type, node);
AST leftNode = node.getFirstChild();
Expression leftExpression = expression(leftNode);
AST rightNode = leftNode.getNextSibling();
if (rightNode == null) {
return leftExpression;
}
if (Types.ofType(type, Types.ASSIGNMENT_OPERATOR)) {
if (leftExpression instanceof VariableExpression || leftExpression.getClass() == PropertyExpression.class
|| leftExpression instanceof FieldExpression
|| leftExpression instanceof AttributeExpression
|| leftExpression instanceof DeclarationExpression) {
// Do nothing.
}
else if (leftExpression instanceof ConstantExpression) {
throw new ASTRuntimeException(node, "\n[" + ((ConstantExpression) leftExpression).getValue() + "] is a constant expression, but it should be a variable expression");
}
else if (leftExpression instanceof BinaryExpression) {
Expression leftexp = ((BinaryExpression) leftExpression).getLeftExpression();
int lefttype = ((BinaryExpression) leftExpression).getOperation().getType();
if (!Types.ofType(lefttype, Types.ASSIGNMENT_OPERATOR) && lefttype != Types.LEFT_SQUARE_BRACKET) {
throw new ASTRuntimeException(node, "\n" + ((BinaryExpression) leftExpression).getText() + " is a binary expression, but it should be a variable expression");
}
}
else if (leftExpression instanceof GStringExpression) {
throw new ASTRuntimeException(node, "\n\"" + ((GStringExpression) leftExpression).getText() + "\" is a GString expression, but it should be a variable expression");
}
else if (leftExpression instanceof MethodCallExpression) {
throw new ASTRuntimeException(node, "\n\"" + ((MethodCallExpression) leftExpression).getText() + "\" is a method call expression, but it should be a variable expression");
}
else if (leftExpression instanceof MapExpression) {
throw new ASTRuntimeException(node, "\n'" + ((MapExpression) leftExpression).getText() + "' is a map expression, but it should be a variable expression");
}
else {
throw new ASTRuntimeException(node, "\n" + leftExpression.getClass() + ", with its value '" + leftExpression.getText() + "', is a bad expression as the LSH of an assignment operator");
}
}
/*if (rightNode == null) {
throw new NullPointerException("No rightNode associated with binary expression");
}*/
Expression rightExpression = expression(rightNode);
BinaryExpression binaryExpression = new BinaryExpression(leftExpression, token, rightExpression);
configureAST(binaryExpression, node);
return binaryExpression;
}
protected Expression prefixExpression(AST node, int token) {
Expression expression = expression(node.getFirstChild());
PrefixExpression prefixExpression = new PrefixExpression(makeToken(token, node), expression);
configureAST(prefixExpression, node);
return prefixExpression;
}
protected Expression postfixExpression(AST node, int token) {
Expression expression = expression(node.getFirstChild());
PostfixExpression postfixExpression = new PostfixExpression(expression, makeToken(token, node));
configureAST(postfixExpression, node);
return postfixExpression;
}
protected BooleanExpression booleanExpression(AST node) {
BooleanExpression booleanExpression = new BooleanExpression(expression(node));
configureAST(booleanExpression, node);
return booleanExpression;
}
protected Expression dotExpression(AST node) {
// lets decide if this is a propery invocation or a method call
AST leftNode = node.getFirstChild();
if (leftNode != null) {
AST identifierNode = leftNode.getNextSibling();
if (identifierNode != null) {
Expression leftExpression = expression(leftNode);
if (isType(SELECT_SLOT, identifierNode)) {
Expression field = expression(identifierNode.getFirstChild(),true);
AttributeExpression attributeExpression = new AttributeExpression(leftExpression, field, node.getType() != DOT);
if (node.getType() == SPREAD_DOT) {
attributeExpression.setSpreadSafe(true);
}
configureAST(attributeExpression, node);
return attributeExpression;
}
Expression property = expression(identifierNode,true);
PropertyExpression propertyExpression = new PropertyExpression(leftExpression, property, node.getType() != DOT);
if (node.getType() == SPREAD_DOT) {
propertyExpression.setSpreadSa
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?