add binary expressions in ast
This commit is contained in:
parent
0a81315366
commit
d1e39be655
@ -14,6 +14,12 @@ public class BinaryExpression extends AbstractType implements IExpression{
|
|||||||
public IExpression left;
|
public IExpression left;
|
||||||
public IExpression right;
|
public IExpression right;
|
||||||
|
|
||||||
|
public BinaryExpression(String operator, IExpression left, IExpression right) {
|
||||||
|
this.operator = operator;
|
||||||
|
this.left = left;
|
||||||
|
this.right = right;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TypeCheckResult typeCheck() throws Exception {
|
public TypeCheckResult typeCheck() throws Exception {
|
||||||
TypeCheckHelper helper = new TypeCheckHelper();
|
TypeCheckHelper helper = new TypeCheckHelper();
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
package abstractSyntaxTree.Expression;
|
package abstractSyntaxTree.Expression;
|
||||||
|
|
||||||
import TypeCheck.TypeCheckResult;
|
import TypeCheck.TypeCheckResult;
|
||||||
|
import abstractSyntaxTree.Node;
|
||||||
import org.objectweb.asm.MethodVisitor;
|
import org.objectweb.asm.MethodVisitor;
|
||||||
|
|
||||||
public interface IExpression {
|
public interface IExpression extends Node {
|
||||||
// typeCheck method
|
// typeCheck method
|
||||||
TypeCheckResult typeCheck() throws Exception;
|
TypeCheckResult typeCheck() throws Exception;
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@ import abstractSyntaxTree.Class.FieldDecl;
|
|||||||
import abstractSyntaxTree.Class.MethodDecl;
|
import abstractSyntaxTree.Class.MethodDecl;
|
||||||
import abstractSyntaxTree.Class.RefType;
|
import abstractSyntaxTree.Class.RefType;
|
||||||
import abstractSyntaxTree.Expression.BinaryExpression;
|
import abstractSyntaxTree.Expression.BinaryExpression;
|
||||||
|
import abstractSyntaxTree.Expression.IExpression;
|
||||||
import abstractSyntaxTree.Node;
|
import abstractSyntaxTree.Node;
|
||||||
import abstractSyntaxTree.Parameter.Parameter;
|
import abstractSyntaxTree.Parameter.Parameter;
|
||||||
import abstractSyntaxTree.Parameter.ParameterList;
|
import abstractSyntaxTree.Parameter.ParameterList;
|
||||||
@ -114,7 +115,8 @@ public class ASTGenerator extends DecafBaseVisitor<Node> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Node visitReturnStmt(DecafParser.ReturnStmtContext ctx) {
|
public Node visitReturnStmt(DecafParser.ReturnStmtContext ctx) {
|
||||||
return new ReturnStatement(new BinaryExpression());
|
Node expression = visitExpression(ctx.expression());
|
||||||
|
return new ReturnStatement((IExpression) expression);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -132,22 +134,25 @@ public class ASTGenerator extends DecafBaseVisitor<Node> {
|
|||||||
if (ctx.elseStmt() != null) {
|
if (ctx.elseStmt() != null) {
|
||||||
return visitIfStmt(ctx.ifStmt());
|
return visitIfStmt(ctx.ifStmt());
|
||||||
} else {
|
} else {
|
||||||
|
Node expression = visitExpression(ctx.ifStmt().expression());
|
||||||
Node ifStatement = visitStatement(ctx.ifStmt().statement());
|
Node ifStatement = visitStatement(ctx.ifStmt().statement());
|
||||||
Node elseStatement = visitStatement(ctx.elseStmt().statement());
|
Node elseStatement = visitStatement(ctx.elseStmt().statement());
|
||||||
return new IfElseStatement(new BinaryExpression(), (IStatement) ifStatement, (IStatement) elseStatement);
|
return new IfElseStatement((IExpression) expression, (IStatement) ifStatement, (IStatement) elseStatement);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Node visitIfStmt(DecafParser.IfStmtContext ctx) {
|
public Node visitIfStmt(DecafParser.IfStmtContext ctx) {
|
||||||
|
Node expression = visitExpression(ctx.expression());
|
||||||
Node statement = visitStatement(ctx.statement());
|
Node statement = visitStatement(ctx.statement());
|
||||||
return new IfStatement(new BinaryExpression(), (IStatement) statement);
|
return new IfStatement((IExpression) expression, (IStatement) statement);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Node visitWhileStmt(DecafParser.WhileStmtContext ctx) {
|
public Node visitWhileStmt(DecafParser.WhileStmtContext ctx) {
|
||||||
|
Node expression = visitExpression(ctx.expression());
|
||||||
Node statement = visitStatement(ctx.statement());
|
Node statement = visitStatement(ctx.statement());
|
||||||
return new WhileStatement(new BinaryExpression(), (IStatement) statement);
|
return new WhileStatement((IExpression) expression, (IStatement) statement);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -167,7 +172,6 @@ public class ASTGenerator extends DecafBaseVisitor<Node> {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Node visitAssign(DecafParser.AssignContext ctx) {
|
public Node visitAssign(DecafParser.AssignContext ctx) {
|
||||||
return new AssignStatementExpression();
|
return new AssignStatementExpression();
|
||||||
@ -182,4 +186,79 @@ public class ASTGenerator extends DecafBaseVisitor<Node> {
|
|||||||
public Node visitNewDecl(DecafParser.NewDeclContext ctx) {
|
public Node visitNewDecl(DecafParser.NewDeclContext ctx) {
|
||||||
return super.visitNewDecl(ctx);
|
return super.visitNewDecl(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Node visitExpression(DecafParser.ExpressionContext ctx) {
|
||||||
|
if (ctx.subExpression() != null) {
|
||||||
|
|
||||||
|
} else if (ctx.binaryExpr() != null) {
|
||||||
|
return visitBinaryExpr(ctx.binaryExpr());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Node visitBinaryExpr(DecafParser.BinaryExprContext ctx) {
|
||||||
|
if (ctx.calcExpr() != null) {
|
||||||
|
return visitCalcExpr(ctx.calcExpr());
|
||||||
|
} else if (ctx.nonCalcExpr() != null) {
|
||||||
|
return visitNonCalcExpr(ctx.nonCalcExpr());
|
||||||
|
} else if (ctx.value() != null) {
|
||||||
|
//todo
|
||||||
|
} else if (ctx.binaryExpr() != null) {
|
||||||
|
//todo
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Node visitCalcExpr(DecafParser.CalcExprContext ctx) {
|
||||||
|
if (ctx.calcExpr() != null) {
|
||||||
|
Node left = visitCalcExpr(ctx.calcExpr());
|
||||||
|
Node right = visitDotExpr(ctx.dotExpr());
|
||||||
|
return new BinaryExpression(ctx.LineOperator().getText(), (IExpression) left, (IExpression) right);
|
||||||
|
} else {
|
||||||
|
visitDotExpr(ctx.dotExpr());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Node visitDotExpr(DecafParser.DotExprContext ctx) {
|
||||||
|
if (ctx.dotExpr() != null) {
|
||||||
|
Node left = visitDotExpr(ctx.dotExpr());
|
||||||
|
Node right = visitDotSubExpr(ctx.dotSubExpr());
|
||||||
|
return new BinaryExpression(ctx.DotOperator().getText(), (IExpression) left, (IExpression) right);
|
||||||
|
} else {
|
||||||
|
visitDotSubExpr(ctx.dotSubExpr());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
//todo
|
||||||
|
@Override
|
||||||
|
public Node visitDotSubExpr(DecafParser.DotSubExprContext ctx) {
|
||||||
|
return super.visitDotSubExpr(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Node visitNonCalcExpr(DecafParser.NonCalcExprContext ctx) {
|
||||||
|
String operator;
|
||||||
|
if(ctx.nonCalcOperator().LogicalOpertor() != null) {
|
||||||
|
operator = ctx.nonCalcOperator().LogicalOpertor().getText();
|
||||||
|
} else {
|
||||||
|
operator = ctx.nonCalcOperator().ComparisonOperator().getText();
|
||||||
|
}
|
||||||
|
Node left = visitSubExpression(ctx.subExpression());
|
||||||
|
Node right = visitExpression(ctx.expression());
|
||||||
|
return new BinaryExpression(operator, (IExpression) left, (IExpression) right);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Node visitSubExpression(DecafParser.SubExpressionContext ctx) {
|
||||||
|
if (ctx.subExpression() != null) {
|
||||||
|
visitSubExpression(ctx.subExpression());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user