mirror of
https://gitlab.com/camelot/kickc.git
synced 2024-11-29 18:49:42 +00:00
Added support for
This commit is contained in:
parent
bc0fcc50fd
commit
22abed306c
@ -1,5 +1,11 @@
|
||||
package dk.camelot64.kickc.model.operators;
|
||||
|
||||
import dk.camelot64.kickc.model.CompileError;
|
||||
import dk.camelot64.kickc.model.values.ConstantBool;
|
||||
import dk.camelot64.kickc.model.values.ConstantEnumerable;
|
||||
import dk.camelot64.kickc.model.values.ConstantInteger;
|
||||
import dk.camelot64.kickc.model.values.ConstantLiteral;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
@ -64,4 +70,12 @@ public class Operator implements Serializable {
|
||||
return result;
|
||||
}
|
||||
|
||||
static Boolean getBool(ConstantLiteral literal) {
|
||||
if(literal instanceof ConstantBool)
|
||||
return ((ConstantBool) literal).getBool();
|
||||
if(literal instanceof ConstantEnumerable)
|
||||
return !((ConstantEnumerable) literal).getInteger().equals(0L);
|
||||
throw new CompileError("Not a boolean" + literal);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -33,4 +33,7 @@ public abstract class OperatorBinary extends Operator {
|
||||
public boolean isAssociative() {
|
||||
return associative;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
@ -3,6 +3,7 @@ package dk.camelot64.kickc.model.operators;
|
||||
import dk.camelot64.kickc.model.CompileError;
|
||||
import dk.camelot64.kickc.model.types.SymbolType;
|
||||
import dk.camelot64.kickc.model.values.ConstantBool;
|
||||
import dk.camelot64.kickc.model.values.ConstantInteger;
|
||||
import dk.camelot64.kickc.model.values.ConstantLiteral;
|
||||
|
||||
/** Binary logic and Operator ( x && y ) */
|
||||
@ -14,10 +15,7 @@ public class OperatorLogicAnd extends OperatorBinary {
|
||||
|
||||
@Override
|
||||
public ConstantLiteral calculateLiteral(ConstantLiteral left, ConstantLiteral right) {
|
||||
if(left instanceof ConstantBool && right instanceof ConstantBool) {
|
||||
return new ConstantBool(((ConstantBool) left).getBool() && ((ConstantBool) right).getBool());
|
||||
}
|
||||
throw new CompileError("Calculation not implemented " + left + " " + getOperator() + " " + right);
|
||||
return new ConstantBool(getBool(left) && getBool(right));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -16,13 +16,7 @@ public class OperatorLogicNot extends OperatorUnary {
|
||||
|
||||
@Override
|
||||
public ConstantLiteral calculateLiteral(ConstantLiteral left, ProgramScope scope) {
|
||||
if(left instanceof ConstantEnumerable) {
|
||||
left = new ConstantBool(((ConstantEnumerable) left).getInteger()!=0);
|
||||
}
|
||||
if(left instanceof ConstantBool) {
|
||||
return new ConstantBool(!((ConstantBool) left).getBool() );
|
||||
}
|
||||
throw new CompileError("Calculation not implemented " + getOperator() + " " + left );
|
||||
return new ConstantBool(!getBool(left));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -1,6 +1,5 @@
|
||||
package dk.camelot64.kickc.model.operators;
|
||||
|
||||
import dk.camelot64.kickc.model.CompileError;
|
||||
import dk.camelot64.kickc.model.types.SymbolType;
|
||||
import dk.camelot64.kickc.model.values.ConstantBool;
|
||||
import dk.camelot64.kickc.model.values.ConstantLiteral;
|
||||
@ -14,10 +13,7 @@ public class OperatorLogicOr extends OperatorBinary {
|
||||
|
||||
@Override
|
||||
public ConstantLiteral calculateLiteral(ConstantLiteral left, ConstantLiteral right) {
|
||||
if(left instanceof ConstantBool && right instanceof ConstantBool) {
|
||||
return new ConstantBool(((ConstantBool) left).getBool() || ((ConstantBool) right).getBool());
|
||||
}
|
||||
throw new CompileError("Calculation not implemented " + left + " " + getOperator() + " " + right);
|
||||
return new ConstantBool(getBool(left) || getBool(right));
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -25,5 +21,4 @@ public class OperatorLogicOr extends OperatorBinary {
|
||||
return SymbolType.BOOLEAN;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -162,6 +162,8 @@ public class TestPreprocessor {
|
||||
assertEquals("name:y;", parse("#if defined A\nx;\n#endif\ny;"));
|
||||
// Output generated by #elif
|
||||
assertEquals("name:y;name:w;", parse("#if 0\nx;\n#elif 1\ny;\n#elif 1\nz;\n#else\nq;\n#endif\nw;"));
|
||||
// Output generated by #if using defined and || operator
|
||||
assertEquals("name:x;name:y;", parse("#define A X\n#if defined(A) || defined(B)\nx;\n#endif\ny;"));
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user