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); } }
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); } }
/// <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="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); }
/// <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); }
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); } }
/// <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 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); } }
/// <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); } }