lib/jkf/parser/kifuable.rb in jkf-0.4.3 vs lib/jkf/parser/kifuable.rb in jkf-0.5.0

- old
+ new

@@ -4,111 +4,107 @@ protected # initialboard : (" " nonls nl)? ("+" nonls nl)? ikkatsuline+ ("+" nonls nl)? def parse_initialboard s0 = s1 = @current_pos - if match_space != :failed + if match_space == :failed + @current_pos = s1 + else parse_nonls s2 = parse_nl @current_pos = s1 if s2 == :failed - else - @current_pos = s1 end s2 = @current_pos - if match_str("+") != :failed + if match_str("+") == :failed + @current_pos = s2 + else parse_nonls @current_pos = s2 if parse_nl == :failed - else - @current_pos = s2 end s4 = parse_ikkatsuline - if s4 != :failed + if s4 == :failed + s3 = :failed + else s3 = [] while s4 != :failed s3 << s4 s4 = parse_ikkatsuline end - else - s3 = :failed end - if s3 != :failed + if s3 == :failed + @current_pos = s0 + :failed + else s4 = @current_pos - if match_str("+") != :failed + if match_str("+") == :failed + @current_pos = s4 + else parse_nonls @current_pos = s4 if parse_nl == :failed - else - @current_pos = s4 end @reported_pos = s0 transform_initialboard(s3) - else - @current_pos = s0 - :failed end end # ikkatsuline : "|" masu:masu+ "|" nonls! nl def parse_ikkatsuline s0 = @current_pos - if match_str("|") != :failed + if match_str("|") == :failed + @current_pos = s0 + s0 = :failed + else s3 = parse_masu - if s3 != :failed + if s3 == :failed + s2 = :failed + else s2 = [] while s3 != :failed s2 << s3 s3 = parse_masu end - else - s2 = :failed end - if s2 != :failed - if match_str("|") != :failed - s4 = parse_nonls! - if s4 != :failed - if parse_nl != :failed - @reported_pos = s0 - s0 = s2 - else - @current_pos = s0 - s0 = :failed - end - else - @current_pos = s0 - s0 = :failed - end + if s2 == :failed + @current_pos = s0 + s0 = :failed + elsif match_str("|") != :failed + s4 = parse_nonls! + if s4 == :failed + @current_pos = s0 + s0 = :failed + elsif parse_nl != :failed + @reported_pos = s0 + s0 = s2 else @current_pos = s0 s0 = :failed end else @current_pos = s0 s0 = :failed end - else - @current_pos = s0 - s0 = :failed end s0 end # masu : teban piece | " ・" def parse_masu s0 = @current_pos s1 = parse_teban - if s1 != :failed + if s1 == :failed + @current_pos = s0 + s0 = :failed + else s2 = parse_piece - if s2 != :failed - @reported_pos = s0 - s0 = { "color" => s1, "kind" => s2 } - else + if s2 == :failed @current_pos = s0 s0 = :failed + else + @reported_pos = s0 + s0 = { "color" => s1, "kind" => s2 } end - else - @current_pos = s0 - s0 = :failed end if s0 == :failed s0 = @current_pos s1 = match_str(" ・") if s1 != :failed @@ -149,22 +145,22 @@ # pointer : "&" nonls nl def parse_pointer s0 = @current_pos s1 = match_str("&") - if s1 != :failed + if s1 == :failed + @current_pos = s0 + s0 = :failed + else s2 = parse_nonls s3 = parse_nl - if s3 != :failed - s0 = [s1, s2, s3] - else + if s3 == :failed @current_pos = s0 s0 = :failed + else + s0 = [s1, s2, s3] end - else - @current_pos = s0 - s0 = :failed end s0 end # num : [123456789] @@ -193,114 +189,111 @@ def parse_piece s0 = @current_pos s1 = match_str("成") s1 = "" if s1 == :failed s2 = match_regexp(/^[歩香桂銀金角飛王玉と杏圭全馬竜龍]/) - if s2 != :failed - @reported_pos = s0 - kind2csa(s1 + s2) - else + if s2 == :failed @current_pos = s0 :failed + else + @reported_pos = s0 + kind2csa(s1 + s2) end end # result : "まで" [0-9]+ "手" ( # "で" (turn "手の" (result_toryo | result_illegal)) | # result_timeup | result_chudan | result_jishogi | # result_sennichite | result_tsumi | result_fuzumi # ) nl def parse_result s0 = @current_pos - if match_str("まで") != :failed + if match_str("まで") == :failed + @current_pos = s0 + :failed + else s2 = match_digits! - if s2 != :failed - if match_str("手") != :failed - s4 = @current_pos - if match_str("で") != :failed - if parse_turn != :failed - if match_str("手の") != :failed - s8 = parse_result_toryo - s8 = parse_result_illegal if s8 == :failed - s4 = if s8 != :failed - @reported_pos = s4 - s8 - else - @current_pos = s4 - :failed - end - else - @current_pos = s4 - s4 = :failed - end - else - @current_pos = s4 - s4 = :failed - end - else + if s2 == :failed + @current_pos = s0 + :failed + elsif match_str("手") != :failed + s4 = @current_pos + if match_str("で") == :failed + @current_pos = s4 + s4 = :failed + elsif parse_turn != :failed + if match_str("手の") == :failed @current_pos = s4 s4 = :failed + else + s8 = parse_result_toryo + s8 = parse_result_illegal if s8 == :failed + s4 = if s8 == :failed + @current_pos = s4 + :failed + else + @reported_pos = s4 + s8 + end end + else + @current_pos = s4 + s4 = :failed + end + if s4 == :failed + s4 = parse_result_timeup if s4 == :failed - s4 = parse_result_timeup + s4 = parse_result_chudan if s4 == :failed - s4 = parse_result_chudan + s4 = parse_result_jishogi if s4 == :failed - s4 = parse_result_jishogi + s4 = parse_result_sennichite if s4 == :failed - s4 = parse_result_sennichite - if s4 == :failed - s4 = parse_result_tsumi - s4 = parse_result_fuzumi if s4 == :failed - end + s4 = parse_result_tsumi + s4 = parse_result_fuzumi if s4 == :failed end end end end - if s4 != :failed - if parse_nl != :failed || eos? - @reported_pos = s0 - s4 - else - @current_pos = s0 - :failed - end - else - @current_pos = s0 - :failed - end + end + if s4 == :failed + @current_pos = s0 + :failed + elsif parse_nl != :failed || eos? + @reported_pos = s0 + s4 else @current_pos = s0 :failed end else @current_pos = s0 :failed end - else - @current_pos = s0 - :failed end end # result_toryo : "勝ち" def parse_result_toryo s0 = @current_pos s1 = match_str("勝ち") - if s1 != :failed - @reported_pos = s0 - "TORYO" - else + if s1 == :failed @current_pos = s0 :failed + else + @reported_pos = s0 + "TORYO" end end # result_illegal : "反則" ("勝ち" | "負け") def parse_result_illegal s0 = @current_pos - if match_str("反則") != :failed + if match_str("反則") == :failed + @current_pos = s0 + :failed + else s10 = @current_pos s11 = match_str("勝ち") if s11 != :failed @reported_pos = s10 s11 = "ILLEGAL_ACTION" @@ -313,38 +306,33 @@ @reported_pos = s10 s11 = "ILLEGAL_MOVE" end s10 = s11 end - if s10 != :failed - @reported_pos = s0 - s10 - else + if s10 == :failed @current_pos = s0 :failed + else + @reported_pos = s0 + s10 end - else - @current_pos = s0 - :failed end end # result_timeup : "で時間切れにより" turn "手の勝ち" def parse_result_timeup s0 = @current_pos - if match_str("で時間切れにより") != :failed - if parse_turn != :failed - if match_str("手の勝ち") != :failed - @reported_pos = s0 - "TIME_UP" - else - @current_pos = s0 - :failed - end - else + if match_str("で時間切れにより") == :failed + @current_pos = s0 + :failed + elsif parse_turn != :failed + if match_str("手の勝ち") == :failed @current_pos = s0 :failed + else + @reported_pos = s0 + "TIME_UP" end else @current_pos = s0 :failed end @@ -352,88 +340,88 @@ # result_chudan : "で中断" def parse_result_chudan s0 = @current_pos s1 = match_str("で中断") - if s1 != :failed - @reported_pos = s0 - "CHUDAN" - else + if s1 == :failed @current_pos = s0 :failed + else + @reported_pos = s0 + "CHUDAN" end end # result_jishogi : "で持将棋" def parse_result_jishogi s0 = @current_pos s1 = match_str("で持将棋") - if s1 != :failed - @reported_pos = s0 - "JISHOGI" - else + if s1 == :failed @current_pos = s0 :failed + else + @reported_pos = s0 + "JISHOGI" end end # result_sennichite : "で千日手" def parse_result_sennichite s0 = @current_pos s1 = match_str("で千日手") - if s1 != :failed - @reported_pos = s0 - "SENNICHITE" - else + if s1 == :failed @current_pos = s0 :failed + else + @reported_pos = s0 + "SENNICHITE" end end # result_tsumi : "で"? "詰" "み"? def parse_result_tsumi s0 = @current_pos match_str("で") - if match_str("詰") != :failed + if match_str("詰") == :failed + @current_pos = s0 + :failed + else match_str("み") @reported_pos = s0 "TSUMI" - else - @current_pos = s0 - :failed end end # result_fuzumi : "で不詰" def parse_result_fuzumi s0 = @current_pos s1 = match_str("で不詰") - if s1 != :failed - @reported_pos = s0 - "FUZUMI" - else + if s1 == :failed @current_pos = s0 :failed + else + @reported_pos = s0 + "FUZUMI" end end # skipline : "#" nonls newline def parse_skipline s0 = @current_pos s1 = match_str("#") - if s1 != :failed + if s1 == :failed + @current_pos = s0 + s0 = :failed + else s2 = parse_nonls s3 = parse_newline - s0 = if s3 != :failed - [s1, s2, s3] - else + s0 = if s3 == :failed @current_pos = s0 :failed + else + [s1, s2, s3] end - else - @current_pos = s0 - s0 = :failed end s0 end # whitespace : " " | "\t" @@ -452,50 +440,50 @@ end s2 = match_str("\n") if s2 == :failed s2 = @current_pos s3 = match_str("\r") - s2 = if s3 != :failed + s2 = if s3 == :failed + @current_pos = s2 + :failed + else s4 = match_str("\n") s4 = nil if s4 == :failed [s3, s4] - else - @current_pos = s2 - :failed end end - if s2 != :failed - [s1, s2] - else + if s2 == :failed @current_pos = s0 :failed + else + [s1, s2] end end # nl : newline+ skipline* def parse_nl s0 = @current_pos s2 = parse_newline - if s2 != :failed + if s2 == :failed + s1 = :failed + else s1 = [] while s2 != :failed s1 << s2 s2 = parse_newline end - else - s1 = :failed end - if s1 != :failed + if s1 == :failed + @current_pos = s0 + :failed + else s2 = [] s3 = parse_skipline while s3 != :failed s2 << s3 s3 = parse_skipline end [s1, s2] - else - @current_pos = s0 - :failed end end # nonl : def parse_nonl