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 + -
显示快捷键?