From 524252105a21e545792f5955bb25aa0401b41442 Mon Sep 17 00:00:00 2001 From: jespergravgaard Date: Mon, 24 Jul 2017 08:19:44 +0200 Subject: [PATCH] Refactored toString to avoid redundant code. --- src/dk/camelot64/kickc/Compiler.java | 12 ++--- .../asm/PointerDereferenceRegisterZpByte.java | 10 ++-- src/dk/camelot64/kickc/icl/ConstantBool.java | 16 +++--- .../camelot64/kickc/icl/ConstantDouble.java | 14 ++--- .../camelot64/kickc/icl/ConstantInteger.java | 15 +++--- .../camelot64/kickc/icl/ConstantString.java | 15 +++--- .../camelot64/kickc/icl/ControlFlowBlock.java | 30 +---------- .../camelot64/kickc/icl/ControlFlowGraph.java | 14 +---- src/dk/camelot64/kickc/icl/Label.java | 20 +++----- .../kickc/icl/PointerDereferenceIndexed.java | 10 ++-- .../kickc/icl/PointerDereferenceSimple.java | 11 ++-- src/dk/camelot64/kickc/icl/Procedure.java | 51 +++++++------------ src/dk/camelot64/kickc/icl/ProgramScope.java | 10 ++-- .../kickc/icl/RegisterAllocation.java | 48 +++-------------- src/dk/camelot64/kickc/icl/Scope.java | 13 ++--- src/dk/camelot64/kickc/icl/Statement.java | 6 +-- .../kickc/icl/StatementAssignment.java | 19 ++----- src/dk/camelot64/kickc/icl/StatementCall.java | 32 ++---------- .../kickc/icl/StatementConditionalJump.java | 22 ++------ src/dk/camelot64/kickc/icl/StatementJump.java | 9 +--- .../camelot64/kickc/icl/StatementLabel.java | 10 ++-- .../kickc/icl/StatementPhiBlock.java | 32 ++---------- .../kickc/icl/StatementProcedureBegin.java | 10 ++-- .../kickc/icl/StatementProcedureEnd.java | 10 ++-- .../camelot64/kickc/icl/StatementReturn.java | 11 ++-- .../kickc/icl/StatementSequence.java | 15 +----- src/dk/camelot64/kickc/icl/Symbol.java | 3 -- src/dk/camelot64/kickc/icl/SymbolRef.java | 14 +++-- src/dk/camelot64/kickc/icl/Value.java | 4 +- src/dk/camelot64/kickc/icl/Variable.java | 18 ++----- ...ss1GenerateSingleStaticAssignmentForm.java | 2 +- .../Pass1GenerateStatementSequence.java | 2 +- .../kickc/passes/Pass2AliasElimination.java | 7 ++- .../Pass2ConditionalJumpSimplification.java | 2 +- .../Pass2ConstantAdditionElimination.java | 2 +- .../passes/Pass2ConstantPropagation.java | 2 +- .../kickc/passes/Pass2CullEmptyBlocks.java | 2 +- .../passes/Pass2RedundantPhiElimination.java | 2 +- .../kickc/passes/Pass2SelfPhiElimination.java | 2 +- .../kickc/passes/Pass2SsaOptimization.java | 10 ++-- .../kickc/passes/Pass3CodeGeneration.java | 10 ++-- .../kickc/test/TestCompilationOutput.java | 2 +- 42 files changed, 156 insertions(+), 393 deletions(-) diff --git a/src/dk/camelot64/kickc/Compiler.java b/src/dk/camelot64/kickc/Compiler.java index 14f961f27..acffbbc25 100644 --- a/src/dk/camelot64/kickc/Compiler.java +++ b/src/dk/camelot64/kickc/Compiler.java @@ -122,7 +122,7 @@ public class Compiler { log.append("Succesful SSA optimization " + optimization.getClass().getSimpleName() + ""); ssaOptimized = true; log.append("CONTROL FLOW GRAPH"); - log.append(program.getGraph().getAsTypedString(program.getScope())); + log.append(program.getGraph().toString(program.getScope())); } } } @@ -138,7 +138,7 @@ public class Compiler { pass1TypeInference.inferTypes(statementSequence); log.append("PROGRAM"); - log.append(statementSequence.getAsTypedString(programScope)); + log.append(statementSequence.toString(programScope)); log.append("SYMBOLS"); log.append(programScope.getSymbolTableContents()); @@ -148,26 +148,26 @@ public class Compiler { Program program = new Program(programScope, controlFlowGraph); log.append("INITIAL CONTROL FLOW GRAPH"); - log.append(program.getGraph().getAsTypedString(program.getScope())); + log.append(program.getGraph().toString(program.getScope())); Pass1ProcedureCallParameters pass1ProcedureCallParameters = new Pass1ProcedureCallParameters(program); program.setGraph(pass1ProcedureCallParameters.generate()); log.append("CONTROL FLOW GRAPH WITH ASSIGNMENT CALL"); - log.append(program.getGraph().getAsTypedString(program.getScope())); + log.append(program.getGraph().toString(program.getScope())); Pass1GenerateSingleStaticAssignmentForm pass1GenerateSingleStaticAssignmentForm = new Pass1GenerateSingleStaticAssignmentForm(log, program); pass1GenerateSingleStaticAssignmentForm.generate(); log.append("CONTROL FLOW GRAPH SSA"); - log.append(program.getGraph().getAsTypedString(program.getScope())); + log.append(program.getGraph().toString(program.getScope())); Pass1ProcedureCallsReturnValue pass1ProcedureCallsReturnValue = new Pass1ProcedureCallsReturnValue(program); program.setGraph(pass1ProcedureCallsReturnValue.generate()); log.append("CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN"); - log.append(program.getGraph().getAsTypedString(program.getScope())); + log.append(program.getGraph().toString(program.getScope())); return program; } diff --git a/src/dk/camelot64/kickc/asm/PointerDereferenceRegisterZpByte.java b/src/dk/camelot64/kickc/asm/PointerDereferenceRegisterZpByte.java index 4977af425..d40fb3ab9 100644 --- a/src/dk/camelot64/kickc/asm/PointerDereferenceRegisterZpByte.java +++ b/src/dk/camelot64/kickc/asm/PointerDereferenceRegisterZpByte.java @@ -23,16 +23,12 @@ public class PointerDereferenceRegisterZpByte implements PointerDereference { @Override public String toString() { - return getAsString(); + return toString(null); } @Override - public String getAsTypedString(ProgramScope scope) { - return getAsString(); + public String toString(ProgramScope scope) { + return "*(" + pointer.toString(scope) + ')'; } - @Override - public String getAsString() { - return "*(" + pointer.toString() + ')'; - } } diff --git a/src/dk/camelot64/kickc/icl/ConstantBool.java b/src/dk/camelot64/kickc/icl/ConstantBool.java index 78baaa71c..6ef05be42 100644 --- a/src/dk/camelot64/kickc/icl/ConstantBool.java +++ b/src/dk/camelot64/kickc/icl/ConstantBool.java @@ -13,17 +13,17 @@ public class ConstantBool implements Constant { @Override public String toString() { - return getAsString(); + return toString(null); } @Override - public String getAsTypedString(ProgramScope scope) { - return //"("+SymbolTypeBasic.BOOLEAN.getTypeName()+") "+ - Boolean.toString(value); + public String toString(ProgramScope scope) { + if(scope==null) { + return Boolean.toString(value); + } else { + return //"("+SymbolTypeBasic.BOOLEAN.getTypeName()+") "+ + Boolean.toString(value); + } } - @Override - public String getAsString() { - return Boolean.toString(value); - } } diff --git a/src/dk/camelot64/kickc/icl/ConstantDouble.java b/src/dk/camelot64/kickc/icl/ConstantDouble.java index a01c7ae76..d0a8ca331 100644 --- a/src/dk/camelot64/kickc/icl/ConstantDouble.java +++ b/src/dk/camelot64/kickc/icl/ConstantDouble.java @@ -17,16 +17,16 @@ public class ConstantDouble implements Constant { @Override public String toString() { - return getAsString(); + return toString(null); } @Override - public String getAsTypedString(ProgramScope scope) { - return "(" + SymbolTypeBasic.VOID.getTypeName() + ") " + Double.toString(number); + public String toString(ProgramScope scope) { + if(scope==null) { + return Double.toString(number); + } else { + return "(" + SymbolTypeBasic.VOID.getTypeName() + ") " + Double.toString(number); + } } - @Override - public String getAsString() { - return Double.toString(number); - } } diff --git a/src/dk/camelot64/kickc/icl/ConstantInteger.java b/src/dk/camelot64/kickc/icl/ConstantInteger.java index 2cde006e2..6e3c72a8b 100644 --- a/src/dk/camelot64/kickc/icl/ConstantInteger.java +++ b/src/dk/camelot64/kickc/icl/ConstantInteger.java @@ -34,17 +34,16 @@ public class ConstantInteger implements Constant { @Override public String toString() { - return getAsString(); + return toString(null); } @Override - public String getAsTypedString(ProgramScope scope) { - return "("+getType().getTypeName()+") "+Integer.toString(number); } - - @Override - @JsonIgnore - public String getAsString() { - return Integer.toString(number); + public String toString(ProgramScope scope) { + if (scope == null) { + return Integer.toString(number); + } else { + return "(" + getType().getTypeName() + ") " + Integer.toString(number); + } } @Override diff --git a/src/dk/camelot64/kickc/icl/ConstantString.java b/src/dk/camelot64/kickc/icl/ConstantString.java index a7815895f..b1cea6f0d 100644 --- a/src/dk/camelot64/kickc/icl/ConstantString.java +++ b/src/dk/camelot64/kickc/icl/ConstantString.java @@ -13,15 +13,16 @@ public class ConstantString implements Constant { @Override public String toString() { - return getAsString(); + return toString(null); } @Override - public String getAsTypedString(ProgramScope scope) { - return "("+SymbolTypeBasic.STRING.getTypeName()+") "+"\\"+value+"\\"; } - - @Override - public String getAsString() { - return "\\"+value+"\\"; + public String toString(ProgramScope scope) { + if (scope == null) { + return "\\" + value + "\\"; + } else { + return "(" + SymbolTypeBasic.STRING.getTypeName() + ") " + "\\" + value + "\\"; + } } + } diff --git a/src/dk/camelot64/kickc/icl/ControlFlowBlock.java b/src/dk/camelot64/kickc/icl/ControlFlowBlock.java index 5c0ef1aec..bd569843d 100644 --- a/src/dk/camelot64/kickc/icl/ControlFlowBlock.java +++ b/src/dk/camelot64/kickc/icl/ControlFlowBlock.java @@ -79,7 +79,7 @@ public class ControlFlowBlock { return statements; } - public String getAsTypedString(ControlFlowGraph graph, ProgramScope scope) { + public String toString(ControlFlowGraph graph, ProgramScope scope) { StringBuffer out = new StringBuffer(); out.append(label.getFullName() + ":" ); out.append(" from"); @@ -95,33 +95,7 @@ public class ControlFlowBlock { } out.append("\n"); for (Statement statement : statements) { - out.append(" "+statement.getAsTypedString(scope)+"\n"); - } - if(defaultSuccessor!=null) { - out.append(" to:"); - out.append(defaultSuccessor.getFullName()); - out.append("\n"); - } - return out.toString(); - } - - public String getAsString(ControlFlowGraph graph) { - StringBuffer out = new StringBuffer(); - out.append(label.getFullName() + ":" ); - out.append(" from"); - if(graph!=null) { - List predecessors = graph.getPredecessors(this); - if(predecessors.size()>0) { - for (ControlFlowBlock predecessor : predecessors) { - out.append(" " + predecessor.getLabel().getFullName()); - } - } - } else { - out.append(" @UNKNOWN"); - } - out.append("\n"); - for (Statement statement : statements) { - out.append(" "+statement.getAsString()+"\n"); + out.append(" "+statement.toString(scope)+"\n"); } if(defaultSuccessor!=null) { out.append(" to:"); diff --git a/src/dk/camelot64/kickc/icl/ControlFlowGraph.java b/src/dk/camelot64/kickc/icl/ControlFlowGraph.java index 427345cb4..43c4b3b33 100644 --- a/src/dk/camelot64/kickc/icl/ControlFlowGraph.java +++ b/src/dk/camelot64/kickc/icl/ControlFlowGraph.java @@ -131,24 +131,14 @@ public class ControlFlowGraph { return null; } - public String getAsTypedString(ProgramScope scope) { + public String toString(ProgramScope scope) { StringBuffer out = new StringBuffer(); for (ControlFlowBlock block : blocks.values()) { - out.append(block.getAsTypedString(this, scope)); + out.append(block.toString(this, scope)); } return out.toString(); } - @JsonIgnore - public String getAsString() { - StringBuffer out = new StringBuffer(); - for (ControlFlowBlock block : blocks.values()) { - out.append(block.getAsString(this)); - } - return out.toString(); - } - - @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/dk/camelot64/kickc/icl/Label.java b/src/dk/camelot64/kickc/icl/Label.java index 864d4043e..4559de587 100644 --- a/src/dk/camelot64/kickc/icl/Label.java +++ b/src/dk/camelot64/kickc/icl/Label.java @@ -89,22 +89,16 @@ public class Label implements Symbol { @Override public String toString() { - return getAsString(); + return toString(null); } @Override - public String getAsTypedString(ProgramScope scope) { - return getTypedName(); - } - - @Override - @JsonIgnore - public String getAsString() { - return getFullName(); - } - - public String getTypedName() { - return "("+getType().getTypeName() + ") "+getFullName(); + public String toString(ProgramScope scope) { + if(scope==null) { + return getFullName(); + } else { + return "("+getType().getTypeName() + ") "+getFullName(); + } } @JsonIgnore diff --git a/src/dk/camelot64/kickc/icl/PointerDereferenceIndexed.java b/src/dk/camelot64/kickc/icl/PointerDereferenceIndexed.java index a8e30fded..21ce6d965 100644 --- a/src/dk/camelot64/kickc/icl/PointerDereferenceIndexed.java +++ b/src/dk/camelot64/kickc/icl/PointerDereferenceIndexed.java @@ -30,16 +30,12 @@ public class PointerDereferenceIndexed implements PointerDereference { @Override public String toString() { - return getAsString(); + return toString(null); } @Override - public String getAsTypedString(ProgramScope scope) { - return "*(" + pointer.getAsTypedString(scope) + " + " +index.getAsTypedString(scope) + ')'; + public String toString(ProgramScope scope) { + return "*(" + pointer.toString(scope) + " + " +index.toString(scope) + ')'; } - @Override - public String getAsString() { - return "*(" + pointer.getAsString() + " + " +index.getAsString() + ')'; - } } diff --git a/src/dk/camelot64/kickc/icl/PointerDereferenceSimple.java b/src/dk/camelot64/kickc/icl/PointerDereferenceSimple.java index 8ad251172..6558cd549 100644 --- a/src/dk/camelot64/kickc/icl/PointerDereferenceSimple.java +++ b/src/dk/camelot64/kickc/icl/PointerDereferenceSimple.java @@ -19,17 +19,12 @@ public class PointerDereferenceSimple implements PointerDereference { @Override public String toString() { - return getAsString(); + return toString(null); } @Override - public String getAsTypedString(ProgramScope scope) { - return "*(" + pointer.getAsTypedString(scope) + ')'; - } - - @Override - public String getAsString() { - return "*(" + pointer.getAsString() + ')'; + public String toString(ProgramScope scope) { + return "*(" + pointer.toString(scope) + ')'; } } diff --git a/src/dk/camelot64/kickc/icl/Procedure.java b/src/dk/camelot64/kickc/icl/Procedure.java index 0a67a0dfb..9470ce9b8 100644 --- a/src/dk/camelot64/kickc/icl/Procedure.java +++ b/src/dk/camelot64/kickc/icl/Procedure.java @@ -71,29 +71,11 @@ public class Procedure extends Scope { return super.getFullName(); } - @Override - public String getTypedName() { + public String getSymbolTableContents(ProgramScope scope) { StringBuilder res = new StringBuilder(); - res.append("("+getType().getTypeName() + ") "); - res.append(getFullName()); - res.append("("); - boolean first = true; - if(parameterNames !=null) { - for (Variable parameter : getParameters()) { - if (!first) res.append(" , "); - first = false; - res.append(parameter.getTypedName()); - } - } - res.append(")"); - return res.toString(); - } - - public String getSymbolTableContents() { - StringBuilder res = new StringBuilder(); - res.append(getTypedName()); + res.append(toString(scope)); res.append("\n"); - res.append(super.getSymbolTableContents()); + res.append(super.getSymbolTableContents(scope)); return res.toString(); } @@ -102,8 +84,6 @@ public class Procedure extends Scope { return new SymbolTypeProcedure(returnType); } - - @Override RegisterAllocation getAllocation() { if(getScope()!=null) { @@ -115,18 +95,25 @@ public class Procedure extends Scope { @Override public String toString() { - return getTypedName(); + return toString(null); } @Override - public String getAsTypedString(ProgramScope scope) { - return getTypedName(); - } - - @Override - @JsonIgnore - public String getAsString() { - return getTypedName(); + public String toString(ProgramScope scope) { + StringBuilder res = new StringBuilder(); + res.append("("+getType().getTypeName() + ") "); + res.append(getFullName()); + res.append("("); + boolean first = true; + if(parameterNames !=null) { + for (Variable parameter : getParameters()) { + if (!first) res.append(" , "); + first = false; + res.append(parameter.toString(scope)); + } + } + res.append(")"); + return res.toString(); } @JsonIgnore diff --git a/src/dk/camelot64/kickc/icl/ProgramScope.java b/src/dk/camelot64/kickc/icl/ProgramScope.java index 49c5a2c39..a8051be77 100644 --- a/src/dk/camelot64/kickc/icl/ProgramScope.java +++ b/src/dk/camelot64/kickc/icl/ProgramScope.java @@ -72,14 +72,14 @@ public class ProgramScope extends Scope { return result; } - @Override - public String getAsTypedString(ProgramScope scope) { - return getAsString(); + @JsonIgnore + public String getSymbolTableContents() { + return getSymbolTableContents(this); } + @Override - @JsonIgnore - public String getAsString() { + public String toString(ProgramScope scope) { return "program"; } diff --git a/src/dk/camelot64/kickc/icl/RegisterAllocation.java b/src/dk/camelot64/kickc/icl/RegisterAllocation.java index 5d7c4e71c..246e6dd4e 100644 --- a/src/dk/camelot64/kickc/icl/RegisterAllocation.java +++ b/src/dk/camelot64/kickc/icl/RegisterAllocation.java @@ -84,14 +84,10 @@ public class RegisterAllocation { } @Override - public String getAsTypedString(ProgramScope scope) { + public String toString(ProgramScope scope) { return toString(); } - @Override - public String getAsString() { - return toString(); - } } /** Two zero page addresses used as a register for a single word variable. */ @@ -131,14 +127,10 @@ public class RegisterAllocation { } @Override - public String getAsTypedString(ProgramScope scope) { + public String toString(ProgramScope scope) { return toString(); } - @Override - public String getAsString() { - return toString(); - } } @@ -178,14 +170,10 @@ public class RegisterAllocation { } @Override - public String getAsTypedString(ProgramScope scope) { + public String toString(ProgramScope scope) { return toString(); } - @Override - public String getAsString() { - return toString(); - } } /** A zro page address pair used as a register containing a pointer to a byte. */ @@ -224,14 +212,10 @@ public class RegisterAllocation { } @Override - public String getAsTypedString(ProgramScope scope) { + public String toString(ProgramScope scope) { return toString(); } - @Override - public String getAsString() { - return toString(); - } } @@ -255,14 +239,10 @@ public class RegisterAllocation { } @Override - public String getAsTypedString(ProgramScope scope) { + public String toString(ProgramScope scope) { return toString(); } - @Override - public String getAsString() { - return toString(); - } } /** The Y register. */ @@ -285,14 +265,10 @@ public class RegisterAllocation { } @Override - public String getAsTypedString(ProgramScope scope) { + public String toString(ProgramScope scope) { return toString(); } - @Override - public String getAsString() { - return toString(); - } } /** The A register. */ @@ -315,14 +291,10 @@ public class RegisterAllocation { } @Override - public String getAsTypedString(ProgramScope scope) { + public String toString(ProgramScope scope) { return toString(); } - @Override - public String getAsString() { - return toString(); - } } /** The special ALU register. */ @@ -345,14 +317,10 @@ public class RegisterAllocation { } @Override - public String getAsTypedString(ProgramScope scope) { + public String toString(ProgramScope scope) { return toString(); } - @Override - public String getAsString() { - return toString(); - } } public static Register getRegisterX() { diff --git a/src/dk/camelot64/kickc/icl/Scope.java b/src/dk/camelot64/kickc/icl/Scope.java index 917bf3dce..60e1e7342 100644 --- a/src/dk/camelot64/kickc/icl/Scope.java +++ b/src/dk/camelot64/kickc/icl/Scope.java @@ -76,12 +76,6 @@ public abstract class Scope implements Symbol { return parentScope; } - @Override - @JsonIgnore - public String getTypedName() { - return "(" + getType().getTypeName() + ") " + getFullName(); - } - @Override @JsonIgnore public abstract SymbolType getType(); @@ -148,7 +142,6 @@ public abstract class Scope implements Symbol { } } - public Variable getVariable(String name) { return (Variable) getSymbol(name); } @@ -215,7 +208,7 @@ public abstract class Scope implements Symbol { abstract RegisterAllocation getAllocation(); @JsonIgnore - public String getSymbolTableContents() { + public String getSymbolTableContents(ProgramScope scope) { StringBuilder res = new StringBuilder(); Set names = symbols.keySet(); List sortedNames = new ArrayList<>(names); @@ -224,9 +217,9 @@ public abstract class Scope implements Symbol { for (String name : sortedNames) { Symbol symbol = symbols.get(name); if (symbol instanceof Scope) { - res.append(((Scope) symbol).getSymbolTableContents()); + res.append(((Scope) symbol).getSymbolTableContents(scope)); } else { - res.append(symbol.getTypedName()); + res.append(symbol.toString(scope)); } if (symbol instanceof Variable && allocation!=null) { RegisterAllocation.Register register = allocation.getRegister((Variable) symbol); diff --git a/src/dk/camelot64/kickc/icl/Statement.java b/src/dk/camelot64/kickc/icl/Statement.java index 42ba50019..1187f4e92 100644 --- a/src/dk/camelot64/kickc/icl/Statement.java +++ b/src/dk/camelot64/kickc/icl/Statement.java @@ -1,6 +1,5 @@ package dk.camelot64.kickc.icl; -import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; @@ -22,9 +21,6 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo; }) public interface Statement { - String getAsTypedString(ProgramScope scope); - - @JsonIgnore - String getAsString(); + String toString(ProgramScope scope); } diff --git a/src/dk/camelot64/kickc/icl/StatementAssignment.java b/src/dk/camelot64/kickc/icl/StatementAssignment.java index d19184a0d..5e5014a96 100644 --- a/src/dk/camelot64/kickc/icl/StatementAssignment.java +++ b/src/dk/camelot64/kickc/icl/StatementAssignment.java @@ -89,25 +89,16 @@ public class StatementAssignment implements StatementLValue { @Override public String toString() { - return getAsString(); + return toString(null); } @Override - public String getAsTypedString(ProgramScope scope) { + public String toString(ProgramScope scope) { return - lValue.getAsTypedString(scope) + " ← " + - (rValue1==null?"":rValue1.getAsTypedString(scope)+" ") + + lValue.toString(scope) + " ← " + + (rValue1==null?"":rValue1.toString(scope)+" ") + (operator==null?"":operator+" ") + - rValue2 .getAsTypedString(scope); - } - - @Override - public String getAsString() { - return - lValue.getAsString() + " ← " + - (rValue1==null?"":rValue1.getAsString()+" ") + - (operator==null?"":operator+" ") + - rValue2.getAsString() ; + rValue2.toString(scope); } @Override diff --git a/src/dk/camelot64/kickc/icl/StatementCall.java b/src/dk/camelot64/kickc/icl/StatementCall.java index 1a2ff91c4..638b0aff8 100644 --- a/src/dk/camelot64/kickc/icl/StatementCall.java +++ b/src/dk/camelot64/kickc/icl/StatementCall.java @@ -94,14 +94,14 @@ public class StatementCall implements StatementLValue { @Override public String toString() { - return getAsString(); + return toString(null); } @Override - public String getAsTypedString(ProgramScope scope) { + public String toString(ProgramScope scope) { StringBuilder res = new StringBuilder(); if(lValue!=null) { - res.append(lValue.getAsTypedString(scope)); + res.append(lValue.toString(scope)); res.append(" ← "); } res.append("call "); @@ -112,31 +112,7 @@ public class StatementCall implements StatementLValue { } if(parameters!=null) { for (RValue parameter : parameters) { - res.append(parameter.getAsTypedString(scope) + " "); - } - } - if(parametersByAssignment) { - res.append("param-assignment"); - } - return res.toString(); - } - - @Override - public String getAsString() { - StringBuilder res = new StringBuilder(); - if(lValue!=null) { - res.append(lValue.getAsString()); - res.append(" ← "); - } - res.append("call "); - if(procedure!=null) { - res.append(procedure.getFullName()+ " "); - } else { - res.append(procedureName + " "); - } - if(parameters!=null) { - for (RValue parameter : parameters) { - res.append(parameter.getAsString() + " "); + res.append(parameter.toString(scope) + " "); } } if(parametersByAssignment) { diff --git a/src/dk/camelot64/kickc/icl/StatementConditionalJump.java b/src/dk/camelot64/kickc/icl/StatementConditionalJump.java index adfaa1b1d..ab4375d02 100644 --- a/src/dk/camelot64/kickc/icl/StatementConditionalJump.java +++ b/src/dk/camelot64/kickc/icl/StatementConditionalJump.java @@ -72,32 +72,18 @@ public class StatementConditionalJump implements Statement { @Override public String toString() { - return getAsString(); + return toString(null); } @Override - public String getAsTypedString(ProgramScope scope) { + public String toString(ProgramScope scope) { StringBuilder out = new StringBuilder(); out.append("if("); if(rValue1!=null) { - out.append(rValue1.getAsTypedString(scope)); + out.append(rValue1.toString(scope)); out.append(operator.getOperator()); } - out.append(rValue2.getAsTypedString(scope)); - out.append(") goto "); - out.append(destination.getFullName()); - return out.toString(); - } - - @Override - public String getAsString() { - StringBuilder out = new StringBuilder(); - out.append("if("); - if(rValue1!=null) { - out.append(rValue1.getAsString()); - out.append(operator.getOperator()); - } - out.append(rValue2.getAsString()); + out.append(rValue2.toString(scope)); out.append(") goto "); out.append(destination.getFullName()); return out.toString(); diff --git a/src/dk/camelot64/kickc/icl/StatementJump.java b/src/dk/camelot64/kickc/icl/StatementJump.java index 4cfed455b..689b6b3eb 100644 --- a/src/dk/camelot64/kickc/icl/StatementJump.java +++ b/src/dk/camelot64/kickc/icl/StatementJump.java @@ -24,16 +24,11 @@ public class StatementJump implements Statement { @Override public String toString() { - return getAsString(); + return toString(null); } @Override - public String getAsTypedString(ProgramScope scope) { - return getAsString(); - } - - @Override - public String getAsString() { + public String toString(ProgramScope scope) { return "goto "+destination.getFullName(); } diff --git a/src/dk/camelot64/kickc/icl/StatementLabel.java b/src/dk/camelot64/kickc/icl/StatementLabel.java index a3918569c..500a8b6f9 100644 --- a/src/dk/camelot64/kickc/icl/StatementLabel.java +++ b/src/dk/camelot64/kickc/icl/StatementLabel.java @@ -17,16 +17,12 @@ public class StatementLabel implements Statement { @Override public String toString() { - return getAsString(); + return toString(null); } @Override - public String getAsTypedString(ProgramScope scope) { - return getAsString(); - } - - @Override - public String getAsString() { + public String toString(ProgramScope scope) { return label.getFullName() + ":"; } + } diff --git a/src/dk/camelot64/kickc/icl/StatementPhiBlock.java b/src/dk/camelot64/kickc/icl/StatementPhiBlock.java index c7be9f2e9..608463fbe 100644 --- a/src/dk/camelot64/kickc/icl/StatementPhiBlock.java +++ b/src/dk/camelot64/kickc/icl/StatementPhiBlock.java @@ -70,43 +70,19 @@ public class StatementPhiBlock implements Statement { } @Override - public String getAsTypedString(ProgramScope scope) { + public String toString(ProgramScope scope) { StringBuilder s = new StringBuilder(); List variables = new ArrayList<>(phiVariables); Collections.reverse(variables); for (PhiVariable phiVariable : variables) { - s.append(phiVariable.getVariable().getAsTypedString(scope)); + s.append(phiVariable.getVariable().toString(scope)); s.append(" ← phi("); for (PhiRValue phiRValue : phiVariable.getValues()) { s.append(" "); - s.append(phiRValue.getPredecessor().getAsString()); + s.append(phiRValue.getPredecessor().toString(null)); s.append("/"); RValue rValue = phiRValue.getrValue(); - s.append(rValue==null?"null":rValue.getAsTypedString(scope)); - } - s.append(" )\n "); - } - if(s.length()>0) { - return s.toString().substring(0, s.length() - 3); - } else { - return s.toString(); - } - } - - @Override - public String getAsString() { - StringBuilder s = new StringBuilder(); - List variables = new ArrayList<>(phiVariables); - Collections.reverse(variables); - for (PhiVariable phiVariable : variables) { - s.append(phiVariable.getVariable().getAsString()); - s.append(" ← phi("); - for (PhiRValue phiRValue : phiVariable.getValues()) { - s.append(" "); - s.append(phiRValue.getPredecessor().getAsString()); - s.append("/"); - RValue rValue = phiRValue.getrValue(); - s.append(rValue==null?"null":rValue.getAsString()); + s.append(rValue==null?"null":rValue.toString(scope)); } s.append(" )\n "); } diff --git a/src/dk/camelot64/kickc/icl/StatementProcedureBegin.java b/src/dk/camelot64/kickc/icl/StatementProcedureBegin.java index 9769f9caa..c30214a48 100644 --- a/src/dk/camelot64/kickc/icl/StatementProcedureBegin.java +++ b/src/dk/camelot64/kickc/icl/StatementProcedureBegin.java @@ -30,16 +30,12 @@ public class StatementProcedureBegin implements Statement { @Override public String toString() { - return getAsString(); + return toString(null); } @Override - public String getAsTypedString(ProgramScope scope) { - return "proc " + procedure.getAsTypedString(scope); + public String toString(ProgramScope scope) { + return "proc " + procedure.toString(scope); } - @Override - public String getAsString() { - return "proc " + procedure.getAsString(); - } } diff --git a/src/dk/camelot64/kickc/icl/StatementProcedureEnd.java b/src/dk/camelot64/kickc/icl/StatementProcedureEnd.java index 5803892af..52c3444d3 100644 --- a/src/dk/camelot64/kickc/icl/StatementProcedureEnd.java +++ b/src/dk/camelot64/kickc/icl/StatementProcedureEnd.java @@ -15,15 +15,11 @@ public class StatementProcedureEnd implements Statement { @Override public String toString() { - return getAsString(); + return toString(null); } @Override - public String getAsTypedString(ProgramScope scope) { - return getAsString(); + public String toString(ProgramScope scope) { + return "endproc // "+procedure.getFullName()+"()"; } - - @Override - public String getAsString() { - return "endproc // "+procedure.getFullName()+"()"; } } diff --git a/src/dk/camelot64/kickc/icl/StatementReturn.java b/src/dk/camelot64/kickc/icl/StatementReturn.java index 318366f41..f1f67c639 100644 --- a/src/dk/camelot64/kickc/icl/StatementReturn.java +++ b/src/dk/camelot64/kickc/icl/StatementReturn.java @@ -26,16 +26,13 @@ public class StatementReturn implements Statement { @Override public String toString() { - return getAsString(); + return toString(null); } @Override - public String getAsTypedString(ProgramScope scope) { - return "return "+(value==null?"":value.getAsTypedString(scope)); } - - @Override - public String getAsString() { - return "return "+(value==null?"":value.getAsString()); } + public String toString(ProgramScope scope) { + return "return " + (value == null ? "" : value.toString(scope)); + } @Override public boolean equals(Object o) { diff --git a/src/dk/camelot64/kickc/icl/StatementSequence.java b/src/dk/camelot64/kickc/icl/StatementSequence.java index 174f5c4ba..e2132c195 100644 --- a/src/dk/camelot64/kickc/icl/StatementSequence.java +++ b/src/dk/camelot64/kickc/icl/StatementSequence.java @@ -20,24 +20,13 @@ public class StatementSequence { return statements; } - public String getAsTypedString(ProgramScope scope) { + public String toString(ProgramScope scope) { StringBuffer out = new StringBuffer(); for (Statement statement : statements) { if(!(statement instanceof StatementLabel)) { out.append(" "); } - out.append(statement.getAsTypedString(scope)+"\n"); - } - return out.toString(); - } - - public String getAsString() { - StringBuffer out = new StringBuffer(); - for (Statement statement : statements) { - if(!(statement instanceof StatementLabel)) { - out.append(" "); - } - out.append(statement.getAsString()+"\n"); + out.append(statement.toString(scope)+"\n"); } return out.toString(); } diff --git a/src/dk/camelot64/kickc/icl/Symbol.java b/src/dk/camelot64/kickc/icl/Symbol.java index e1d712084..42b80c296 100644 --- a/src/dk/camelot64/kickc/icl/Symbol.java +++ b/src/dk/camelot64/kickc/icl/Symbol.java @@ -11,9 +11,6 @@ public interface Symbol extends Value { @JsonIgnore String getFullName(); - @JsonIgnore - String getTypedName(); - SymbolType getType(); @JsonIgnore diff --git a/src/dk/camelot64/kickc/icl/SymbolRef.java b/src/dk/camelot64/kickc/icl/SymbolRef.java index 516693334..9dd7ae44b 100644 --- a/src/dk/camelot64/kickc/icl/SymbolRef.java +++ b/src/dk/camelot64/kickc/icl/SymbolRef.java @@ -40,14 +40,12 @@ public class SymbolRef implements Value { } @Override - public String getAsTypedString(ProgramScope scope) { - return scope.getSymbol(fullName).getTypedName(); - } - - @Override - @JsonIgnore - public String getAsString() { - return fullName; + public String toString(ProgramScope scope) { + if (scope == null) { + return fullName; + } else { + return scope.getSymbol(fullName).toString(scope); + } } @JsonIgnore diff --git a/src/dk/camelot64/kickc/icl/Value.java b/src/dk/camelot64/kickc/icl/Value.java index 71a1d9180..ecd179cbe 100644 --- a/src/dk/camelot64/kickc/icl/Value.java +++ b/src/dk/camelot64/kickc/icl/Value.java @@ -24,8 +24,6 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo; }) public interface Value { - String getAsTypedString(ProgramScope scope); - - String getAsString(); + String toString(ProgramScope scope); } diff --git a/src/dk/camelot64/kickc/icl/Variable.java b/src/dk/camelot64/kickc/icl/Variable.java index aa15c0e82..825667059 100644 --- a/src/dk/camelot64/kickc/icl/Variable.java +++ b/src/dk/camelot64/kickc/icl/Variable.java @@ -45,12 +45,6 @@ public abstract class Variable implements Symbol { return Scope.getFullName(this); } - @Override - @JsonIgnore - public String getTypedName() { - return "(" + type.getTypeName() + (inferredType ? "~" : "") + ") " + getFullName(); - } - public SymbolType getType() { return type; } @@ -120,18 +114,12 @@ public abstract class Variable implements Symbol { @Override public String toString() { - return getTypedName(); + return toString(null); } @Override - public String getAsTypedString(ProgramScope scope) { - return getTypedName(); - } - - @Override - @JsonIgnore - public String getAsString() { - return getTypedName(); + public String toString(ProgramScope scope) { + return "(" + type.getTypeName() + (inferredType ? "~" : "") + ") " + getFullName(); } @JsonIgnore diff --git a/src/dk/camelot64/kickc/passes/Pass1GenerateSingleStaticAssignmentForm.java b/src/dk/camelot64/kickc/passes/Pass1GenerateSingleStaticAssignmentForm.java index b30a6e452..b3f76e6e6 100644 --- a/src/dk/camelot64/kickc/passes/Pass1GenerateSingleStaticAssignmentForm.java +++ b/src/dk/camelot64/kickc/passes/Pass1GenerateSingleStaticAssignmentForm.java @@ -30,7 +30,7 @@ public class Pass1GenerateSingleStaticAssignmentForm { do { log.append("Completing Phi functions..."); done = completePhiFunctions(); - //log.append(this.controlFlowGraph.getAsTypedString(symbols)); + //log.append(this.controlFlowGraph.toString(symbols)); } while (!done); } diff --git a/src/dk/camelot64/kickc/passes/Pass1GenerateStatementSequence.java b/src/dk/camelot64/kickc/passes/Pass1GenerateStatementSequence.java index 44efe2ad2..129bcd061 100644 --- a/src/dk/camelot64/kickc/passes/Pass1GenerateStatementSequence.java +++ b/src/dk/camelot64/kickc/passes/Pass1GenerateStatementSequence.java @@ -462,7 +462,7 @@ public class Pass1GenerateStatementSequence extends KickCBaseVisitor { for (PrePostModifier mod : modifiers) { Statement stmt = new StatementAssignment((LValue) mod.child, mod.operator, mod.child); parser.sequence.addStatement(stmt); - parser.log.append("Adding pre/post-modifier "+stmt.getAsTypedString(parser.programScope)); + parser.log.append("Adding pre/post-modifier "+stmt.toString(parser.programScope)); } } diff --git a/src/dk/camelot64/kickc/passes/Pass2AliasElimination.java b/src/dk/camelot64/kickc/passes/Pass2AliasElimination.java index 3dd42abc3..cf35d69c1 100644 --- a/src/dk/camelot64/kickc/passes/Pass2AliasElimination.java +++ b/src/dk/camelot64/kickc/passes/Pass2AliasElimination.java @@ -2,7 +2,6 @@ package dk.camelot64.kickc.passes; import dk.camelot64.kickc.CompileLog; import dk.camelot64.kickc.icl.*; -import javafx.scene.input.InputMethodTextRun; import java.util.*; @@ -26,10 +25,10 @@ public class Pass2AliasElimination extends Pass2SsaOptimization { replaceVariables(aliases.getReplacements()); for (AliasSet aliasSet : aliases.getAliasSets()) { StringBuilder str = new StringBuilder(); - str.append(aliasSet.getKeepVar().getAsTypedString(getSymbols())); + str.append(aliasSet.getKeepVar().toString(getSymbols())); str.append(" = "); for (VariableRef var : aliasSet.getEliminateVars()) { - str.append(var.getAsTypedString(getSymbols()) + " "); + str.append(var.toString(getSymbols()) + " "); } log.append("Alias " + str); } @@ -239,7 +238,7 @@ public class Pass2AliasElimination extends Pass2SsaOptimization { for (StatementPhiBlock.PhiRValue phiRValue : phiVariable.getValues()) { RValue rValue = phiRValue.getrValue(); if (aliasSet.contains(rValue)) { - log.append("Alias candidate removed " + rValue.getAsTypedString(getSymbols())); + log.append("Alias candidate removed " + rValue.toString(getSymbols())); aliasSet.remove(rValue); break; } diff --git a/src/dk/camelot64/kickc/passes/Pass2ConditionalJumpSimplification.java b/src/dk/camelot64/kickc/passes/Pass2ConditionalJumpSimplification.java index b033cbca2..a113099e0 100644 --- a/src/dk/camelot64/kickc/passes/Pass2ConditionalJumpSimplification.java +++ b/src/dk/camelot64/kickc/passes/Pass2ConditionalJumpSimplification.java @@ -56,7 +56,7 @@ public class Pass2ConditionalJumpSimplification extends Pass2SsaOptimization { conditionalJump.setOperator(conditionAssignment.getOperator()); conditionalJump.setRValue2(conditionAssignment.getrValue2()); simpleConditionVars.add(conditionVar); - log.append("Simple Condition " + conditionVar.getAsTypedString(getSymbols()) + " " + conditionalJump.getAsTypedString(getSymbols())); + log.append("Simple Condition " + conditionVar.toString(getSymbols()) + " " + conditionalJump.toString(getSymbols())); break; default: } diff --git a/src/dk/camelot64/kickc/passes/Pass2ConstantAdditionElimination.java b/src/dk/camelot64/kickc/passes/Pass2ConstantAdditionElimination.java index 86fd68fdc..259ffff59 100644 --- a/src/dk/camelot64/kickc/passes/Pass2ConstantAdditionElimination.java +++ b/src/dk/camelot64/kickc/passes/Pass2ConstantAdditionElimination.java @@ -145,7 +145,7 @@ public class Pass2ConstantAdditionElimination extends Pass2SsaOptimization { */ private ConstantInteger consolidateSubConstants(VariableRef variable) { if(getUsages(variable) >1) { - log.append("Multiple usages for variable. Not optimizing sub-constant "+variable.getAsTypedString(getSymbols())); + log.append("Multiple usages for variable. Not optimizing sub-constant "+variable.toString(getSymbols())); return null; } Variable var = getSymbols().getVariable(variable); diff --git a/src/dk/camelot64/kickc/passes/Pass2ConstantPropagation.java b/src/dk/camelot64/kickc/passes/Pass2ConstantPropagation.java index 31584ba88..d76cb7988 100644 --- a/src/dk/camelot64/kickc/passes/Pass2ConstantPropagation.java +++ b/src/dk/camelot64/kickc/passes/Pass2ConstantPropagation.java @@ -22,7 +22,7 @@ public class Pass2ConstantPropagation extends Pass2SsaOptimization { final Map constants = findConstantVariables(); for (VariableRef constantVar : constants.keySet()) { Constant constantValue = constants.get(constantVar); - log.append("Constant " + constantVar.getAsTypedString(getSymbols()) + " " + constantValue.getAsTypedString(getSymbols())); + log.append("Constant " + constantVar.toString(getSymbols()) + " " + constantValue.toString(getSymbols())); } removeAssignments(constants.keySet()); deleteVariables(constants.keySet()); diff --git a/src/dk/camelot64/kickc/passes/Pass2CullEmptyBlocks.java b/src/dk/camelot64/kickc/passes/Pass2CullEmptyBlocks.java index 734b2b045..772951196 100644 --- a/src/dk/camelot64/kickc/passes/Pass2CullEmptyBlocks.java +++ b/src/dk/camelot64/kickc/passes/Pass2CullEmptyBlocks.java @@ -68,7 +68,7 @@ public class Pass2CullEmptyBlocks extends Pass2SsaOptimization { LabelRef removeBlockLabelRef = removeBlock.getLabel(); Label removeBlockLabel = getSymbols().getLabel(removeBlockLabelRef); removeBlockLabel.getScope().remove(removeBlockLabel); - log.append("Culled Empty Block " + removeBlockLabel.getTypedName()); + log.append("Culled Empty Block " + removeBlockLabel.toString(getSymbols())); } return remove.size()>0; } diff --git a/src/dk/camelot64/kickc/passes/Pass2RedundantPhiElimination.java b/src/dk/camelot64/kickc/passes/Pass2RedundantPhiElimination.java index 51d375c0f..caa16ddd3 100644 --- a/src/dk/camelot64/kickc/passes/Pass2RedundantPhiElimination.java +++ b/src/dk/camelot64/kickc/passes/Pass2RedundantPhiElimination.java @@ -23,7 +23,7 @@ public class Pass2RedundantPhiElimination extends Pass2SsaOptimization { replaceVariables(aliases); for (VariableRef var : aliases.keySet()) { RValue alias = aliases.get(var); - log.append("Redundant Phi " + var.getAsTypedString(getSymbols()) + " " + alias.getAsTypedString(getSymbols())); + log.append("Redundant Phi " + var.toString(getSymbols()) + " " + alias.toString(getSymbols())); } deleteVariables(aliases.keySet()); return aliases.size()>0; diff --git a/src/dk/camelot64/kickc/passes/Pass2SelfPhiElimination.java b/src/dk/camelot64/kickc/passes/Pass2SelfPhiElimination.java index fc8a1cafd..36a51fb38 100644 --- a/src/dk/camelot64/kickc/passes/Pass2SelfPhiElimination.java +++ b/src/dk/camelot64/kickc/passes/Pass2SelfPhiElimination.java @@ -28,7 +28,7 @@ public class Pass2SelfPhiElimination extends Pass2SsaOptimization { if (phiRValue.getrValue().equals(phiVariable.getVariable())) { iterator.remove(); optimized[0] = Boolean.TRUE; - log.append("Self Phi Eliminated "+phiVariable.getVariable().getAsTypedString(getSymbols())); + log.append("Self Phi Eliminated "+phiVariable.getVariable().toString(getSymbols())); } } } diff --git a/src/dk/camelot64/kickc/passes/Pass2SsaOptimization.java b/src/dk/camelot64/kickc/passes/Pass2SsaOptimization.java index 94c2e4e20..b6541d7de 100644 --- a/src/dk/camelot64/kickc/passes/Pass2SsaOptimization.java +++ b/src/dk/camelot64/kickc/passes/Pass2SsaOptimization.java @@ -46,18 +46,14 @@ public abstract class Pass2SsaOptimization { public static RValue VOID = new RValue() { @Override public String toString() { - return getAsString(); + return toString(null); } @Override - public String getAsTypedString(ProgramScope scope) { - return getAsString(); - } - - @Override - public String getAsString() { + public String toString(ProgramScope scope) { return "VOID"; } + }; /** diff --git a/src/dk/camelot64/kickc/passes/Pass3CodeGeneration.java b/src/dk/camelot64/kickc/passes/Pass3CodeGeneration.java index c11599873..4fc9044f2 100644 --- a/src/dk/camelot64/kickc/passes/Pass3CodeGeneration.java +++ b/src/dk/camelot64/kickc/passes/Pass3CodeGeneration.java @@ -62,19 +62,19 @@ public class Pass3CodeGeneration { } assignment = (StatementAssignment) statement; AsmFragment asmFragment = new AsmFragment(assignment, assignmentAlu, symbols); - asm.addComment(statement.getAsTypedString(symbols) + " // " + asmFragment.getSignature()); + asm.addComment(statement.toString(symbols) + " // " + asmFragment.getSignature()); asmFragment.generate(asm); isAlu = true; } } if (!isAlu) { AsmFragment asmFragment = new AsmFragment(assignment, symbols); - asm.addComment(statement.getAsTypedString(symbols) + " // " + asmFragment.getSignature()); + asm.addComment(statement.toString(symbols) + " // " + asmFragment.getSignature()); asmFragment.generate(asm); } } else if (statement instanceof StatementConditionalJump) { AsmFragment asmFragment = new AsmFragment((StatementConditionalJump) statement, block, symbols, graph); - asm.addComment(statement.getAsTypedString(symbols) + " // " + asmFragment.getSignature()); + asm.addComment(statement.toString(symbols) + " // " + asmFragment.getSignature()); asmFragment.generate(asm); } else if (statement instanceof StatementCall) { StatementCall call = (StatementCall) statement; @@ -147,11 +147,11 @@ public class Pass3CodeGeneration { private void genAsmMove(AsmProgram asm, LValue lValue, RValue rValue) { if (getRegister(lValue).equals(getRegister(rValue))) { // Do not move from register to itself - asm.addComment(lValue.getAsTypedString(symbols) + " = " + rValue.getAsTypedString(symbols) + " // register copy "); + asm.addComment(lValue.toString(symbols) + " = " + rValue.toString(symbols) + " // register copy "); return; } AsmFragment asmFragment = new AsmFragment(lValue, rValue, symbols); - asm.addComment(lValue.getAsTypedString(symbols) + " = " + rValue.getAsTypedString(symbols) + " // " + asmFragment.getSignature()); + asm.addComment(lValue.toString(symbols) + " = " + rValue.toString(symbols) + " // " + asmFragment.getSignature()); asmFragment.generate(asm); } diff --git a/src/dk/camelot64/kickc/test/TestCompilationOutput.java b/src/dk/camelot64/kickc/test/TestCompilationOutput.java index 288c2f488..71d45401d 100644 --- a/src/dk/camelot64/kickc/test/TestCompilationOutput.java +++ b/src/dk/camelot64/kickc/test/TestCompilationOutput.java @@ -63,7 +63,7 @@ public class TestCompilationOutput extends TestCase { boolean success = true; success &= testOutput(fileName, ".asm", output.getAsmProgram().toString(false)); success &= testOutput(fileName, ".sym", output.getSymbols().getSymbolTableContents()); - success &= testOutput(fileName, ".cfg", output.getGraph().getAsTypedString(output.getSymbols())); + success &= testOutput(fileName, ".cfg", output.getGraph().toString(output.getSymbols())); success &= testOutput(fileName, ".log", output.getLog().toString()); if(!success) { fail("Output does not match reference!");