diff --git a/ep20/src/main/java/org/teachfx/antlr4/ep20/ir/IRVisitor.java b/ep20/src/main/java/org/teachfx/antlr4/ep20/ir/IRVisitor.java index 2bcccea..2cb389e 100644 --- a/ep20/src/main/java/org/teachfx/antlr4/ep20/ir/IRVisitor.java +++ b/ep20/src/main/java/org/teachfx/antlr4/ep20/ir/IRVisitor.java @@ -2,7 +2,7 @@ import org.teachfx.antlr4.ep20.ir.expr.CallFunc; import org.teachfx.antlr4.ep20.ir.expr.addr.FrameSlot; -import org.teachfx.antlr4.ep20.ir.expr.addr.StackSlot; +import org.teachfx.antlr4.ep20.ir.expr.addr.OperandSlot; import org.teachfx.antlr4.ep20.ir.expr.arith.BinExpr; import org.teachfx.antlr4.ep20.ir.expr.arith.UnaryExpr; import org.teachfx.antlr4.ep20.ir.expr.val.ConstVal; @@ -28,7 +28,7 @@ public interface IRVisitor { S visit(Prog prog); - E visit(StackSlot stackSlot); + E visit(OperandSlot operandSlot); E visit(FrameSlot frameSlot); diff --git a/ep20/src/main/java/org/teachfx/antlr4/ep20/ir/expr/CallFunc.java b/ep20/src/main/java/org/teachfx/antlr4/ep20/ir/expr/CallFunc.java index e9fd6a7..2d8ebc8 100644 --- a/ep20/src/main/java/org/teachfx/antlr4/ep20/ir/expr/CallFunc.java +++ b/ep20/src/main/java/org/teachfx/antlr4/ep20/ir/expr/CallFunc.java @@ -2,11 +2,8 @@ import org.teachfx.antlr4.ep20.ir.IRVisitor; -import org.teachfx.antlr4.ep20.ir.expr.addr.StackSlot; import org.teachfx.antlr4.ep20.symtab.symbol.MethodSymbol; -import java.util.List; - public class CallFunc extends Expr { protected MethodSymbol funcType; protected String funcName; diff --git a/ep20/src/main/java/org/teachfx/antlr4/ep20/ir/expr/addr/StackSlot.java b/ep20/src/main/java/org/teachfx/antlr4/ep20/ir/expr/addr/OperandSlot.java similarity index 68% rename from ep20/src/main/java/org/teachfx/antlr4/ep20/ir/expr/addr/StackSlot.java rename to ep20/src/main/java/org/teachfx/antlr4/ep20/ir/expr/addr/OperandSlot.java index e0de618..94109c2 100644 --- a/ep20/src/main/java/org/teachfx/antlr4/ep20/ir/expr/addr/StackSlot.java +++ b/ep20/src/main/java/org/teachfx/antlr4/ep20/ir/expr/addr/OperandSlot.java @@ -3,16 +3,16 @@ import org.teachfx.antlr4.ep20.ir.IRVisitor; import org.teachfx.antlr4.ep20.ir.expr.VarSlot; -public class StackSlot extends VarSlot { +public class OperandSlot extends VarSlot { private static int ordSeq = 0; - public static StackSlot genTemp() { - return new StackSlot(); + public static OperandSlot genTemp() { + return new OperandSlot(); } private int ord = 0; - private StackSlot() { - this.ord = StackSlot.ordSeq++; + private OperandSlot() { + this.ord = OperandSlot.ordSeq++; } public int getOrd() { return ord; @@ -29,7 +29,7 @@ public E accept(IRVisitor visitor) { } - public static StackSlot pushStack() { return StackSlot.genTemp(); } + public static OperandSlot pushStack() { return OperandSlot.genTemp(); } public static void popStack() { ordSeq--;} public static int getOrdSeq() { diff --git a/ep20/src/main/java/org/teachfx/antlr4/ep20/ir/expr/arith/UnaryExpr.java b/ep20/src/main/java/org/teachfx/antlr4/ep20/ir/expr/arith/UnaryExpr.java index 40a30d5..8a59bd8 100644 --- a/ep20/src/main/java/org/teachfx/antlr4/ep20/ir/expr/arith/UnaryExpr.java +++ b/ep20/src/main/java/org/teachfx/antlr4/ep20/ir/expr/arith/UnaryExpr.java @@ -3,7 +3,6 @@ import org.teachfx.antlr4.ep20.ir.IRVisitor; import org.teachfx.antlr4.ep20.ir.expr.Expr; import org.teachfx.antlr4.ep20.ir.expr.VarSlot; -import org.teachfx.antlr4.ep20.ir.expr.addr.StackSlot; import org.teachfx.antlr4.ep20.symtab.type.OperatorType; import org.teachfx.antlr4.ep20.symtab.type.OperatorType.UnaryOpType; diff --git a/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/cfg/BasicBlock.java b/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/cfg/BasicBlock.java index f1f16bf..1fc3687 100644 --- a/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/cfg/BasicBlock.java +++ b/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/cfg/BasicBlock.java @@ -2,7 +2,6 @@ import org.teachfx.antlr4.ep20.ir.IRNode; import org.teachfx.antlr4.ep20.ir.stmt.CJMP; -import org.teachfx.antlr4.ep20.ir.stmt.FuncEntryLabel; import org.teachfx.antlr4.ep20.ir.stmt.JMP; import org.teachfx.antlr4.ep20.ir.stmt.Stmt; import org.teachfx.antlr4.ep20.symtab.scope.Scope; @@ -93,6 +92,11 @@ public void setJmpRefMap(List jmpRefMap) { this.jmpRefMap = jmpRefMap; } + public int getOrd() { + return ord; + } + + public void refJMP(IRNode node) { jmpRefMap.add(node); } diff --git a/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/cfg/ControlFlowAnalysis.java b/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/cfg/ControlFlowAnalysis.java index dfb993d..83fd763 100644 --- a/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/cfg/ControlFlowAnalysis.java +++ b/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/cfg/ControlFlowAnalysis.java @@ -4,7 +4,7 @@ import org.teachfx.antlr4.ep20.ir.Prog; import org.teachfx.antlr4.ep20.ir.expr.CallFunc; import org.teachfx.antlr4.ep20.ir.expr.addr.FrameSlot; -import org.teachfx.antlr4.ep20.ir.expr.addr.StackSlot; +import org.teachfx.antlr4.ep20.ir.expr.addr.OperandSlot; import org.teachfx.antlr4.ep20.ir.expr.arith.BinExpr; import org.teachfx.antlr4.ep20.ir.expr.arith.UnaryExpr; import org.teachfx.antlr4.ep20.ir.expr.val.ConstVal; @@ -68,7 +68,7 @@ public Void visit(Prog prog) { } @Override - public Void visit(StackSlot stackSlot) { + public Void visit(OperandSlot operandSlot) { return null; } diff --git a/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/cfg/LivenessAnalysis.java b/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/cfg/LivenessAnalysis.java index d9a1b8b..4c35569 100644 --- a/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/cfg/LivenessAnalysis.java +++ b/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/cfg/LivenessAnalysis.java @@ -4,7 +4,7 @@ import org.teachfx.antlr4.ep20.ir.Prog; import org.teachfx.antlr4.ep20.ir.expr.CallFunc; import org.teachfx.antlr4.ep20.ir.expr.addr.FrameSlot; -import org.teachfx.antlr4.ep20.ir.expr.addr.StackSlot; +import org.teachfx.antlr4.ep20.ir.expr.addr.OperandSlot; import org.teachfx.antlr4.ep20.ir.expr.arith.BinExpr; import org.teachfx.antlr4.ep20.ir.expr.arith.UnaryExpr; import org.teachfx.antlr4.ep20.ir.expr.val.ConstVal; @@ -58,7 +58,7 @@ public Void visit(Prog prog) { } @Override - public Void visit(StackSlot stackSlot) { + public Void visit(OperandSlot operandSlot) { return null; } diff --git a/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/codegen/CymbolAssembler.java b/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/codegen/CymbolAssembler.java index dfe9149..05f7f85 100644 --- a/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/codegen/CymbolAssembler.java +++ b/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/codegen/CymbolAssembler.java @@ -5,7 +5,7 @@ import org.teachfx.antlr4.ep20.ir.expr.CallFunc; import org.teachfx.antlr4.ep20.ir.expr.Expr; import org.teachfx.antlr4.ep20.ir.expr.addr.FrameSlot; -import org.teachfx.antlr4.ep20.ir.expr.addr.StackSlot; +import org.teachfx.antlr4.ep20.ir.expr.addr.OperandSlot; import org.teachfx.antlr4.ep20.ir.expr.arith.BinExpr; import org.teachfx.antlr4.ep20.ir.expr.arith.UnaryExpr; import org.teachfx.antlr4.ep20.ir.expr.val.ConstVal; @@ -119,7 +119,7 @@ public Void visit(ReturnVal returnVal) { } @Override - public Void visit(StackSlot stackSlot) { + public Void visit(OperandSlot operandSlot) { return null; } diff --git a/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/ir/CymbolIRBuilder.java b/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/ir/CymbolIRBuilder.java index bba2d60..df202ce 100644 --- a/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/ir/CymbolIRBuilder.java +++ b/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/ir/CymbolIRBuilder.java @@ -17,7 +17,7 @@ import org.teachfx.antlr4.ep20.ir.expr.CallFunc; import org.teachfx.antlr4.ep20.ir.expr.VarSlot; import org.teachfx.antlr4.ep20.ir.expr.addr.FrameSlot; -import org.teachfx.antlr4.ep20.ir.expr.addr.StackSlot; +import org.teachfx.antlr4.ep20.ir.expr.addr.OperandSlot; import org.teachfx.antlr4.ep20.ir.expr.arith.BinExpr; import org.teachfx.antlr4.ep20.ir.expr.arith.UnaryExpr; import org.teachfx.antlr4.ep20.ir.expr.val.ConstVal; @@ -330,10 +330,10 @@ public Optional addInstr(IRNode stmt) { if (stmt instanceof BinExpr) { popEvalOperand(); popEvalOperand(); - return Optional.of(StackSlot.pushStack()); + return Optional.of(OperandSlot.pushStack()); } else if (stmt instanceof UnaryExpr) { popEvalOperand(); - return Optional.of(StackSlot.pushStack()); + return Optional.of(OperandSlot.pushStack()); } else if(stmt instanceof CJMP) { popEvalOperand(); } else if (stmt instanceof CallFunc callFunc) { @@ -345,7 +345,7 @@ public Optional addInstr(IRNode stmt) { } // 如果存在返回值,则要模拟压入返回值以保证栈平衡 if(!callFunc.getFuncType().isVoid()) { - pushEvalOperand(StackSlot.genTemp()); + pushEvalOperand(OperandSlot.genTemp()); } } @@ -388,9 +388,9 @@ protected VarSlot pushEvalOperand(Temp temp) { logger.info(curNode.toString()); } - if (!(temp instanceof StackSlot)){ + if (!(temp instanceof OperandSlot)){ cnt++; - var assignee = StackSlot.pushStack(); + var assignee = OperandSlot.pushStack(); evalExprStack.push(assignee); addInstr(Assign.with(assignee, temp)); logger.info("-> eval stack %s%n", evalExprStack.toString()); @@ -408,8 +408,8 @@ protected VarSlot popEvalOperand() { var res = evalExprStack.pop(); logger.info("pop eval operand %s",res); logger.info("pop stack"); - StackSlot.popStack(); - if (StackSlot.getOrdSeq() < 0) { + OperandSlot.popStack(); + if (OperandSlot.getOrdSeq() < 0) { throw new RuntimeException("un matched pop"); } return res; diff --git a/ep20/src/test/java/org/teachfx/antlr4/ep20/ast/expr/BoolExprNodeTest.java b/ep20/src/test/java/org/teachfx/antlr4/ep20/ast/expr/BoolExprNodeTest.java index da72305..c14770a 100644 --- a/ep20/src/test/java/org/teachfx/antlr4/ep20/ast/expr/BoolExprNodeTest.java +++ b/ep20/src/test/java/org/teachfx/antlr4/ep20/ast/expr/BoolExprNodeTest.java @@ -1,2 +1,3 @@ -package org.teachfx.antlr4.ep20.ast.expr;public class BoolExprNodeTest { +package org.teachfx.antlr4.ep20.ast.expr; +public class BoolExprNodeTest { } diff --git a/ep20/src/test/java/org/teachfx/antlr4/ep20/pass/codegen/CymbolAssemblerTest.java b/ep20/src/test/java/org/teachfx/antlr4/ep20/pass/codegen/CymbolAssemblerTest.java index 35a1bbb..28f78f2 100644 --- a/ep20/src/test/java/org/teachfx/antlr4/ep20/pass/codegen/CymbolAssemblerTest.java +++ b/ep20/src/test/java/org/teachfx/antlr4/ep20/pass/codegen/CymbolAssemblerTest.java @@ -2,13 +2,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.teachfx.antlr4.ep20.ir.expr.arith.BinExpr; -import org.teachfx.antlr4.ep20.ir.expr.arith.UnaryExpr; -import org.teachfx.antlr4.ep20.ir.expr.val.ConstVal; -import org.teachfx.antlr4.ep20.ir.stmt.Assign; -import org.teachfx.antlr4.ep20.ir.stmt.CJMP; -import org.teachfx.antlr4.ep20.ir.stmt.JMP; -import org.teachfx.antlr4.ep20.ir.stmt.ReturnVal; + import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/ep21/TODO.md b/ep21/TODO.md index f99a0ea..0159477 100644 --- a/ep21/TODO.md +++ b/ep21/TODO.md @@ -8,8 +8,8 @@ - [ ] 线性化MIR输出 - [ ] CFG - - [ ] 基本块划分 - - [ ] 关系生成 + - [x] 基本块划分 + - [x] 关系生成 - [ ] 生成DOT ## Todo