summaryrefslogtreecommitdiff
path: root/Homework/cs5300/compiler/p5-compiler/submit/ast/BinaryOperator.java
diff options
context:
space:
mode:
authorElizabeth Alexander Hunt <me@liz.coffee>2026-07-02 11:55:17 -0700
committerElizabeth Alexander Hunt <me@liz.coffee>2026-07-02 11:55:17 -0700
commit6bf4b90c90f15f4ab60833bddf5b5756d1a6b1f6 (patch)
treeed97e39ec77c5231ffd2c394493e68d00ddac5a4 /Homework/cs5300/compiler/p5-compiler/submit/ast/BinaryOperator.java
downloadmisc-undergrad-main.tar.gz
misc-undergrad-main.zip
Diffstat (limited to 'Homework/cs5300/compiler/p5-compiler/submit/ast/BinaryOperator.java')
-rw-r--r--Homework/cs5300/compiler/p5-compiler/submit/ast/BinaryOperator.java89
1 files changed, 89 insertions, 0 deletions
diff --git a/Homework/cs5300/compiler/p5-compiler/submit/ast/BinaryOperator.java b/Homework/cs5300/compiler/p5-compiler/submit/ast/BinaryOperator.java
new file mode 100644
index 0000000..3afce78
--- /dev/null
+++ b/Homework/cs5300/compiler/p5-compiler/submit/ast/BinaryOperator.java
@@ -0,0 +1,89 @@
+/*
+ * Code formatter project
+ * CS 4481
+ */
+package submit.ast;
+
+import submit.MIPSResult;
+import submit.RegisterAllocator;
+import submit.SymbolTable;
+
+/**
+ *
+ * @author edwajohn
+ */
+public class BinaryOperator extends AbstractNode implements Expression {
+
+ private final Expression lhs, rhs;
+ private final BinaryOperatorType type;
+
+ public BinaryOperator(Expression lhs, BinaryOperatorType type,
+ Expression rhs) {
+ this.lhs = lhs;
+ this.type = type;
+ this.rhs = rhs;
+ }
+
+ public BinaryOperator(Expression lhs, String type, Expression rhs) {
+ this.lhs = lhs;
+ this.type = BinaryOperatorType.fromString(type);
+ this.rhs = rhs;
+ }
+
+ @Override
+ public void toCminus(StringBuilder builder, String prefix) {
+ lhs.toCminus(builder, prefix);
+ builder.append(" ").append(type).append(" ");
+ rhs.toCminus(builder, prefix);
+ }
+
+ @Override
+ public MIPSResult toMIPS(StringBuilder code, StringBuilder data,
+ SymbolTable symbolTable,
+ RegisterAllocator registerAllocator) {
+
+ switch (type) {
+ case PLUS:
+ case MINUS:
+ case TIMES:
+ case DIVIDE:
+ MIPSResult left = lhs.toMIPS(code, data, symbolTable, registerAllocator);
+ String leftRegister =
+ registerAllocator.getRegisterOrLoadIntoRegister(left, code);
+
+ MIPSResult right = rhs.toMIPS(code, data, symbolTable, registerAllocator);
+ String rightRegister =
+ registerAllocator.getRegisterOrLoadIntoRegister(right, code);
+ String resultRegister = registerAllocator.getAny();
+ switch (type) {
+ case PLUS:
+ code.append(String.format("add %s %s %s\n", resultRegister,
+ leftRegister, rightRegister));
+ break;
+ case MINUS:
+ code.append(String.format("sub %s %s %s\n", resultRegister,
+ leftRegister, rightRegister));
+ break;
+ case TIMES:
+ code.append(String.format("mult %s %s\n", leftRegister, rightRegister));
+ code.append(String.format("mflo %s\n", resultRegister));
+ break;
+ case DIVIDE:
+ code.append(String.format("div %s %s\n", leftRegister, rightRegister));
+ code.append(String.format("mflo %s\n", resultRegister));
+ break;
+ default:
+ break;
+ }
+
+ registerAllocator.clear(leftRegister);
+ registerAllocator.clear(rightRegister);
+
+ return MIPSResult.createRegisterResult(resultRegister, VarType.INT);
+ default:
+ break;
+ }
+
+ return MIPSResult.createVoidResult();
+ }
+}