antlrparserplugin.java

来自「大名鼎鼎的java动态脚本语言。已经通过了sun的认证」· Java 代码 · 共 1,799 行 · 第 1/5 页

JAVA
1,799
字号
    }    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) {        Expression expression = expressionSwitch(node);        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 CLOSED_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);            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);            default:                unknownAST(node);        }        return null;    }    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);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?