// マクロをメソッド化
        private Node ADDUNKNWON(CharInfo cinfo, byte[] tSentence, int begin1, int begin2, int begin3, ref Node rResultNode)
        {
            Token tToken = m_UNKTokens[cinfo.DefaultType].Key;
            int   tSize  = m_UNKTokens[cinfo.DefaultType].Value;

            for (int k = 0; k < tSize; ++k)
            {
                Node tNewNode = new Node();

                ReadNodeInfo(m_UNKDictionary, m_UNKDictionary.GetRelativeToken(tToken, k), ref tNewNode);

                tNewNode.char_type = ( byte )cinfo.DefaultType;
                tNewNode.surface_s = tSentence;
                tNewNode.surface_o = begin2;
                tNewNode.length    = ( ushort )(begin3 - begin2);
                tNewNode.rlength   = ( ushort )(begin3 - begin1);
                tNewNode.stat      = MECAB_UNK_NODE;
                tNewNode.bnext     = rResultNode;

                rResultNode = tNewNode;
            }

            return(rResultNode);
        }
        // オフセット操作
        public Node Lookup(byte[] tSentence, int tBegin, int tEnd)
        {
            CharInfo cinfo       = new CharInfo();
            Node     result_node = null;
            int      mblen       = 0;
            int      clen        = 0;

            // 最大 65536 バイトに制限する
            tEnd = (tEnd - tBegin) >= 65535 ? tBegin + 65535 : tEnd;

            // オフセット操作
            int begin2 = m_CharProperty.SeekToOtherType(tSentence, tBegin, tEnd, m_Space, ref cinfo, ref mblen, ref clen);

            DoubleArray.Word[] daresults = new DoubleArray.Word[kResultsSize];
            for (int i = 0; i < daresults.Length; i++)
            {
                daresults[i] = new DoubleArray.Word();
            }

            int results_size = kResultsSize;

            for (int it_p = 0; it_p < m_Dictionaries.Count; ++it_p)
            {
                WordDictionary it = m_Dictionaries[it_p];

                int n = it.CommonPrefixSearch(tSentence, begin2, tEnd - begin2, daresults, results_size);

                for (int i = 0; i < n; ++i)
                {
                    Token tToken = it.GetToken(daresults[i]);
                    int   tSize  = it.GetSize(daresults[i]);

                    for (int j = 0; j < tSize; ++j)
                    {
                        Node tNewNode = new Node();

                        ReadNodeInfo(it, it.GetRelativeToken(tToken, j), ref tNewNode);

                        tNewNode.length  = ( ushort )daresults[i].length;
                        tNewNode.rlength = ( ushort )(begin2 - tBegin + tNewNode.length);

                        // オフセット操作
                        tNewNode.surface_s = tSentence;
                        tNewNode.surface_o = begin2;


                        tNewNode.stat      = MECAB_NOR_NODE;
                        tNewNode.char_type = ( byte )cinfo.DefaultType;

                        tNewNode.bnext = result_node;
                        result_node    = tNewNode;
                    }
                }
            }

            if (result_node != null && cinfo.Invoke == 0)
            {
                return(result_node);
            }

            // オフセット操作
            int begin3 = begin2 + mblen;

            // オフセット操作
            int group_begin3 = 0;

            if (begin3 > tEnd)
            {
                //--------------------------------------------------------
                // ADDUNKNWON ;
                ADDUNKNWON(cinfo, tSentence, tBegin, begin2, begin3, ref result_node);

                //--------------------------------------------------------

                if (result_node != null)
                {
                    return(result_node);
                }
            }

            if (cinfo.Group != 0)
            {
                int tmp = begin3;

                CharInfo fail = new CharInfo();
                begin3 = m_CharProperty.SeekToOtherType(tSentence, begin3, tEnd, cinfo, ref fail, ref mblen, ref clen);
                if (clen <= DEFAULT_MAX_GROUPING_SIZE)
                {
//						ADDUNKNWON ;
                    ADDUNKNWON(cinfo, tSentence, tBegin, begin2, begin3, ref result_node);
                }
                group_begin3 = begin3;
                begin3       = tmp;
            }

            for (int i = 1; i <= cinfo.Length; ++i)
            {
                if (begin3 > tEnd)
                {
                    break;
                }

                if (begin3 == group_begin3)
                {
                    continue;
                }

                clen = i;

//					ADDUNKNWON ;
                ADDUNKNWON(cinfo, tSentence, tBegin, begin2, begin3, ref result_node);

                if (cinfo.isKindOf(m_CharProperty.GetCharInfo(tSentence, begin3, tEnd, ref mblen)) == false)
                {
                    break;
                }

                begin3 += mblen;
            }

            if (result_node == null)
            {
//					ADDUNKNWON ;
                ADDUNKNWON(cinfo, tSentence, tBegin, begin2, begin3, ref result_node);
            }

            return(result_node);
        }