public static void Kiki(bool isSfen, string commandline, Kyokumen ky, out Masu out_ms, out Bitboard out_kikiBB) { //KomanoUgokikata komanoUgokikata, // うしろに続く文字は☆(^▽^) int caret = 0; Util_String.TobasuTangoToMatubiKuhaku(commandline, ref caret, "kiki "); string line = commandline.Substring(caret).TrimEnd(); if (line.Length == 2)// kiki b3 { out_kikiBB = null; // 升を返すぜ☆ if (!Med_Parser.TryParseMs(isSfen, commandline, ky, ref caret, out out_ms)) { throw new Exception("パースエラー102"); } } else// kiki b3 R 1 { out_ms = ky.MASU_ERROR; // 盤面表示を返すぜ☆ string moji1 = ""; string moji2 = ""; string moji3 = ""; string moji4 = ""; Match m = Itiran_FenParser.GetKikiCommandPattern(Option_Application.Optionlist.USI).Match(commandline, caret); if (m.Success) { Util_String.SkipMatch(commandline, ref caret, m); moji1 = m.Groups[1].Value; moji2 = m.Groups[2].Value; moji3 = m.Groups[3].Value; moji4 = m.Groups[4].Value; if (!Med_Parser.TryTaikyokusya(Option_Application.Optionlist.USI, moji4, out Option <Phase> phase)) { throw new Exception($"対局者のパースエラー moji4=[{ moji4 }]"); } out_kikiBB = Util_Application.Kiki_BB(Med_Koma.KomasyuruiAndTaikyokusyaToKoma(Med_Parser.Moji_Komasyurui(Option_Application.Optionlist.USI, moji3), phase), Med_Parser.FenSujiDan_Masu(Option_Application.Optionlist.USI, moji1, moji2), ky.Shogiban);// komanoUgokikata } else { out_kikiBB = null; } } }
/// <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, StringBuilder syuturyoku) { 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); // Logger.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: string msg = $"パースに失敗だぜ☆(^~^)! #鱒 commandline=[{commandline}]caret({caret}) .Value=[{m.Groups[1].Value}]"; syuturyoku.AppendLine(msg); Logger.Flush(syuturyoku.ToString()); syuturyoku.Clear(); throw new Exception(msg); // */ } } /* * { * // FIXME: * string msg = $"パースに失敗だぜ☆(^~^)! commandline=[{commandline}]caret({caret})"; * Util_Machine.AppendLine(msg); * Logger.Flush(); * throw new Exception(msg); * } * // */ out_hyokati = 0; return(false); }
/// <summary> /// 2017-04-19 作成 /// </summary> /// <param name="commandline"></param> /// <param name="caret"></param> /// <param name="out_ms"></param> /// <returns></returns> public static bool TryParseMs(bool isSfen, string commandline, Kyokumen ky, ref int caret, out Masu out_ms) { Match m = Itiran_FenParser.GetMasuPattern(isSfen).Match(commandline, caret); if (m.Success) { Util_String.SkipMatch(commandline, ref caret, m); int suji = FenSuji_Int(isSfen, m.Groups[1].Value); int dan = FenDan_Int(isSfen, m.Groups[2].Value); out_ms = Conv_Masu.ToMasu(suji, dan); return(true); } else { out_ms = ky.MASU_ERROR; return(false); } }
/// <summary> /// /// </summary> /// <param name="commandline">B4B3、または toryo といった文字列を含む行☆</param> /// <param name="caret">文字カーソルの位置</param> /// <param name="ky">取られた駒を調べるために使う☆</param> /// <param name="out_sasite"></param> /// <returns></returns> public static bool TryFenMove( bool isSfen, string commandline, ref int caret, Kyokumen.Sindanyo kys, out Move out_sasite ) { if ('n' == commandline[caret]) { if (caret == commandline.IndexOf("none", caret))//定跡ファイルの応手が無いときに利用☆ { Util_String.TobasuTangoToMatubiKuhaku(commandline, ref caret, "none"); out_sasite = Move.Toryo; return(true); } } else //if ('t' == commandline[caret]) //{ if (caret == commandline.IndexOf(Itiran_FenParser.GetToryo(isSfen), caret)) { Util_String.TobasuTangoToMatubiKuhaku(commandline, ref caret, Itiran_FenParser.GetToryo(isSfen)); out_sasite = Move.Toryo; return(true); } //} // 「toryo」でも「none」でもなければ、「B4B3」形式と想定して、1手だけ読込み // テキスト形式の符号「A4A3 C1C2 …」の最初の1要素を、切り取ってトークンに分解します。 Match m = Itiran_FenParser.GetMovePattern(isSfen).Match(commandline, caret); if (!m.Success) { //// 「B4B3」形式ではなかった☆(^△^)!? 次の一手が読めない☆ //string msg = $"指し手のパースに失敗だぜ☆(^~^)! commandline=[{ commandline }] caret=[{ caret }] m.Groups.Count=[{ m.Groups.Count }]"; //Util_Machine.AppendLine(msg); //Logger.Flush(); //throw new Exception(msg); out_sasite = 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(commandline, ref caret, m); // 符号1「B4B3」を元に、move を作ります。 out_sasite = TryFenMove2( isSfen, kys, m.Groups[1].Value, m.Groups[2].Value, m.Groups[3].Value, m.Groups[4].Value, m.Groups[5].Value ); Debug.Assert((int)out_sasite != -1, ""); return(true); }