Skip to content

Commit

Permalink
[#201] Refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
vbmacher committed May 29, 2021
1 parent 60212b0 commit 440c55e
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 33 deletions.
Original file line number Diff line number Diff line change
@@ -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) {
Expand Down Expand Up @@ -33,4 +37,14 @@ public static void checkOperandOutOfBounds(Position pos, int tokenType, long ope
);
}
}

public static <T extends Number> T checkedParseNumber(Token token, Function<Token, T> parser) {
try {
return parser.apply(token);
} catch (NumberFormatException e) {
throw new CompileException(
token.getLine(), token.getCharPositionInLine(), "Could not parse number: " + token.getText()
);
}
}
}
Original file line number Diff line number Diff line change
@@ -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<Program> {
private final Program program = new Program();

Expand Down Expand Up @@ -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;
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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;
Expand Down

0 comments on commit 440c55e

Please sign in to comment.