class Jkf::Parser::Ki2
KI2 Parser
Protected Instance Methods
dousa2relative(str)
click to toggle source
movement string to jkf
# File lib/jkf/parser/ki2.rb, line 400 def dousa2relative(str) { "上" => "U", "寄" => "M", "引" => "D" }[str] || "" end
eos?()
click to toggle source
check eos
# File lib/jkf/parser/ki2.rb, line 422 def eos? @input[@current_pos].nil? end
make_hand(str)
click to toggle source
generate motigoma
# File lib/jkf/parser/ki2.rb, line 409 def make_hand(str) ret = { "FU" => 0, "KY" => 0, "KE" => 0, "GI" => 0, "KI" => 0, "KA" => 0, "HI" => 0 } return ret if str.empty? str.gsub(/ $/, "").split(" ").each do |kind| next if kind.empty? ret[kind2csa(kind[0])] = kind.length == 1 ? 1 : kan2n2(kind[1..-1]) end ret end
parse_comment()
click to toggle source
“*” nonls nl
# File lib/jkf/parser/ki2.rb, line 297 def parse_comment s0 = @current_pos if match_str("*") != :failed s2 = parse_nonls if parse_nl != :failed @reported_pos = s0 s0 = s2.join else @current_pos = s0 s0 = :failed end else @current_pos = s0 s0 = :failed end s0 end
parse_dousa()
click to toggle source
dousa : [上寄引]
# File lib/jkf/parser/ki2.rb, line 292 def parse_dousa match_regexp(/^[上寄引]/) end
parse_firstboard()
click to toggle source
firstboard : comment* pointer?
# File lib/jkf/parser/ki2.rb, line 146 def parse_firstboard s0 = @current_pos s1 = [] s2 = parse_comment while s2 != :failed s1 << s2 s2 = parse_comment end parse_pointer @reported_pos = s0 s0 = s1.empty? ? {} : { "comments" => s1 } s0 end
parse_fork()
click to toggle source
fork : “変化:” “ ”* [0-9]+ “手” nl moves
# File lib/jkf/parser/ki2.rb, line 316 def parse_fork s0 = @current_pos if match_str("変化:") != :failed match_spaces s3 = match_digits! if s3 != :failed if match_str("手") != :failed if parse_nl != :failed s6 = parse_moves if s6 != :failed @reported_pos = s0 s0 = { "te" => s3.join.to_i, "moves" => s6[1..-1] } else @current_pos = s0 s0 = :failed end else @current_pos = s0 s0 = :failed end else @current_pos = s0 s0 = :failed end else @current_pos = s0 s0 = :failed end else @current_pos = s0 s0 = :failed end s0 end
parse_fugou()
click to toggle source
fugou : place piece soutai? dousa? (“成” | “不成”)? “打”?
# File lib/jkf/parser/ki2.rb, line 228 def parse_fugou s0 = @current_pos s1 = parse_place if s1 != :failed s2 = parse_piece if s2 != :failed s3 = parse_soutai s3 = nil if s3 == :failed s4 = parse_dousa s4 = nil if s4 == :failed s5 = match_str("成") s5 = match_str("不成") if s5 == :failed s5 = nil if s5 == :failed s6 = match_str("打") s6 = nil if s6 == :failed @reported_pos = s0 transform_fugou(s1, s2, s3, s4, s5, s6) else @current_pos = s0 :failed end else @current_pos = s0 :failed end end
parse_header()
click to toggle source
header : [^:rn]+ “:” nonls nl+ | header_teban
# File lib/jkf/parser/ki2.rb, line 50 def parse_header s0 = @current_pos s2 = match_regexp(/^[^*:\r\n]/) if s2 != :failed s1 = [] while s2 != :failed s1 << s2 s2 = match_regexp(/^[^:\r\n]/) end else s1 = :failed end if s1 != :failed if match_str(":") != :failed s3 = parse_nonls s5 = parse_nl if s5 != :failed s4 = [] while s5 != :failed s4 << s5 s5 = parse_nl end else s4 = :failed end if s4 != :failed @reported_pos = s0 s0 = { "k" => s1.join, "v" => s3.join } else @current_pos = s0 s0 = :failed end else @current_pos = s0 s0 = :failed end else @current_pos = s0 s0 = :failed end s0 = parse_header_teban if s0 == :failed s0 end
parse_header_teban()
click to toggle source
header_teban : [先後上下] “手番” nl
# File lib/jkf/parser/ki2.rb, line 95 def parse_header_teban s0 = @current_pos s1 = parse_turn if s1 != :failed s2 = match_str("手番") if s2 != :failed s3 = parse_nl if s3 != :failed @reported_pos = s0 { "k" => "手番", "v" => s1 } else @current_pos = s0 :failed end else @current_pos = s0 :failed end else @current_pos = s0 :failed end end
parse_line()
click to toggle source
line : [▲△] fugou (nl / “ ”)*
# File lib/jkf/parser/ki2.rb, line 195 def parse_line s0 = @current_pos s1 = match_regexp(/^[▲△]/) if s1 != :failed s1 = if s1 == "▲" { "color" => 0 } else { "color" => 1 } end s2 = parse_fugou if s2 != :failed s3 = [] s4 = parse_nl s4 = match_space if s4 == :failed while s4 != :failed s3 << s4 s4 = parse_nl s4 = match_space if s4 == :failed end @reported_pos = s0 s0 = s2.merge(s1) else @current_pos = s0 s0 = :failed end else @current_pos = s0 s0 = :failed end s0 end
parse_move()
click to toggle source
move : line comment* pointer? (nl | “ ”)*
# File lib/jkf/parser/ki2.rb, line 161 def parse_move s0 = @current_pos s1 = parse_line if s1 != :failed s2 = [] s3 = parse_comment while s3 != :failed s2 << s3 s3 = parse_comment end parse_pointer s4 = [] s5 = parse_nl s5 = match_space if s5 == :failed while s5 != :failed s4 << s5 s5 = parse_nl s5 = match_space if s5 == :failed end @reported_pos = s0 s0 = -> (line, c) do ret = { "move" => line } ret["comments"] = c if !c.empty? ret end.call(s1, s2) else @current_pos = s0 s0 = :failed end s0 end
parse_moves()
click to toggle source
moves : firstboard : move* result?
# File lib/jkf/parser/ki2.rb, line 120 def parse_moves s0 = @current_pos s1 = parse_firstboard if s1 != :failed s2 = [] s3 = parse_move while s3 != :failed s2 << s3 s3 = parse_move end s3 = parse_result s3 = nil if s3 == :failed @reported_pos = s0 s0 = -> (hd, tl, res) do tl.unshift(hd) tl << { "special" => res } if res && !tl[tl.length - 1]["special"] tl end.call(s1, s2, s3) else @current_pos = s0 s0 = :failed end s0 end
parse_place()
click to toggle source
place : num numkan
# File lib/jkf/parser/ki2.rb, line 256 def parse_place s0 = @current_pos s1 = parse_num if s1 != :failed s2 = parse_numkan if s2 != :failed @reported_pos = s0 s0 = { "x" => s1, "y" => s2 } else @current_pos = s0 s0 = :failed end else @current_pos = s0 s0 = :failed end if s0 == :failed s0 = @current_pos if match_regexp("同") != :failed match_str(" ") @reported_pos = s0 s0 = { "same" => true } else @current_pos = s0 s0 = :failed end end s0 end
parse_root()
click to toggle source
kifu : header* initialboard? header* moves fork*
# File lib/jkf/parser/ki2.rb, line 11 def parse_root s0 = @current_pos s1 = [] s2 = parse_header while s2 != :failed s1 << s2 s2 = parse_header end if s1 != :failed s2 = parse_initialboard s2 = nil if s2 == :failed s3 = [] s4 = parse_header while s4 != :failed s3 << s4 s4 = parse_header end s4 = parse_moves if s4 != :failed s5 = [] s6 = parse_fork while s6 != :failed s5 << s6 s6 = parse_fork end @reported_pos = s0 s0 = transform_root(s1, s2, s3, s4, s5) else @current_pos = s0 s0 = :failed end else @current_pos = s0 s0 = :failed end s0 end
parse_soutai()
click to toggle source
soutai : [左直右]
# File lib/jkf/parser/ki2.rb, line 287 def parse_soutai match_regexp(/^[左直右]/) end
parse_turn()
click to toggle source
turn : [先後上下]
# File lib/jkf/parser/ki2.rb, line 352 def parse_turn match_regexp(/^[先後上下]/) end
soutai2relative(str)
click to toggle source
relative string to jkf
# File lib/jkf/parser/ki2.rb, line 391 def soutai2relative(str) { "左" => "L", "直" => "C", "右" => "R" }[str] || "" end
transform_fugou(pl, pi, sou, dou, pro, da)
click to toggle source
transfrom fugou to jkf
# File lib/jkf/parser/ki2.rb, line 373 def transform_fugou(pl, pi, sou, dou, pro, da) ret = { "piece" => pi } if pl["same"] ret["same"] = true else ret["to"] = pl end ret["promote"] = (pro == "成") if pro if da ret["relative"] = "H" else rel = soutai2relative(sou) + dousa2relative(dou) ret["relative"] = rel unless rel.empty? end ret end
transform_root(headers, ini, headers2, moves, forks)
click to toggle source
transform to jkf
# File lib/jkf/parser/ki2.rb, line 357 def transform_root(headers, ini, headers2, moves, forks) ret = { "header" => {}, "moves" => moves } headers.compact.each { |h| ret["header"][h["k"]] = h["v"] } headers2.compact.each { |h| ret["header"][h["k"]] = h["v"] } if ini ret["initial"] = ini elsif ret["header"]["手合割"] preset = preset2str(ret["header"]["手合割"]) ret["initial"] = { "preset" => preset } if preset != "OTHER" end transform_root_header_data(ret) if ret["initial"] && ret["initial"]["data"] transform_root_forks(forks, moves) ret end