From 440c55eea124daf144601bd3895461011c24d9b1 Mon Sep 17 00:00:00 2001 From: Peter Jakubco Date: Sat, 29 May 2021 10:54:32 +0200 Subject: [PATCH] [#201] Refactoring --- .../plugins/compiler/ssem/CompilerChecks.java | 14 ++++++ .../compiler/ssem/ast/ProgramParser.java | 47 +++++++------------ .../plugins/cpu/ssem/EmulatorEngine.java | 6 +-- 3 files changed, 34 insertions(+), 33 deletions(-) diff --git a/plugins/compiler/as-ssem/src/main/java/net/emustudio/plugins/compiler/ssem/CompilerChecks.java b/plugins/compiler/as-ssem/src/main/java/net/emustudio/plugins/compiler/ssem/CompilerChecks.java index 2c8cdf2f0..a8699d8eb 100644 --- a/plugins/compiler/as-ssem/src/main/java/net/emustudio/plugins/compiler/ssem/CompilerChecks.java +++ b/plugins/compiler/as-ssem/src/main/java/net/emustudio/plugins/compiler/ssem/CompilerChecks.java @@ -1,5 +1,9 @@ package net.emustudio.plugins.compiler.ssem; +import org.antlr.v4.runtime.Token; + +import java.util.function.Function; + public class CompilerChecks { public static void checkStartLineDefined(boolean defined, Position pos, int startLine) { @@ -33,4 +37,14 @@ public static void checkOperandOutOfBounds(Position pos, int tokenType, long ope ); } } + + public static T checkedParseNumber(Token token, Function parser) { + try { + return parser.apply(token); + } catch (NumberFormatException e) { + throw new CompileException( + token.getLine(), token.getCharPositionInLine(), "Could not parse number: " + token.getText() + ); + } + } } diff --git a/plugins/compiler/as-ssem/src/main/java/net/emustudio/plugins/compiler/ssem/ast/ProgramParser.java b/plugins/compiler/as-ssem/src/main/java/net/emustudio/plugins/compiler/ssem/ast/ProgramParser.java index 00fb38a3f..53c74a08d 100644 --- a/plugins/compiler/as-ssem/src/main/java/net/emustudio/plugins/compiler/ssem/ast/ProgramParser.java +++ b/plugins/compiler/as-ssem/src/main/java/net/emustudio/plugins/compiler/ssem/ast/ProgramParser.java @@ -1,11 +1,12 @@ package net.emustudio.plugins.compiler.ssem.ast; -import net.emustudio.plugins.compiler.ssem.CompileException; import net.emustudio.plugins.compiler.ssem.Position; import net.emustudio.plugins.compiler.ssem.SSEMParser; import net.emustudio.plugins.compiler.ssem.SSEMParserBaseVisitor; import org.antlr.v4.runtime.Token; +import static net.emustudio.plugins.compiler.ssem.CompilerChecks.checkedParseNumber; + public class ProgramParser extends SSEMParserBaseVisitor { private final Program program = new Program(); @@ -42,47 +43,33 @@ public Program visitLine(SSEMParser.LineContext ctx) { return program; } + public Program getProgram() { + return program; + } + private long parseBinary(Token token) { - try { - return Long.parseLong(token.getText(), 2); - } catch (NumberFormatException e) { - throw new CompileException( - token.getLine(), token.getCharPositionInLine(), "Could not parse number: " + token.getText() - ); - } + return checkedParseNumber(token, t -> Long.parseLong(t.getText(), 2)); } private long parseNumber(Token token) { - try { - if (token.getType() == SSEMParser.HEXNUMBER) { - return Long.decode(token.getText()); + return checkedParseNumber(token, t -> { + if (t.getType() == SSEMParser.HEXNUMBER) { + return Long.decode(t.getText()); } else { // Do not use decode because we don't support octal numbers - return Long.parseLong(token.getText()); + return Long.parseLong(t.getText()); } - } catch (NumberFormatException e) { - throw new CompileException( - token.getLine(), token.getCharPositionInLine(), "Could not parse number: " + token.getText() - ); - } + }); } private int parsePositiveInteger(Token token) { - try { - if (token.getType() == SSEMParser.HEXNUMBER) { - return Integer.decode(token.getText()); + return checkedParseNumber(token, t -> { + if (t.getType() == SSEMParser.HEXNUMBER) { + return Integer.decode(t.getText()); } else { // Do not use decode because we don't support octal numbers - return Integer.parseUnsignedInt(token.getText()); + return Integer.parseUnsignedInt(t.getText()); } - } catch (NumberFormatException e) { - throw new CompileException( - token.getLine(), token.getCharPositionInLine(), "Could not parse number: " + token.getText() - ); - } - } - - public Program getProgram() { - return program; + }); } } diff --git a/plugins/cpu/ssem-cpu/src/main/java/net/emustudio/plugins/cpu/ssem/EmulatorEngine.java b/plugins/cpu/ssem-cpu/src/main/java/net/emustudio/plugins/cpu/ssem/EmulatorEngine.java index 372cbc0ac..8c49ee6ee 100644 --- a/plugins/cpu/ssem-cpu/src/main/java/net/emustudio/plugins/cpu/ssem/EmulatorEngine.java +++ b/plugins/cpu/ssem-cpu/src/main/java/net/emustudio/plugins/cpu/ssem/EmulatorEngine.java @@ -71,7 +71,7 @@ CPU.RunState step() { return CPU.RunState.STATE_STOPPED_BREAK; } break; - case 4: // JPR + case 4: // JPR, JRP, JMR CI.addAndGet(readLineAddress(lineAddress)); break; case 2: // LDN @@ -84,12 +84,12 @@ CPU.RunState step() { case 1: // SUB Acc.addAndGet(-readInt(lineAddress)); break; - case 3: // CMP / SKN + case 3: // CMP, SKN if (Acc.get() < 0) { CI.addAndGet(4); } break; - case 7: // STP / HLT + case 7: // STP, HLT return CPU.RunState.STATE_STOPPED_NORMAL; default: return CPU.RunState.STATE_STOPPED_BAD_INSTR;