/// <summary>
        /// 読み書き可能な変数を登録し新たな領域を予約します
        /// </summary>
        public ElementBase[] RegisterReadwriteVariableAsNew(Variable varbl)
        {
            if (varbl.InitialValues.Length == 1)
            { //単一宣言
                ReadwriteElement target = new ReadwriteElement();
                target.Index = Readwrites.Count;
                Readwrites.Add(target);

                target.InitialValue = varbl.InitialValues[0];
                target.GroupedVariables.Add(varbl);
                varbl.AnalyzeResults = new ElementBase[1] {
                    target
                };
                return(varbl.AnalyzeResults);
            }
            else
            { //配列宣言
                ElementBase[] res = new ElementBase[varbl.InitialValues.Length];
                for (int contentIdx = 0; contentIdx < varbl.InitialValues.Length; contentIdx++)
                {
                    ReadwriteElement target = new ReadwriteElement();
                    target.Index = Readwrites.Count;
                    Readwrites.Add(target);

                    target.InitialValue = varbl.InitialValues[contentIdx];
                    target.GroupedVariables.Add(varbl);
                    res[contentIdx] = target;
                }

                varbl.AnalyzeResults = res;
                return(varbl.AnalyzeResults);
            }
        }
        /// <summary>
        /// 配置位置(PositionHint)が指定された変数のための領域を確保します
        /// </summary>
        public ElementBase[] RegisterReadwriteVariablePositionSpecified(Variable varbl)
        {
            if (varbl.InitialValues.Length == 1)
            { //単一宣言
                ReadwriteElement target = new ReadwriteElement();
                target.Index        = 0;
                target.InitialValue = varbl.InitialValues[0];
                target.GroupedVariables.Add(varbl);
                ReadwriteElement[] res = new ReadwriteElement[1] {
                    target
                };

                varbl.AnalyzeResults = res;
                if (varbl.PositionHint < 0)
                {
                    ReadwritePositionSpecifiedHead.Add(res);
                }
                else
                {
                    ReadwritePositionSpecifiedTail.Add(res);
                }
                return(res);
            }
            else
            { //配列宣言
                ReadwriteElement[] res = new ReadwriteElement[varbl.InitialValues.Length];
                for (int contentIdx = 0; contentIdx < varbl.InitialValues.Length; contentIdx++)
                {
                    ReadwriteElement target = new ReadwriteElement();
                    target.Index = contentIdx;

                    target.InitialValue = varbl.InitialValues[contentIdx];
                    target.GroupedVariables.Add(varbl);
                    res[contentIdx] = target;
                }

                varbl.AnalyzeResults = res;
                if (varbl.PositionHint < 0)
                {
                    ReadwritePositionSpecifiedHead.Add(res);
                }
                else
                {
                    ReadwritePositionSpecifiedTail.Add(res);
                }
                return(res);
            }
        }
        /// <summary>
        /// 読み書き可能で初期値を持たない変数のための領域を確保します
        /// </summary>
        /// <returns>確保された領域の先頭インデックス</returns>
        public int RegisterReadwriteEmptyRange(int count)
        {
            int res = Readwrites.Count;

            for (int i = 0; i < count; i++)
            {
                ReadwriteElement target = new ReadwriteElement();
                target.Index = Readwrites.Count;
                Readwrites.Add(target);

                target.InitialValue       = ValueBase.Zero;
                target.NeedInitialization = false;
            }

            return(res);
        }