add unary codegen for +, -

This commit is contained in:
Christoph
2021-01-21 19:03:04 +01:00
parent 8fe5659f21
commit b703ae2b31

View File

@ -102,6 +102,8 @@ public final class CodeGenerator {
// TODO: Indentation? // TODO: Indentation?
// TODO: Stack size // TODO: Stack size
// TODO: Typen
// TODO: Variablengröße
private static void generateMain(AST ast, StringBuilder jasmin, Map<String, Integer> varMap) { private static void generateMain(AST ast, StringBuilder jasmin, Map<String, Integer> varMap) {
jasmin.append(".method public static main([Ljava/lang/String;)V\n") jasmin.append(".method public static main([Ljava/lang/String;)V\n")
.append(".limit stack 10\n") .append(".limit stack 10\n")
@ -135,12 +137,27 @@ public final class CodeGenerator {
.append("\n"); .append("\n");
} }
// TODO: Unary operators
private static void expr(ASTNode node, StringBuilder jasmin, Map<String, Integer> varMap) { private static void expr(ASTNode node, StringBuilder jasmin, Map<String, Integer> varMap) {
String inst = "";
if (node.getChildren().size() == 1) {
// Unary operator
generateNode(node.getChildren().get(0), jasmin, varMap);
inst = switch(node.getValue()) { //!: Type dependant
case "ADD" -> "";
case "SUB" -> "ldc -1\nimul";
// case "NOT" -> ...
default -> throw new IllegalStateException("Unexpected value: " + node.getValue());
};
} else if (node.getChildren().size() == 2) {
// Binary operator
generateNode(node.getChildren().get(0), jasmin, varMap); generateNode(node.getChildren().get(0), jasmin, varMap);
generateNode(node.getChildren().get(1), jasmin, varMap); generateNode(node.getChildren().get(1), jasmin, varMap);
final String inst = switch (node.getValue()) { //!: Type dependant inst = switch (node.getValue()) { //!: Type dependant
case "ADD" -> "iadd"; // Integer case "ADD" -> "iadd"; // Integer
case "SUB" -> "isub"; case "SUB" -> "isub";
case "MUL" -> "imul"; case "MUL" -> "imul";
@ -148,6 +165,7 @@ public final class CodeGenerator {
case "MOD" -> "irem"; // Remainder operator case "MOD" -> "irem"; // Remainder operator
default -> throw new IllegalStateException("Unexpected value: " + node.getValue()); default -> throw new IllegalStateException("Unexpected value: " + node.getValue());
}; };
}
jasmin.append(inst) jasmin.append(inst)
.append("\n"); .append("\n");