 				throw CompileError.unexpectedCommand
 			}
 		}
+		
+		guard let type = BinaryOpNode.opTypes[op] else {
+			throw CompileError.unexpectedBinaryOperator
+		}
+		
+		self.opInstructionType = type
 
 		self.lhs = lhs
 		self.rhs = rhs

	public func compile(with ctx: BytecodeCompiler, in parent: ASTNode?) throws -> BytecodeBody {

		var bytecode = BytecodeBody()

		var opTypes: [String : BytecodeInstructionType]

		opTypes = ["+": .add,
		           "-": .sub,
		           "*": .mul,
		           "/": .div,
		           "^": .pow,
		           "==": .eq,
		           "!=": .neq,
		           ">": .cmplt,
		           "<": .cmplt,
		           ">=": .cmple,
		           "<=": .cmple,
		           "&&": .and,
		           "||": .or,
		           "!": .not]

		guard let type = opTypes[op] else {
			throw CompileError.unexpectedBinaryOperator
		}

		if op == ">" || op == ">=" {


		let label = ctx.nextIndexLabel()

		// FIXME: comment "op" is wrong for ">" and ">="
		let operation = BytecodeInstruction(label: label, type: opInstructionType, comment: op)

		bytecode.append(operation)

		return bytecode

	}
	
	public var childNodes: [ASTNode] {
		if let rhs = rhs {
			return [lhs, rhs]
