add binary expressions in ast

This commit is contained in:
StefanZ3 2024-05-30 20:38:06 +02:00
parent 0a81315366
commit d1e39be655
3 changed files with 92 additions and 6 deletions

View File

@ -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();

View File

@ -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;

View File

@ -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;
}
} }