NichtHaskell/Source/abstractSyntaxTree/Expression/UnaryExpression.java
2024-05-08 12:56:40 +02:00

66 lines
1.7 KiB
Java

package abstractSyntaxTree.Expression;
import TypeCheck.AbstractType;
import TypeCheck.TypeCheckHelper;
import TypeCheck.TypeCheckResult;
import abstractSyntaxTree.Datatype.IDatatype;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import java.util.Objects;
public class UnaryExpression extends AbstractType implements IExpression{
public String operator;
public IDatatype operand;
@Override
public TypeCheckResult typeCheck() throws Exception {
TypeCheckResult result = new TypeCheckResult();
TypeCheckResult operandTypeCheckResult = operand.typeCheck();
String operandType = operandTypeCheckResult.type;
switch (operator) {
case "!" :{
if (Objects.equals(operandType, "bool")){
result.type = "bool";
}
break;
}
case "-":
case "+":
if (Objects.equals(operandType, "int")){
result.type = "int";
}
break;
}
setTypeCheckResult(result);
return result;
}
@Override
public void codeGen(MethodVisitor mv) throws Exception {
operand.codeGen(mv);
switch (operator) {
case "!":
//XOR with 1 to get the negation
mv.visitInsn(Opcodes.ICONST_1);
mv.visitInsn(Opcodes.IXOR);
break;
case "-":
mv.visitInsn(Opcodes.INEG);
break;
case "+":
break;
default: throw new Exception("Unknown operator :" + operator);
}
}
}