/// <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); } }
/// <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); }
/// <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")); } }
public static bool MatchKoma(string line, ref int caret, out Piece out_km) { return(Itiran_FenParser.MatchKoma(line, ref caret, out out_km)); }
/// <summary> /// 改造FEN符号表記 /// </summary> /// <returns></returns> public static void AppendFenTo(FenSyurui f, Move ss, StringBuilder syuturyoku) { if (Move.Toryo == ss) { syuturyoku.Append(Itiran_FenParser.GetToryo(f)); return; } int v = (int)ss;//バリュー(ビットフィールド) // 打った駒の種類(取り出すのは難しいので関数を使う☆) MotigomaSyurui mksUtta = AbstractConvMove.GetUttaKomasyurui(ss); if (MotigomaSyurui.Yososu != mksUtta)//指定があれば { // 打でした。 // (自)筋・(自)段は書かずに、「P*」といった表記で埋めます。 SpkMotiKomasyurui.AppendFenTo(f, mksUtta, syuturyoku); syuturyoku.Append("*"); } else { //------------------------------------------------------------ // (自)筋 //------------------------------------------------------------ //Option_Application.Optionlist.USI switch (f) { case FenSyurui.sfe_n: { syuturyoku.Append(PureSettei.banYokoHaba + 1 - AbstractConvMove.GetSrcSuji_WithoutErrorCheck(v)); } break; case FenSyurui.dfe_n: { syuturyoku.Append(Conv_Kihon.ToAlphabetLarge(AbstractConvMove.GetSrcSuji_WithoutErrorCheck(v))); } break; default: throw new Exception(string.Format("未定義 {0}", f)); } //------------------------------------------------------------ // (自)段 //------------------------------------------------------------ //Option_Application.Optionlist.USI switch (f) { case FenSyurui.sfe_n: { syuturyoku.Append(Conv_Kihon.ToAlphabetSmall(AbstractConvMove.GetSrcDan_WithoutErrorCheck(v))); } break; case FenSyurui.dfe_n: { syuturyoku.Append(AbstractConvMove.GetSrcDan_WithoutErrorCheck(v).ToString()); } break; default: throw new Exception(string.Format("未定義 {0}", f)); } } //------------------------------------------------------------ // (至)筋 //------------------------------------------------------------ //Option_Application.Optionlist.USI switch (f) { case FenSyurui.sfe_n: { syuturyoku.Append(PureSettei.banYokoHaba + 1 - AbstractConvMove.GetDstSuji_WithoutErrorCheck(v)); } break; case FenSyurui.dfe_n: { syuturyoku.Append(Conv_Kihon.ToAlphabetLarge(AbstractConvMove.GetDstSuji_WithoutErrorCheck(v))); } break; default: throw new Exception(string.Format("未定義 {0}", f)); } //------------------------------------------------------------ // (至)段 //------------------------------------------------------------ //Option_Application.Optionlist.USI switch (f) { case FenSyurui.sfe_n: { syuturyoku.Append(Conv_Kihon.ToAlphabetSmall(AbstractConvMove.GetDstDan_WithoutErrorCheck(v))); } break; case FenSyurui.dfe_n: { syuturyoku.Append(AbstractConvMove.GetDstDan_WithoutErrorCheck(v).ToString()); } break; default: throw new Exception(string.Format("未定義 {0}", f)); } //------------------------------------------------------------ // 成 //------------------------------------------------------------ int natta; { // (v & m) >> s + 1。 v:バリュー、m:マスク、s:シフト natta = (v & (int)MoveMask.NATTA) >> (int)MoveShift.NATTA; } if (1 == natta) { syuturyoku.Append("+"); } }
/// <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); } }
public static bool MatchKomasyurui(string line, ref int caret, out Komasyurui out_ks) { return(Itiran_FenParser.MatchKomasyurui(line, ref caret, out out_ks)); }