Search in sources :

Example 1 with ForStatement

use of org.beetl.core.statement.ForStatement in project beetl2.0 by javamonkey.

the class AntlrProgramBuilder method parseForSt.

protected Statement parseForSt(ForStContext ctx) {
    pbCtx.enterBlock();
    // break,continue语句到此为止
    pbCtx.current.canStopContinueBreakFlag = true;
    StatementContext forContext = ctx.statement(0);
    StatementContext elseContext = null;
    ForControlContext forTypeCtx = ctx.forControl();
    if (forTypeCtx.forInControl() != null) {
        // for(a in list)...
        ForInControlContext forCtx = forTypeCtx.forInControl();
        VarDefineNode forVar = new VarDefineNode(this.getBTToken(forCtx.Identifier().getSymbol()));
        if (pbCtx.hasDefined(forVar.token.text) != null) {
            GrammarToken token = pbCtx.hasDefined(forVar.token.text);
            BeetlException ex = new BeetlException(BeetlException.VAR_ALREADY_DEFINED, "已经在第" + token.line + "行定义");
            ex.pushToken(forVar.token);
            throw ex;
        }
        VarDefineNode loopStatusVar = new VarDefineNode(new org.beetl.core.statement.GrammarToken(forCtx.Identifier().getSymbol().getText() + "LP", forCtx.Identifier().getSymbol().getLine(), 0));
        if (pbCtx.hasDefined(loopStatusVar.token.text) != null) {
            GrammarToken token = pbCtx.hasDefined(loopStatusVar.token.text);
            BeetlException ex = new BeetlException(BeetlException.VAR_ALREADY_DEFINED, "For循环隐含变量,已经在第" + token.line + "行定义");
            ex.pushToken(loopStatusVar.token);
            throw ex;
        }
        pbCtx.addVarAndPostion(forVar);
        pbCtx.addVarAndPostion(loopStatusVar);
        // //beetl.2 兼容
        // VarDefineNode indexVar = new VarDefineNode(new org.beetl.core.statement.GrammarToken(forCtx.Identifier()
        // .getSymbol().getText()
        // + "_index", forCtx.Identifier().getSymbol().getLine(), 0));
        // 
        // VarDefineNode sizeVar = new VarDefineNode(new org.beetl.core.statement.GrammarToken(forCtx.Identifier()
        // .getSymbol().getText()
        // + "_size", forCtx.Identifier().getSymbol().getLine(), 0));
        // 
        // pbCtx.addVarAndPostion(indexVar);
        // 
        // pbCtx.addVarAndPostion(sizeVar);
        Expression exp = this.parseExpress(forCtx.expression());
        Statement forPart = this.parseStatment(forContext);
        // elsefor
        Statement elseForPart = null;
        if (ctx.Elsefor() != null) {
            elseContext = ctx.statement(1);
            elseForPart = this.parseStatment(elseContext);
        }
        boolean hasSafe = false;
        if (exp instanceof VarRef) {
            VarRef varRef = (VarRef) exp;
            hasSafe = varRef.hasSafe;
        }
        if (pbCtx.isSafeOutput) {
            hasSafe = true;
        }
        ForStatement forStatement = new ForStatement(forVar, exp, hasSafe, forPart, elseForPart, forVar.token);
        this.checkGoto(forStatement);
        pbCtx.exitBlock();
        return forStatement;
    } else {
        GeneralForControlContext forCtx = forTypeCtx.generalForControl();
        Expression[] initExp = null;
        VarAssignStatementSeq varInitSeq = null;
        Expression condtion = null;
        Expression[] updateExp = null;
        if (forCtx.forInit() != null) {
            ForInitContext forInitCtx = forCtx.forInit();
            if (forInitCtx.Var() == null) {
                // for( a=1,b=3;
                List<ExpressionContext> list = forInitCtx.expressionList().expression();
                initExp = this.parseExpressionCtxList(list);
            } else {
                // for( var a=1,b=3;
                VarDeclareListContext varDeclare = forInitCtx.varDeclareList();
                varInitSeq = this.parseVarDeclareList(varDeclare);
            }
        }
        if (forCtx.expression() != null) {
            condtion = this.parseExpress(forCtx.expression());
        }
        if (forCtx.forUpdate() != null) {
            ForUpdateContext updateCtx = forCtx.forUpdate();
            List<ExpressionContext> list = updateCtx.expressionList().expression();
            updateExp = this.parseExpressionCtxList(list);
        }
        Statement forPart = this.parseStatment(forContext);
        // elsefor
        Statement elseForPart = null;
        if (ctx.Elsefor() != null) {
            elseContext = ctx.statement(1);
            elseForPart = this.parseStatment(elseContext);
        }
        String str = forTypeCtx.getText();
        GeneralForStatement forStat = new GeneralForStatement(varInitSeq, initExp, condtion, updateExp, forPart, elseForPart, this.getBTToken(str, forTypeCtx.start.getLine()));
        pbCtx.exitBlock();
        return forStat;
    }
}
Also used : VarRef(org.beetl.core.statement.VarRef) VarAssignStatementSeq(org.beetl.core.statement.VarAssignStatementSeq) BeetlException(org.beetl.core.exception.BeetlException) GrammarToken(org.beetl.core.statement.GrammarToken) ContinueStatement(org.beetl.core.statement.ContinueStatement) DirectiveStatement(org.beetl.core.statement.DirectiveStatement) WhileStatement(org.beetl.core.statement.WhileStatement) AjaxStatement(org.beetl.core.statement.AjaxStatement) BreakStatement(org.beetl.core.statement.BreakStatement) ReturnStatement(org.beetl.core.statement.ReturnStatement) TagVarBindingStatement(org.beetl.core.statement.TagVarBindingStatement) EndStatement(org.beetl.core.statement.EndStatement) VarAssignStatement(org.beetl.core.statement.VarAssignStatement) GeneralForStatement(org.beetl.core.statement.GeneralForStatement) Statement(org.beetl.core.statement.Statement) BlockStatement(org.beetl.core.statement.BlockStatement) IfStatement(org.beetl.core.statement.IfStatement) ForStatement(org.beetl.core.statement.ForStatement) SwitchStatement(org.beetl.core.statement.SwitchStatement) TagStatement(org.beetl.core.statement.TagStatement) VarRefAssignStatement(org.beetl.core.statement.VarRefAssignStatement) SelectStatement(org.beetl.core.statement.SelectStatement) TryCatchStatement(org.beetl.core.statement.TryCatchStatement) ForUpdateContext(org.beetl.core.parser.BeetlParser.ForUpdateContext) ForInitContext(org.beetl.core.parser.BeetlParser.ForInitContext) VarDeclareListContext(org.beetl.core.parser.BeetlParser.VarDeclareListContext) StatementContext(org.beetl.core.parser.BeetlParser.StatementContext) GeneralForControlContext(org.beetl.core.parser.BeetlParser.GeneralForControlContext) GeneralForControlContext(org.beetl.core.parser.BeetlParser.GeneralForControlContext) ForControlContext(org.beetl.core.parser.BeetlParser.ForControlContext) ContentBodyExpression(org.beetl.core.statement.ContentBodyExpression) ArthExpression(org.beetl.core.statement.ArthExpression) JsonMapExpression(org.beetl.core.statement.JsonMapExpression) CompareExpression(org.beetl.core.statement.CompareExpression) FunctionExpression(org.beetl.core.statement.FunctionExpression) IncDecExpression(org.beetl.core.statement.IncDecExpression) Expression(org.beetl.core.statement.Expression) AndExpression(org.beetl.core.statement.AndExpression) StatementExpression(org.beetl.core.statement.StatementExpression) NativeCallExpression(org.beetl.core.statement.NativeCallExpression) NegExpression(org.beetl.core.statement.NegExpression) FormatExpression(org.beetl.core.statement.FormatExpression) TernaryExpression(org.beetl.core.statement.TernaryExpression) OrExpression(org.beetl.core.statement.OrExpression) JsonArrayExpression(org.beetl.core.statement.JsonArrayExpression) NotBooleanExpression(org.beetl.core.statement.NotBooleanExpression) StatementExpressionContext(org.beetl.core.parser.BeetlParser.StatementExpressionContext) ExpressionContext(org.beetl.core.parser.BeetlParser.ExpressionContext) ParExpressionContext(org.beetl.core.parser.BeetlParser.ParExpressionContext) GeneralForStatement(org.beetl.core.statement.GeneralForStatement) VarDefineNode(org.beetl.core.statement.VarDefineNode) GeneralForStatement(org.beetl.core.statement.GeneralForStatement) ForStatement(org.beetl.core.statement.ForStatement) ForInControlContext(org.beetl.core.parser.BeetlParser.ForInControlContext) GrammarToken(org.beetl.core.statement.GrammarToken)

Aggregations

BeetlException (org.beetl.core.exception.BeetlException)1 ExpressionContext (org.beetl.core.parser.BeetlParser.ExpressionContext)1 ForControlContext (org.beetl.core.parser.BeetlParser.ForControlContext)1 ForInControlContext (org.beetl.core.parser.BeetlParser.ForInControlContext)1 ForInitContext (org.beetl.core.parser.BeetlParser.ForInitContext)1 ForUpdateContext (org.beetl.core.parser.BeetlParser.ForUpdateContext)1 GeneralForControlContext (org.beetl.core.parser.BeetlParser.GeneralForControlContext)1 ParExpressionContext (org.beetl.core.parser.BeetlParser.ParExpressionContext)1 StatementContext (org.beetl.core.parser.BeetlParser.StatementContext)1 StatementExpressionContext (org.beetl.core.parser.BeetlParser.StatementExpressionContext)1 VarDeclareListContext (org.beetl.core.parser.BeetlParser.VarDeclareListContext)1 AjaxStatement (org.beetl.core.statement.AjaxStatement)1 AndExpression (org.beetl.core.statement.AndExpression)1 ArthExpression (org.beetl.core.statement.ArthExpression)1 BlockStatement (org.beetl.core.statement.BlockStatement)1 BreakStatement (org.beetl.core.statement.BreakStatement)1 CompareExpression (org.beetl.core.statement.CompareExpression)1 ContentBodyExpression (org.beetl.core.statement.ContentBodyExpression)1 ContinueStatement (org.beetl.core.statement.ContinueStatement)1 DirectiveStatement (org.beetl.core.statement.DirectiveStatement)1