antlrparserplugin.java

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

JAVA
1,799
字号
    }    protected boolean setAccessTrue(AST node, boolean access) {        if (!access) {            return true;        }        else {            throw new ASTRuntimeException(node, "Cannot specify modifier: " + node.getText() + " when access scope has already been defined");        }    }    protected int setModifierBit(AST node, int answer, int bit) {        if ((answer & bit) != 0) {            throw new ASTRuntimeException(node, "Cannot repeat modifier: " + node.getText());        }        return answer | bit;    }    protected AnnotationNode annotation(AST annotationNode) {        AST node = annotationNode.getFirstChild();        String name = identifier(node);        AnnotationNode annotatedNode = new AnnotationNode(ClassHelper.make(name));        configureAST(annotatedNode, node);        while (true) {            node = node.getNextSibling();            if (isType(ANNOTATION_MEMBER_VALUE_PAIR, node)) {                AST memberNode = node.getFirstChild();                String param = identifier(memberNode);                Expression expression = expression(memberNode.getNextSibling());                annotatedNode.addMember(param, expression);            }            else {                break;            }        }        return annotatedNode;    }    // Statements    //-------------------------------------------------------------------------    protected Statement statement(AST node) {        Statement statement = null;        int type = node.getType();        switch (type) {            case SLIST:            case LITERAL_finally:                statement = statementList(node);                break;            case METHOD_CALL:                statement = methodCall(node);                break;            case VARIABLE_DEF:                statement = variableDef(node);                break;            case LABELED_STAT:                statement = labelledStatement(node);                break;            case LITERAL_assert:                statement = assertStatement(node);                break;            case LITERAL_break:                statement = breakStatement(node);                break;            case LITERAL_continue:                statement = continueStatement(node);                break;            case LITERAL_if:                statement = ifStatement(node);                break;            case LITERAL_for:                statement = forStatement(node);                break;            case LITERAL_return:                statement = returnStatement(node);                break;            case LITERAL_synchronized:                statement = synchronizedStatement(node);                break;            case LITERAL_switch:                statement = switchStatement(node);                break;            case LITERAL_with:                statement = withStatement(node);                break;            case LITERAL_try:                statement = tryStatement(node);                break;            case LITERAL_throw:                statement = throwStatement(node);                break;            case LITERAL_while:                statement = whileStatement(node);                break;            default:                statement = new ExpressionStatement(expression(node));        }        if (statement != null) {            configureAST(statement, node);        }        return statement;    }    protected Statement statementList(AST code) {        return statementListNoChild(code.getFirstChild());    }    protected Statement statementListNoChild(AST node) {        BlockStatement block = new BlockStatement();        // no need to configureAST(block,node); as node is probably null        for (; node != null; node = node.getNextSibling()) {            block.addStatement(statement(node));        }        return block;    }    protected Statement assertStatement(AST assertNode) {        AST node = assertNode.getFirstChild();        BooleanExpression booleanExpression = booleanExpression(node);        Expression messageExpression = null;        node = node.getNextSibling();        if (node != null) {            messageExpression = expression(node);        }        else {            messageExpression = ConstantExpression.NULL;        }        AssertStatement assertStatement = new AssertStatement(booleanExpression, messageExpression);        configureAST(assertStatement, assertNode);        return assertStatement;    }    protected Statement breakStatement(AST node) {        BreakStatement breakStatement = new BreakStatement(label(node));        configureAST(breakStatement, node);        return breakStatement;    }    protected Statement continueStatement(AST node) {        ContinueStatement continueStatement = new ContinueStatement(label(node));        configureAST(continueStatement, node);        return continueStatement;    }    protected Statement forStatement(AST forNode) {        AST inNode = forNode.getFirstChild();        AST variableNode = inNode.getFirstChild();        AST collectionNode = variableNode.getNextSibling();        ClassNode type = ClassHelper.OBJECT_TYPE;        if (isType(VARIABLE_DEF, variableNode)) {            AST typeNode = variableNode.getFirstChild();            assertNodeType(TYPE, typeNode);            type = type(typeNode);            variableNode = typeNode.getNextSibling();        }        String variable = identifier(variableNode);        Expression collectionExpression = expression(collectionNode);        Statement block = statement(inNode.getNextSibling());        Parameter forParameter = new Parameter(type,variable);        ForStatement forStatement = new ForStatement(forParameter, collectionExpression, block);        configureAST(forStatement, forNode);        return forStatement;    }    protected Statement ifStatement(AST ifNode) {        AST node = ifNode.getFirstChild();        assertNodeType(EXPR, node);        BooleanExpression booleanExpression = booleanExpression(node);        node = node.getNextSibling();        Statement ifBlock = statement(node);        Statement elseBlock = EmptyStatement.INSTANCE;        node = node.getNextSibling();        if (node != null) {            elseBlock = statement(node);        }        IfStatement ifStatement = new IfStatement(booleanExpression, ifBlock, elseBlock);        configureAST(ifStatement, ifNode);        return ifStatement;    }    protected Statement labelledStatement(AST labelNode) {        AST node = labelNode.getFirstChild();        String label = identifier(node);        Statement statement = statement(node.getNextSibling());        statement.setStatementLabel(label);        return statement;    }    protected Statement methodCall(AST code) {        Expression expression = methodCallExpression(code);        ExpressionStatement expressionStatement = new ExpressionStatement(expression);        configureAST(expressionStatement, code);        return expressionStatement;    }    protected Statement variableDef(AST variableDef) {        AST node = variableDef.getFirstChild();        ClassNode type = null;        if (isType(MODIFIERS, node)) {            node = node.getNextSibling();        }        if (isType(TYPE, node)) {            type = makeType(node);            node = node.getNextSibling();        }        String name = identifier(node);        node = node.getNextSibling();        VariableExpression leftExpression = new VariableExpression(name, type);        configureAST(leftExpression, variableDef);        Expression rightExpression = ConstantExpression.NULL;        if (node != null) {            assertNodeType(ASSIGN, node);            rightExpression = expression(node.getFirstChild());        }        Token token = makeToken(Types.ASSIGN, variableDef);        // TODO should we have a variable declaration statement?        DeclarationExpression expression = new DeclarationExpression(leftExpression, token, rightExpression);        configureAST(expression, variableDef);        ExpressionStatement expressionStatement = new ExpressionStatement(expression);        configureAST(expressionStatement, variableDef);        return expressionStatement;    }    protected Statement returnStatement(AST node) {        AST exprNode = node.getFirstChild();        // This will pick up incorrect sibling node if 'node' is a plain 'return'		//		//if (exprNode == null) {        //    exprNode = node.getNextSibling();        //}        if (exprNode != null) {            Expression expression = expression(exprNode);            if (expression instanceof ConstantExpression) {                ConstantExpression constantExpr = (ConstantExpression) expression;                if (constantExpr.getValue() == null) {                    return ReturnStatement.RETURN_NULL_OR_VOID;                }            }            ReturnStatement returnStatement = new ReturnStatement(expression);            configureAST(returnStatement, node);            return returnStatement;        }        else {            return ReturnStatement.RETURN_NULL_OR_VOID;        }    }    protected Statement switchStatement(AST switchNode) {        AST node = switchNode.getFirstChild();        Expression expression = expression(node);        Statement defaultStatement = EmptyStatement.INSTANCE;        List list = new ArrayList();        for (node = node.getNextSibling(); isType(CASE_GROUP, node); node = node.getNextSibling()) {            AST child = node.getFirstChild();            if (isType(LITERAL_case, child)) {                list.add(caseStatement(child));            }            else {                defaultStatement = statement(child.getNextSibling());            }        }        if (node != null) {            unknownAST(node);        }        SwitchStatement switchStatement = new SwitchStatement(expression, list, defaultStatement);        configureAST(switchStatement, switchNode);        return switchStatement;    }    protected CaseStatement caseStatement(AST node) {        Expression expression = expression(node.getFirstChild());        AST nextSibling = node.getNextSibling();        Statement statement = EmptyStatement.INSTANCE;        if (!isType(LITERAL_default, nextSibling)) {             statement = statement(nextSibling);        }        CaseStatement answer = new CaseStatement(expression, 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;

⌨️ 快捷键说明

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