Search in sources :

Example 6 with BlockStmt

use of kalang.ast.BlockStmt in project kalang by kasonyang.

the class AstBuilder method visitDoWhileStat.

@Override
public AstNode visitDoWhileStat(DoWhileStatContext ctx) {
    BlockStmt loopBody = null;
    if (ctx.blockStmt() != null) {
        loopBody = requireBlock(ctx.blockStmt());
    }
    ExprNode postConditionExpr = visitExpression(ctx.expression());
    LoopStmt ls = new LoopStmt(null, postConditionExpr, loopBody, null);
    mapAst(ls, ctx);
    return ls;
}
Also used : ExprNode(kalang.ast.ExprNode) LoopStmt(kalang.ast.LoopStmt) BlockStmt(kalang.ast.BlockStmt)

Example 7 with BlockStmt

use of kalang.ast.BlockStmt in project kalang by kasonyang.

the class AstBuilder method visitForStat.

@Override
public AstNode visitForStat(ForStatContext ctx) {
    // TODO It seems that here lacks of var stack
    BlockStmt forStmt = newBlock();
    if (ctx.localVarDecl() != null) {
        Statement vars = visitLocalVarDecl(ctx.localVarDecl());
        forStmt.statements.add(vars);
    }
    if (ctx.initExpressions != null) {
        forStmt.statements.addAll(visitExpressions(ctx.initExpressions));
    }
    ExprNode preConditionExpr = ctx.condition != null ? visitExpression(ctx.condition) : null;
    BlockStmt bs = newBlock();
    if (ctx.stat() != null) {
        Statement st = visitStat(ctx.stat());
        if (st instanceof BlockStmt) {
            bs.statements.addAll(((BlockStmt) st).statements);
        }
    }
    popBlock();
    BlockStmt updateBs = newBlock();
    if (ctx.updateExpressions != null) {
        updateBs.statements.addAll(visitExpressions(ctx.updateExpressions));
    }
    popBlock();
    LoopStmt ls = new LoopStmt(preConditionExpr, null, bs, updateBs);
    mapAst(ls, ctx);
    forStmt.statements.add(ls);
    popBlock();
    return forStmt;
}
Also used : ExprNode(kalang.ast.ExprNode) LoopStmt(kalang.ast.LoopStmt) Statement(kalang.ast.Statement) BlockStmt(kalang.ast.BlockStmt)

Example 8 with BlockStmt

use of kalang.ast.BlockStmt in project kalang by kasonyang.

the class AstBuilder method visitInvokeExpr.

@Override
public AstNode visitInvokeExpr(InvokeExprContext ctx) {
    Object target = visit(ctx.target);
    if (target == null)
        return null;
    String mdName = ctx.Identifier().getText();
    String refKey = ctx.refKey.getText();
    if (refKey.equals(".")) {
        if (target instanceof ClassReference) {
            return getStaticInvokeExpr((ClassReference) target, mdName, ctx.params, ctx);
        } else if (target instanceof ExprNode) {
            return getObjectInvokeExpr((ExprNode) target, mdName, ctx.params, ctx);
        } else {
            throw Exceptions.unexceptedValue(target);
        }
    } else if (refKey.equals("->")) {
        ExprNode[] invokeArgs = new ExprNode[3];
        ExprNode[] params = new ExprNode[ctx.params.size()];
        if (target instanceof ClassReference) {
            invokeArgs[0] = new ConstExpr(null);
        } else if (target instanceof ExprNode) {
            invokeArgs[0] = ((ExprNode) target);
        }
        invokeArgs[1] = new ConstExpr(mdName);
        for (int i = 0; i < params.length; i++) {
            params[i] = visitExpression(ctx.params.get(i));
        }
        invokeArgs[2] = createInitializedArray(Types.getRootType(), params);
        ClassNode dispatcherAst = getAst("kalang.runtime.dynamic.MethodDispatcher");
        if (dispatcherAst == null) {
            throw Exceptions.unexceptedException("Runtime library is required!");
        }
        return getStaticInvokeExpr(new ClassReference(dispatcherAst), "invokeMethod", invokeArgs, ctx);
    } else if (refKey.equals("*.")) {
        if (!(target instanceof ExprNode)) {
            handleSyntaxError("expression required", ctx.expression);
            return null;
        }
        ExprNode targetExpr = (ExprNode) target;
        Type targetType = targetExpr.getType();
        if (!(targetType instanceof ArrayType)) {
            handleSyntaxError("array required", ctx.expression);
            return null;
        }
        List<Statement> stats = new LinkedList();
        LocalVarNode varArrLen = this.declareTempLocalVar(Types.INT_TYPE);
        LocalVarNode varCounter = this.declareTempLocalVar(Types.INT_TYPE);
        stats.add(new VarDeclStmt(Arrays.asList(varArrLen, varCounter)));
        VarExpr varArrLenExpr = new VarExpr(varArrLen);
        VarExpr varCounterExpr = new VarExpr(varCounter);
        stats.add(new ExprStmt(new AssignExpr(varArrLenExpr, new ArrayLengthExpr(targetExpr))));
        stats.add(new ExprStmt(new AssignExpr(varCounterExpr, new ConstExpr(0))));
        CompareExpr conditionExpr = new CompareExpr(varCounterExpr, varArrLenExpr, CompareExpr.OP_LT);
        ExprNode targetEleExpr = new ElementExpr(targetExpr, varCounterExpr);
        ExprNode invokeExpr = getObjectInvokeExpr(targetEleExpr, mdName, ctx.params, ctx);
        if (invokeExpr == null)
            return null;
        LocalVarNode varRet = this.declareTempLocalVar(Types.getArrayType(invokeExpr.getType()));
        VarExpr varRetExpr = new VarExpr(varRet);
        stats.add(new VarDeclStmt(varRet));
        stats.add(new ExprStmt(new AssignExpr(varRetExpr, new NewArrayExpr(invokeExpr.getType(), varArrLenExpr))));
        BlockStmt loopBody = this.newBlock();
        loopBody.statements.add(new ExprStmt(new AssignExpr(new ElementExpr(varRetExpr, varCounterExpr), invokeExpr)));
        popBlock();
        BlockStmt updateBs = newBlock();
        updateBs.statements.add(new ExprStmt(new AssignExpr(varCounterExpr, new MathExpr(varCounterExpr, new ConstExpr(1), MathExpr.OP_ADD))));
        this.popBlock();
        LoopStmt loopStmt = new LoopStmt(conditionExpr, null, loopBody, updateBs);
        stats.add(loopStmt);
        return new MultiStmtExpr(stats, varRetExpr);
    } else {
        throw Exceptions.unexceptedException(refKey);
    }
}
Also used : ClassNode(kalang.ast.ClassNode) ConstExpr(kalang.ast.ConstExpr) LoopStmt(kalang.ast.LoopStmt) Statement(kalang.ast.Statement) BlockStmt(kalang.ast.BlockStmt) ArrayLengthExpr(kalang.ast.ArrayLengthExpr) LinkedList(java.util.LinkedList) AssignExpr(kalang.ast.AssignExpr) ExprNode(kalang.ast.ExprNode) ArrayType(kalang.core.ArrayType) MultiStmtExpr(kalang.ast.MultiStmtExpr) WildcardType(kalang.core.WildcardType) ArrayType(kalang.core.ArrayType) ClassType(kalang.core.ClassType) PrimitiveType(kalang.core.PrimitiveType) Type(kalang.core.Type) GenericType(kalang.core.GenericType) ObjectType(kalang.core.ObjectType) ExprStmt(kalang.ast.ExprStmt) CompareExpr(kalang.ast.CompareExpr) NewArrayExpr(kalang.ast.NewArrayExpr) VarDeclStmt(kalang.ast.VarDeclStmt) VarExpr(kalang.ast.VarExpr) VarObject(kalang.ast.VarObject) ClassReference(kalang.ast.ClassReference) LocalVarNode(kalang.ast.LocalVarNode) MathExpr(kalang.ast.MathExpr) ElementExpr(kalang.ast.ElementExpr)

Example 9 with BlockStmt

use of kalang.ast.BlockStmt in project kalang by kasonyang.

the class AstBuilder method visitIfStat.

@Override
public AstNode visitIfStat(IfStatContext ctx) {
    ExprNode expr = visitExpression(ctx.expression());
    if (expr == null) {
        return null;
    }
    Type exprType = expr.getType();
    expr = BoxUtil.assign(expr, expr.getType(), Types.BOOLEAN_TYPE);
    if (expr == null) {
        this.diagnosisReporter.report(Diagnosis.Kind.ERROR, exprType + " cannot be converted to boolean", ctx.expression());
        return null;
    }
    BlockStmt trueBody = null;
    BlockStmt falseBody = null;
    VarTable<VarObject, Integer> trueAssigned, falseAssigned;
    this.nullState = trueAssigned = this.nullState.newStack();
    newOverrideTypeStack();
    onIf(expr, true);
    if (ctx.trueStmt != null) {
        trueBody = requireBlock(ctx.trueStmt);
    }
    popOverrideTypeStack();
    this.nullState = this.nullState.popStack();
    boolean trueReturned = this.returned;
    this.returned = false;
    this.nullState = falseAssigned = this.nullState.newStack();
    newOverrideTypeStack();
    onIf(expr, false);
    if (ctx.falseStmt != null) {
        falseBody = requireBlock(ctx.falseStmt);
    }
    popOverrideTypeStack();
    this.nullState = this.nullState.popStack();
    handleMultiBranchedAssign(trueAssigned.vars(), falseAssigned.vars());
    boolean falseReturned = this.returned;
    if (trueReturned)
        onIf(expr, false);
    if (falseReturned)
        onIf(expr, true);
    this.returned = falseReturned && trueReturned;
    IfStmt ifStmt = new IfStmt(expr, trueBody, falseBody);
    mapAst(ifStmt, ctx);
    return ifStmt;
}
Also used : ExprNode(kalang.ast.ExprNode) WildcardType(kalang.core.WildcardType) ArrayType(kalang.core.ArrayType) ClassType(kalang.core.ClassType) PrimitiveType(kalang.core.PrimitiveType) Type(kalang.core.Type) GenericType(kalang.core.GenericType) ObjectType(kalang.core.ObjectType) IfStmt(kalang.ast.IfStmt) BlockStmt(kalang.ast.BlockStmt) VarObject(kalang.ast.VarObject)

Example 10 with BlockStmt

use of kalang.ast.BlockStmt in project kalang by kasonyang.

the class AstBuilder method visitBlockStmt.

@Override
public AstNode visitBlockStmt(BlockStmtContext ctx) {
    BlockStmt bs = newBlock();
    List<StatContext> stats = ctx.stat();
    if (stats != null) {
        this.visitBlockStmt(stats.toArray(new StatContext[stats.size()]), bs);
    }
    mapAst(bs, ctx);
    popBlock();
    return bs;
}
Also used : BlockStmt(kalang.ast.BlockStmt) IfStatContext(kalang.antlr.KalangParser.IfStatContext) ContinueStatContext(kalang.antlr.KalangParser.ContinueStatContext) ExprStatContext(kalang.antlr.KalangParser.ExprStatContext) WhileStatContext(kalang.antlr.KalangParser.WhileStatContext) BreakStatContext(kalang.antlr.KalangParser.BreakStatContext) StatContext(kalang.antlr.KalangParser.StatContext) TryStatContext(kalang.antlr.KalangParser.TryStatContext) ForStatContext(kalang.antlr.KalangParser.ForStatContext) ReturnStatContext(kalang.antlr.KalangParser.ReturnStatContext) VarDeclStatContext(kalang.antlr.KalangParser.VarDeclStatContext) DoWhileStatContext(kalang.antlr.KalangParser.DoWhileStatContext)

Aggregations

BlockStmt (kalang.ast.BlockStmt)20 ExprNode (kalang.ast.ExprNode)10 ObjectType (kalang.core.ObjectType)7 ExprStmt (kalang.ast.ExprStmt)6 MethodNode (kalang.ast.MethodNode)6 GenericType (kalang.core.GenericType)6 LoopStmt (kalang.ast.LoopStmt)5 ParameterNode (kalang.ast.ParameterNode)5 ArrayType (kalang.core.ArrayType)5 ClassType (kalang.core.ClassType)5 Type (kalang.core.Type)5 AmbiguousMethodException (kalang.AmbiguousMethodException)4 MethodNotFoundException (kalang.MethodNotFoundException)4 AssignExpr (kalang.ast.AssignExpr)4 ParameterExpr (kalang.ast.ParameterExpr)4 ClassNode (kalang.ast.ClassNode)3 ClassReference (kalang.ast.ClassReference)3 Statement (kalang.ast.Statement)3 ThisExpr (kalang.ast.ThisExpr)3 LinkedList (java.util.LinkedList)2