// Path: src/main/java/com/pidanic/saral/domain/expression/cast/CastExpression.java
// public class CastExpression extends UnaryExpression {
//     public CastExpression(Type castingType, Expression expression) {
//         super(castingType, getSign(castingType, expression.type()), expression);
//     }
//     @Override
//     public void accept(ExpressionGenerator generator) {
//         generator.generate(this);
//     }
// 
//     private static CastingSign getSign(Type castingType, Type expressionType) {
//         if(castingType == BuiltInType.DOUBLE) {
//             return CastingSign.LONG_TO_DOUBLE;
//         }
//         if(castingType == BuiltInType.INT) {
//             return CastingSign.LONG_TO_INT;
//         }
//         return CastingSign.LONG_TO_DOUBLE;
//     }
// }
// 
// Path: src/main/java/com/pidanic/saral/util/BuiltInType.java
// public enum BuiltInType implements Type {
//     BOOLEAN("logický", boolean.class, "Z", TypeSpecificOpcodes.INT),
//     INT ("neskutočné numeralio int", int.class, "I", TypeSpecificOpcodes.INT),
//     CHAR ("písmeno", char.class, "C", TypeSpecificOpcodes.INT),
//     //BYTE ("neskutočné numeralio", byte.class, "B", TypeSpecificOpcodes.INT),
//     //SHORT ("neskutočné numeralio", short.class, "S", TypeSpecificOpcodes.INT),
//     LONG ("neskutočné numeralio", long.class, "J", TypeSpecificOpcodes.LONG),
//     //FLOAT ("skutočné numeralio", float.class, "F", TypeSpecificOpcodes.FLOAT),
//     DOUBLE ("skutočné numeralio", double.class, "D", TypeSpecificOpcodes.DOUBLE),
//     STRING ("slovo", String.class, "Ljava/lang/String;", TypeSpecificOpcodes.OBJECT),
//     BOOLEAN_ARR("funduš logický", boolean[].class, "[B", TypeSpecificOpcodes.BOOLEAN_ARRAY),
//     //INT_ARR ("int[]", int[].class, "[I"),
//     CHAR_ARR ("funduš písmeno", char[].class, "[C", TypeSpecificOpcodes.CHAR_ARRAY),
//     //BYTE_ARR ("byte[]", byte[].class, "[B"),
//     //SHORT_ARR ("short[]", short[].class, "[S"),
//     LONG_ARR ("funduš neskutočné numeralio", long[].class, "[J", TypeSpecificOpcodes.LONG_ARRAY),
//     //FLOAT_ARR ("float[]", float[].class, "[F"),
//     DOUBLE_ARR ("funduš skutočné numeralio", double[].class, "[D", TypeSpecificOpcodes.DOUBLE_ARRAY),
//     STRING_ARR ("funduš slovo", String[].class, "[Ljava/lang/String;", TypeSpecificOpcodes.OBJECT_ARRAY),
//     //NONE("", null,""),
//     VOID("void", void.class, "V", TypeSpecificOpcodes.VOID);
// 
//     private String name;
//     private Class<?> typeClass;
//     private String descriptor;
//     private TypeSpecificOpcodes opCode;
// 
//     BuiltInType(String name, Class<?> typeClass, String descriptor, TypeSpecificOpcodes op) {
//         this.name = name;
//         this.typeClass = typeClass;
//         this.descriptor = descriptor;
//         this.opCode = op;
//     }
// 
//     @Override
//     public String getName() {
//         return name;
//     }
// 
//     @Override
//     public Class<?> getTypeClass() {
//         return typeClass;
//     }
// 
//     @Override
//     public String getDescriptor() {
//         return descriptor;
//     }
// 
//     @Override
//     public String getInternalName() {
//         return getDescriptor();
//     }
// 
//     @Override
//     public TypeSpecificOpcodes getTypeSpecificOpcode() {
//         return opCode;
//     }
// }
// 
// Path: src/main/java/com/pidanic/saral/util/Type.java
// public interface Type {
//     String getName();
//     Class<?> getTypeClass();
//     String getDescriptor();
//     String getInternalName();
//     TypeSpecificOpcodes getTypeSpecificOpcode();
// }


import com.pidanic.saral.domain.expression.cast.CastExpression;
import com.pidanic.saral.util.BuiltInType;
import com.pidanic.saral.util.Type;
package com.pidanic.saral.domain.expression;


public abstract class BinaryExpression extends Expression {
    private Expression left;
    private Expression right;
    private Sign sign;

// Path: src/main/java/com/pidanic/saral/domain/expression/cast/CastExpression.java
// public class CastExpression extends UnaryExpression {
//     public CastExpression(Type castingType, Expression expression) {
//         super(castingType, getSign(castingType, expression.type()), expression);
//     }
//     @Override
//     public void accept(ExpressionGenerator generator) {
//         generator.generate(this);
//     }
// 
//     private static CastingSign getSign(Type castingType, Type expressionType) {
//         if(castingType == BuiltInType.DOUBLE) {
//             return CastingSign.LONG_TO_DOUBLE;
//         }
//         if(castingType == BuiltInType.INT) {
//             return CastingSign.LONG_TO_INT;
//         }
//         return CastingSign.LONG_TO_DOUBLE;
//     }
// }
// 
// Path: src/main/java/com/pidanic/saral/util/BuiltInType.java
// public enum BuiltInType implements Type {
//     BOOLEAN("logický", boolean.class, "Z", TypeSpecificOpcodes.INT),
//     INT ("neskutočné numeralio int", int.class, "I", TypeSpecificOpcodes.INT),
//     CHAR ("písmeno", char.class, "C", TypeSpecificOpcodes.INT),
//     //BYTE ("neskutočné numeralio", byte.class, "B", TypeSpecificOpcodes.INT),
//     //SHORT ("neskutočné numeralio", short.class, "S", TypeSpecificOpcodes.INT),
//     LONG ("neskutočné numeralio", long.class, "J", TypeSpecificOpcodes.LONG),
//     //FLOAT ("skutočné numeralio", float.class, "F", TypeSpecificOpcodes.FLOAT),
//     DOUBLE ("skutočné numeralio", double.class, "D", TypeSpecificOpcodes.DOUBLE),
//     STRING ("slovo", String.class, "Ljava/lang/String;", TypeSpecificOpcodes.OBJECT),
//     BOOLEAN_ARR("funduš logický", boolean[].class, "[B", TypeSpecificOpcodes.BOOLEAN_ARRAY),
//     //INT_ARR ("int[]", int[].class, "[I"),
//     CHAR_ARR ("funduš písmeno", char[].class, "[C", TypeSpecificOpcodes.CHAR_ARRAY),
//     //BYTE_ARR ("byte[]", byte[].class, "[B"),
//     //SHORT_ARR ("short[]", short[].class, "[S"),
//     LONG_ARR ("funduš neskutočné numeralio", long[].class, "[J", TypeSpecificOpcodes.LONG_ARRAY),
//     //FLOAT_ARR ("float[]", float[].class, "[F"),
//     DOUBLE_ARR ("funduš skutočné numeralio", double[].class, "[D", TypeSpecificOpcodes.DOUBLE_ARRAY),
//     STRING_ARR ("funduš slovo", String[].class, "[Ljava/lang/String;", TypeSpecificOpcodes.OBJECT_ARRAY),
//     //NONE("", null,""),
//     VOID("void", void.class, "V", TypeSpecificOpcodes.VOID);
// 
//     private String name;
//     private Class<?> typeClass;
//     private String descriptor;
//     private TypeSpecificOpcodes opCode;
// 
//     BuiltInType(String name, Class<?> typeClass, String descriptor, TypeSpecificOpcodes op) {
//         this.name = name;
//         this.typeClass = typeClass;
//         this.descriptor = descriptor;
//         this.opCode = op;
//     }
// 
//     @Override
//     public String getName() {
//         return name;
//     }
// 
//     @Override
//     public Class<?> getTypeClass() {
//         return typeClass;
//     }
// 
//     @Override
//     public String getDescriptor() {
//         return descriptor;
//     }
// 
//     @Override
//     public String getInternalName() {
//         return getDescriptor();
//     }
// 
//     @Override
//     public TypeSpecificOpcodes getTypeSpecificOpcode() {
//         return opCode;
//     }
// }
// 
// Path: src/main/java/com/pidanic/saral/util/Type.java
// public interface Type {
//     String getName();
//     Class<?> getTypeClass();
//     String getDescriptor();
//     String getInternalName();
//     TypeSpecificOpcodes getTypeSpecificOpcode();
// }


// Path: src/main/java/com/pidanic/saral/domain/expression/BinaryExpression.java
import com.pidanic.saral.domain.expression.cast.CastExpression;
import com.pidanic.saral.util.BuiltInType;
import com.pidanic.saral.util.Type;

package com.pidanic.saral.domain.expression;


public abstract class BinaryExpression extends Expression {
    private Expression left;
    private Expression right;
    private Sign sign;

    public BinaryExpression(Type type, Sign sign, Expression left, Expression right) {