コード例 #1
0
        public static bool MatchTaikyokusya(string line, ref int caret, out Taikyokusya out_tai
#if DEBUG
                                            , IDebugMojiretu hyoji
#endif
                                            )
        {
            Match m = GetTaikyokusyaPattern(PureSettei.fenSyurui).Match(line, caret);

            if (m.Success)
            {
                string tai_moji = m.Groups[1].Value;

                if (!Med_Parser.Try_MojiToTaikyokusya(PureSettei.fenSyurui, tai_moji, out out_tai))
                {
                    // パースエラーの場合(エラーにはしない)
                    return(false);
                }

                // キャレットを進めます
                Util_String.SkipMatch(line, ref caret, m);
                return(true);
            }
            else
            {
                out_tai = Taikyokusya.Yososu;
                return(false);
            }
        }
コード例 #2
0
        public static bool MatchSrcMs(string line, ref int caret, out Masu out_ms
#if DEBUG
                                      , IDebugMojiretu hyoji
#endif
                                      )
        {
            Match m = GetSrcMsPattern(PureSettei.fenSyurui).Match(line, caret);

            if (m.Success)
            {
                // キャレットを進めます
                Util_String.SkipMatch(line, ref caret, m);
                string ms_moji = m.Groups[1].Value;

                int caret2 = 0;
                return(LisMasu.MatchMasu(ms_moji, ref caret2, out out_ms
#if DEBUG
                                         , hyoji
#endif
                                         ));
            }
            else
            {
                out_ms = Conv_Masu.masu_error;
                return(false);
            }
        }
コード例 #3
0
        /// <summary>
        /// 2017-04-19 作成
        ///
        /// パースに失敗してもエラーではない。
        /// </summary>
        /// <param name="line"></param>
        /// <param name="caret"></param>
        /// <param name="out_ms"></param>
        /// <returns></returns>
        public static bool MatchMasu
            (string line, ref int caret, out Masu out_ms
#if DEBUG
            , IDebugMojiretu dbg_reigai
#endif
            )
        {
            Match m = Itiran_FenParser.GetMasuPattern(PureSettei.fenSyurui).Match(line, caret);

            if (m.Success)
            {
                // キャレットを進める
                Util_String.SkipMatch(line, ref caret, m);

                int suji = LisInt.FenSuji_Int(PureSettei.fenSyurui, m.Groups[1].Value);
                int dan  = LisInt.FenDan_Int(PureSettei.fenSyurui, m.Groups[2].Value);

                // 升を返す
                out_ms = Conv_Masu.ToMasu(suji, dan);

                return(true);
            }
            else
            {
                // 該当なし(エラーではない)
                out_ms = Conv_Masu.masu_error;
                return(false);
            }
        }
コード例 #4
0
        /// <summary>
        /// 評価値以外にも、数字のパーサーとしてよく使うぜ☆(^~^)
        /// </summary>
        /// <param name="out_restLine"></param>
        /// <param name="commandline"></param>
        /// <param name="out_hyokati"></param>
        /// <returns></returns>
        public static bool TryParse(string commandline, ref int caret, out int out_hyokati
#if DEBUG
                                    , IDebugMojiretu reigai1
#endif
                                    )
        {
            Match m = Itiran_FenParser.HyokatiPattern.Match(commandline, caret);

            if (m.Success)
            {
                //if(""== m.Groups[1].Value)
                //{
                //    //*
                //    // FIXME:
                //    string msg = $"パースに失敗だぜ☆(^~^)!  commandline=[{ commandline }]caret({ caret }) .Value=[{ m.Groups[1].Value }] m.Index=[{ m.Index }] m.Length=[{ m.Length }]";
                //    Util_Machine.AppendLine(msg);
                //    Util_Machine.Flush();
                //    throw new Exception(msg);
                //    // */
                //}

                // キャレットを進めるぜ☆(^▽^)
                Util_String.SkipMatch(commandline, ref caret, m);

                // moji1 = m.Groups[1].Value;
                if (int.TryParse(m.Groups[1].Value, out out_hyokati))
                {
                    return(true);
                }
                else
                {
                    //*
                    // FIXME:
#if DEBUG
                    reigai1.AppendLine($"パースに失敗だぜ☆(^~^)! #鱒 commandline=[{ commandline }]caret({ caret }) .Value=[{ m.Groups[1].Value }]");
#endif
                    return(false);
                    // */
                }
            }

            /*
             * {
             *  // FIXME:
             *  string msg = $"パースに失敗だぜ☆(^~^)!  commandline=[{ commandline }]caret({ caret })";
             *  Util_Machine.AppendLine(msg);
             *  Util_Machine.Flush();
             *  throw new Exception(msg);
             * }
             * // */
            out_hyokati = 0;
            return(false);
        }
コード例 #5
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="line">B4B3、または toryo といった文字列を含む行☆</param>
        /// <param name="caret">文字カーソルの位置</param>
        /// <param name="ky">取られた駒を調べるために使う☆</param>
        /// <param name="out_move"></param>
        /// <returns></returns>
        public static bool MatchFenMove(
            FenSyurui f,
            string line,
            ref int caret,
            out Move out_move
            )
        {
            if (Util_String.MatchAndNext(Itiran_FenParser.GetToryo(f), line, ref caret))
            {
                out_move = Move.Toryo;
                return(true);
            }

            // 「toryo」でも「none」でもなければ、「B4B3」形式と想定して、1手だけ読込み
            // テキスト形式の符号「A4A3 C1C2 …」の最初の1要素を、切り取ってトークンに分解します。

            Match m = Itiran_FenParser.GetMovePattern(f).Match(line, caret);

            if (!m.Success)
            {
                //// 「B4B3」形式ではなかった☆(^△^)!? 次の一手が読めない☆
                //string msg = $"指し手のパースに失敗だぜ☆(^~^)! commandline=[{ commandline }] caret=[{ caret }] m.Groups.Count=[{ m.Groups.Count }]";
                //Util_Machine.AppendLine(msg);
                //Util_Machine.Flush();
                //throw new Exception(msg);

                out_move = Move.Toryo;
                return(false);
            }

            // m.Groups[1].Value : ABCabc か、 ZKH
            // m.Groups[2].Value : 1234   か、 *
            // m.Groups[3].Value : ABCabc
            // m.Groups[4].Value : 1234
            // m.Groups[5].Value : +

            // カーソルを進めるぜ☆(^~^)
            Util_String.SkipMatch(line, ref caret, m);

            // 符号1「B4B3」を元に、move を作ります。
            out_move = TryFenMove2(
                f,
                m.Groups[1].Value,
                m.Groups[2].Value,
                m.Groups[3].Value,
                m.Groups[4].Value,
                m.Groups[5].Value
                );
            Debug.Assert((int)out_move != -1, "");

            return(true);
        }
コード例 #6
0
        public static bool MatchKoma(string line, ref int caret, out Piece out_km)
        {
            Match m = GetKomaPattern(PureSettei.fenSyurui).Match(line, caret);

            if (m.Success)
            {
                // キャレットを進めます
                Util_String.SkipMatch(line, ref caret, m);

                // 駒種類(FIXME: 後手の表記だと誤動作になるか?)
                string ks_moji = m.Groups[1].Value;
                return(LisKoma.Try_ParseFen(PureSettei.fenSyurui, ks_moji, out out_km));
            }
            else
            {
                out_km = Piece.Yososu;
                return(false);
            }
        }
コード例 #7
0
        /// <summary>
        /// 持駒の枚数等
        /// </summary>
        /// <param name="isSfen"></param>
        /// <param name="suji"></param>
        /// <returns></returns>
        public static bool MatchInt(string line, ref int caret, out int out_int)
        {
            Match m = Itiran_FenParser.GetIntPattern().Match(line, caret);

            if (m.Success)
            {
                Util_String.SkipMatch(line, ref caret, m);

                if (!int.TryParse(m.Groups[1].Value, out out_int))
                {
                    return(Pure.FailTrue(string.Format("パース失敗 m.Groups[1].Value=[{0}]", m.Groups[1].Value)));
                }
                return(Pure.SUCCESSFUL_FALSE);
            }
            else
            {
                out_int = 0;
                return(Pure.FailTrue("MatchInt not success1"));
            }
        }
コード例 #8
0
        public static bool MatchKomasyurui(string line, ref int caret, out Komasyurui out_ks)
        {
            Match m = GetKomaPattern(PureSettei.fenSyurui).Match(line, caret);

            if (m.Success)
            {
                // キャレットを進めます
                Util_String.SkipMatch(line, ref caret, m);

                // 駒種類(FIXME: 後手の表記だと誤動作になるか?)
                string ks_moji = m.Groups[1].Value;
                out_ks = Med_Parser.MojiToKomasyurui(PureSettei.fenSyurui, ks_moji);
                return(true);
            }
            else
            {
                out_ks = Komasyurui.Yososu;
                return(false);
            }
        }
コード例 #9
0
        /// <summary>
        /// 例: fen kr1/1h1/1H1/1R1 K2z 1
        /// 例: startpos
        ///
        /// moves 以降は解析しないが、あれば文字列は返すぜ☆(^~^)
        /// </summary>
        /// <param name="line">頭に「fen 」を付けておかないと、パースに失敗する☆</param>
        /// <returns>解析の成否</returns>
        public static bool TryFail_MatchPositionvalue(
            FenSyurui f,//翻訳で切替
            string line,
            ref int caret, out string out_moves
#if DEBUG
            , IDebugMojiretu reigai1
#endif
            )
        {
            out_moves = "";

            Match m = Itiran_FenParser.GetKyokumenPattern(f).Match(line, caret);

            if (m.Success)
            {
                // キャレットを進めるぜ☆(^▽^)
                Util_String.SkipMatch(line, ref caret, m);

                // .Value は、該当しないときは空文字列か☆
                if (Itiran_FenParser.STARTPOS_LABEL == m.Groups[1].Value)
                {
                    // 初期局面をセットだぜ☆(^~^)
                    if (TryFail_SetSyokiKyokumen_ByFen(
                            f,
                            Itiran_FenParser.GetStartpos(f).Split('/'), //1~N 段目
                            Itiran_FenParser.MOTIGOMA_NASI,             // 持ち駒
                            Itiran_FenParser.TAIKYOKUSYA1
#if DEBUG
                            , reigai1 //手番
#endif
                            ))
                    {
                        return(Pure.FailTrue("Try_SetNaiyo(1)"));
                    }
                }
                else
                {
                    // 初期局面をセットだぜ☆(^~^)
                    if (TryFail_SetSyokiKyokumen_ByFen(
                            f,
                            m.Groups[2].Value.Split('/'), //1~N 段目
                            m.Groups[3].Value,            // 持ち駒
                            m.Groups[4].Value
#if DEBUG
                            , reigai1 //手番
#endif
                            ))
                    {
                        return(Pure.FailTrue("Try_SetNaiyo(2)"));
                    }
                }

                // TODO: moves
                if ("" != m.Groups[5].Value)
                {
                    out_moves = m.Groups[5].Value;
                }


                // 初期局面
                {
                    tmp_syokikyokumenFen.Clear();
                    SpkGenkyokuOpe.AppendFenTo(f, tmp_syokikyokumenFen);
                    PureMemory.kifu_syokiKyokumenFen = tmp_syokikyokumenFen.ToString();
                }
                return(Pure.SUCCESSFUL_FALSE);
            }

            {
                // FIXME:
#if DEBUG
                reigai1.AppendLine($"パースに失敗だぜ☆(^~^)! #麒麟 commandline=[{ line }] caret=[{ caret }]");
#endif
                return(false);
            }
        }