private CalculatableNode mergeNode(final Operator criteria, CalculatableNode left) throws IOException {
		while (true) {
			// この関数は「演算子、数字(ノード)」の次に呼ばれるので、演算子であることが期待される
			// 例：1+2+3において、「(BEGIN),1」の後に呼ばれる
			// 例：*の後に+が呼ばれた場合、+以降は操作する必要がないので、そのまま返す
			// 例：(BEGIN)の後に(END)が呼ばれた場合、それ以降はトークンを持たないので、そのまま返す
			Operator currentOperator = nextOperator();
			if (criteria.priorThan(currentOperator)) {
				return left;
			}
			
			CalculatableNode currentNode = nextNode();
			
			// 来るべき演算子を先読みして、どちらを優先するかを決定する
			// 次の演算子の方が優先されるならば、マージして返却してもらう
			Operator rightOperator = nextOperator();
			tokenizer.pushBack();
			if (rightOperator.priorThan(currentOperator)) {
				currentNode = mergeNode(currentOperator, currentNode);
			}
			
			left = new OperationalNode(currentOperator, left, currentNode);
		}
	}