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