private PrimitiveToken ReadPrimitive(BinaryReader reader, AxData data)
        {
            PrimitiveToken ret = null;

            int theTokenOffset = tokenOffset;
            int type           = reader.ReadByte();
            int flag           = reader.ReadByte();
            int value          = 0;
            int extraValue     = -1;

            tokenOffset += 1;
            if ((flag & 0x80) == 0x80)
            {
                value        = reader.ReadInt32();
                tokenOffset += 2;
            }
            else
            {
                value        = reader.ReadUInt16();
                tokenOffset += 1;
            }

            HspDictionaryKey key = new HspDictionaryKey();

            key.Type  = type;
            key.Value = value;
            HspDictionaryValue dicValue;

            if (dictionary.CodeLookUp(key, out dicValue))
            {
                if ((dicValue.Extra & HspCodeExtraFlags.HasExtraInt16) == HspCodeExtraFlags.HasExtraInt16)
                {
                    //HSP3.0aの仕様では行頭にないif,elseはジャンプ先アドレスを持たない。
                    if ((flag & 0x20) == 0x20)
                    {
                        extraValue   = reader.ReadUInt16();
                        tokenOffset += 1;
                        ret          = createPrimitive(data, dicValue, theTokenOffset, type, flag, value, extraValue);
                    }
                    else
                    {
                        ret = createPrimitive(data, dicValue, theTokenOffset, type, flag, value, -1);
                    }
                }
                else
                {
                    ret = createPrimitive(data, dicValue, theTokenOffset, type, flag, value, -1);
                }
            }
            else
            {
                ret = createPrimitive(data, new HspDictionaryValue(), theTokenOffset, type, flag, value, -1);
            }
            ret.SetName();

            return(ret);
        }
        internal TokenCollection Analyze(AxData data)
        {
            if (!data.IsStarted)
            {
                throw new InvalidOperationException();
            }
            TokenCollection stream      = new TokenCollection();
            BinaryReader    reader      = data.Reader;
            long            sizeOfCode  = data.Header.CodeSize;
            long            startOfCode = data.StartOfCode;

            tokenOffset = 0;
            reader.BaseStream.Seek(startOfCode, SeekOrigin.Begin);
            while (tokenOffset < sizeOfCode)
            {
                PrimitiveToken code = ReadPrimitive(reader, data);
                if (code != null)
                {
                    stream.Add(code);
                }
            }
#if DEBUG
            List <int> variablesCount = null;
            variablesCount = subAnalyzeVariables(stream);
            for (int i = 0; i < variablesCount.Count; i++)
            {
                if (variablesCount[i] == 1)
                {
                    string errMsg = GlobalVariablePrimitive.ToString(i);
                    errMsg += ":この変数は一度しか使われていません";
                    global::KttK.HspDecompiler.HspConsole.Warning(errMsg);
                }
                if (variablesCount[i] == 0)
                {
                    string errMsg = GlobalVariablePrimitive.ToString(i);
                    errMsg += ":この変数は使われていません";
                    global::KttK.HspDecompiler.HspConsole.Warning(errMsg);
                }
            }
#endif

            return(stream);
        }