add unary codegen for +, -
This commit is contained in:
@ -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");
|
||||||
|
|||||||
Reference in New Issue
Block a user