use of kalang.ast.ExprStmt in project kalang by kasonyang.
the class AstBuilder method visitQuestionExpr.
@Override
public AstNode visitQuestionExpr(KalangParser.QuestionExprContext ctx) {
List<Statement> stmts = new LinkedList<>();
ExprNode conditionExpr = (ExprNode) visit(ctx.expression(0));
ExprNode trueExpr = (ExprNode) visit(ctx.expression(1));
ExprNode falseExpr = (ExprNode) visit(ctx.expression(2));
Type trueType = trueExpr.getType();
Type falseType = falseExpr.getType();
Type type;
if (trueType.equals(falseType)) {
type = trueType;
} else {
type = TypeUtil.getCommonType(trueType, falseType);
}
LocalVarNode vo = this.declareTempLocalVar(type);
VarDeclStmt vds = new VarDeclStmt(vo);
stmts.add(vds);
VarExpr ve = new VarExpr(vo);
IfStmt is = new IfStmt(conditionExpr);
is.getTrueBody().statements.add(new ExprStmt(new AssignExpr(ve, trueExpr)));
is.getFalseBody().statements.add(new ExprStmt(new AssignExpr(ve, falseExpr)));
stmts.add(is);
MultiStmtExpr mse = new MultiStmtExpr(stmts, ve);
mapAst(ve, ctx);
return mse;
}
use of kalang.ast.ExprStmt in project kalang by kasonyang.
the class AstBuilder method visitForEachStat.
@Override
public Object visitForEachStat(KalangParser.ForEachStatContext ctx) {
BlockStmt block = newBlock();
ExprNode expr = this.visitExpression(ctx.expression());
Type exprType = expr.getType();
List<TerminalNode> idsCtx = ctx.Identifier();
VarExpr indexVarExpr = null;
TerminalNode varId;
if (idsCtx.size() == 1) {
varId = idsCtx.get(0);
} else {
TerminalNode indexId = idsCtx.get(0);
LocalVarNode indexVar = this.declareLocalVar(indexId.getText(), Types.INT_TYPE, Modifier.FINAL, ctx);
if (indexVar == null)
return null;
block.statements.add(new VarDeclStmt(indexVar));
indexVarExpr = new VarExpr(indexVar);
varId = idsCtx.get(1);
}
LoopStmt loopStmt;
if (exprType instanceof ArrayType) {
LocalVarNode localVarNode = this.declareLocalVar(varId.getText(), ((ArrayType) exprType).getComponentType(), Modifier.FINAL, ctx);
if (localVarNode == null)
return null;
VarExpr localVariable = new VarExpr(localVarNode);
block.statements.add(new VarDeclStmt(localVarNode));
LocalVarNode lenVar = this.declareTempLocalVar(Types.INT_TYPE);
LocalVarNode counterVar = this.declareTempLocalVar(Types.INT_TYPE);
// var len
block.statements.add(new VarDeclStmt(lenVar));
// var i
block.statements.add(new VarDeclStmt(counterVar));
VarExpr counterVarExpr = new VarExpr(counterVar);
VarExpr lenVarExpr = new VarExpr(lenVar);
block.statements.add(new ExprStmt(new AssignExpr(lenVarExpr, new ArrayLengthExpr(expr))));
// l = array.length
block.statements.add(new ExprStmt(new AssignExpr(counterVarExpr, new ConstExpr(0))));
// i=0
ExprNode cnd = new CompareExpr(counterVarExpr, lenVarExpr, CompareExpr.OP_LT);
BlockStmt loopBody = this.newBlock();
loopBody.statements.add(new ExprStmt(new AssignExpr(localVariable, new ElementExpr(expr, counterVarExpr))));
if (indexVarExpr != null) {
loopBody.statements.add(new ExprStmt(new AssignExpr(indexVarExpr, counterVarExpr)));
}
loopBody.statements.add(visitStat(ctx.stat()));
popBlock();
BlockStmt updateBs = newBlock();
// increment counter
updateBs.statements.add(new ExprStmt(new AssignExpr(counterVarExpr, new MathExpr(counterVarExpr, new ConstExpr(1), MathExpr.OP_ADD))));
popBlock();
loopStmt = new LoopStmt(cnd, null, loopBody, updateBs);
} else {
ObjectType iterType = Types.getIterableClassType();
if (iterType.isAssignableFrom(exprType)) {
ObjectInvokeExpr getIterableExpr;
try {
getIterableExpr = ObjectInvokeExpr.create(expr, "iterator", null);
} catch (MethodNotFoundException | AmbiguousMethodException ex) {
throw Exceptions.unexceptedException(ex);
}
LocalVarNode iterableVarNode = this.declareTempLocalVar(getIterableExpr.getType());
block.statements.add(new VarDeclStmt(iterableVarNode));
VarExpr iterableVarExpr = new VarExpr(iterableVarNode);
block.statements.add(new ExprStmt(new AssignExpr(iterableVarExpr, getIterableExpr)));
// set index = 0
if (indexVarExpr != null) {
block.statements.add(new ExprStmt(new AssignExpr(indexVarExpr, new ConstExpr(0))));
}
ObjectInvokeExpr cnd;
try {
cnd = ObjectInvokeExpr.create(iterableVarExpr, "hasNext", null);
} catch (MethodNotFoundException | AmbiguousMethodException ex) {
throw Exceptions.unexceptedException(ex);
}
BlockStmt loopBody = this.newBlock();
ObjectInvokeExpr nextInvokeExpr;
try {
nextInvokeExpr = ObjectInvokeExpr.create(iterableVarExpr, "next", null);
} catch (MethodNotFoundException | AmbiguousMethodException ex) {
throw Exceptions.unexceptedException(ex);
}
LocalVarNode localVarNode = this.declareLocalVar(varId.getText(), nextInvokeExpr.getType(), Modifier.FINAL, ctx);
if (localVarNode == null)
return null;
VarExpr localVariable = new VarExpr(localVarNode);
loopBody.statements.add(new VarDeclStmt(localVarNode));
loopBody.statements.add(new ExprStmt(new AssignExpr(localVariable, new CastExpr(localVariable.getType(), nextInvokeExpr))));
loopBody.statements.add(visitStat(ctx.stat()));
popBlock();
BlockStmt updateBs = newBlock();
if (indexVarExpr != null) {
// do index++
updateBs.statements.add(new ExprStmt(new AssignExpr(indexVarExpr, new MathExpr(indexVarExpr, new ConstExpr(1), BinaryExpr.OP_ADD))));
}
popBlock();
loopStmt = new LoopStmt(cnd, null, loopBody, updateBs);
} else {
this.handleSyntaxError("require array type or iterable type", ctx.expression());
loopStmt = null;
}
}
popBlock();
if (loopStmt != null)
block.statements.add(loopStmt);
return block;
}
use of kalang.ast.ExprStmt in project kalang by kasonyang.
the class AstBuilder method visitExpressions.
@Override
public List<Statement> visitExpressions(ExpressionsContext ctx) {
List<Statement> list = new LinkedList();
for (ExpressionContext e : ctx.expression()) {
ExprNode expr = visitExpression(e);
list.add(new ExprStmt(expr));
}
return list;
}
use of kalang.ast.ExprStmt in project kalang by kasonyang.
the class AstBuilder method visitExprStat.
@Override
public AstNode visitExprStat(ExprStatContext ctx) {
ExprNode expr = visitExpression(ctx.expression());
ExprStmt es = new ExprStmt(expr);
mapAst(es, ctx);
return es;
}
use of kalang.ast.ExprStmt in project kalang by kasonyang.
the class AstUtil method createScriptMainMethodIfNotExists.
public static void createScriptMainMethodIfNotExists(ClassNode clazz) {
ClassType clazzType = Types.getClassType(clazz);
MethodDescriptor[] methods = clazzType.getMethodDescriptors(null, false, false);
Type[] argTypes = new Type[] { Types.getArrayType(Types.getStringClassType()) };
MethodDescriptor mainMethod = MethodUtil.getMethodDescriptor(methods, "main", argTypes);
if (mainMethod == null) {
MethodNode m = clazz.createMethodNode(Types.VOID_TYPE, "main", Modifier.PUBLIC + Modifier.STATIC);
ParameterNode p = m.createParameter(argTypes[0], "arg");
BlockStmt body = m.getBody();
try {
NewObjectExpr newScriptExpr = new NewObjectExpr(clazzType);
ObjectInvokeExpr invokeExpr = ObjectInvokeExpr.create(newScriptExpr, "run", new ExprNode[] { new ParameterExpr(p) });
body.statements.add(new ExprStmt(invokeExpr));
} catch (MethodNotFoundException | AmbiguousMethodException ex) {
throw Exceptions.unexceptedException(ex);
}
}
}
Aggregations