module Jkf::Parser::Kifuable

Intersection of KIF and KI2

Protected Instance Methods

kan2n(s) click to toggle source

kanji number to number (1)

# File lib/jkf/parser/kifuable.rb, line 578
def kan2n(s)
  "〇一二三四五六七八九".index(s)
end
kan2n2(s) click to toggle source

kanji number to number (2)

# File lib/jkf/parser/kifuable.rb, line 583
def kan2n2(s)
  case s.length
  when 1
    "〇一二三四五六七八九十".index(s)
  when 2
    "〇一二三四五六七八九十".index(s[1]) + 10
  else
    raise "21以上の数値に対応していません"
  end
end
kind2csa(kind) click to toggle source

kanji piece-type to csa

# File lib/jkf/parser/kifuable.rb, line 595
def kind2csa(kind)
  if kind[0] == "成"
    {
      "香" => "NY",
      "桂" => "NK",
      "銀" => "NG"
    }[kind[1]]
  else
    {
      "歩" => "FU",
      "香" => "KY",
      "桂" => "KE",
      "銀" => "GI",
      "金" => "KI",
      "角" => "KA",
      "飛" => "HI",
      "玉" => "OU",
      "王" => "OU",
      "と" => "TO",
      "杏" => "NY",
      "圭" => "NK",
      "全" => "NG",
      "馬" => "UM",
      "竜" => "RY",
      "龍" => "RY"
    }[kind]
  end
end
parse_ikkatsuline() click to toggle source

ikkatsuline : “|” masu:masu+ “|” nonls! nl

# File lib/jkf/parser/kifuable.rb, line 50
def parse_ikkatsuline
  s0 = @current_pos
  if match_str("|") != :failed
    s3 = parse_masu
    if s3 != :failed
      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
      else
        @current_pos = s0
        s0 = :failed
      end
    else
      @current_pos = s0
      s0 = :failed
    end
  else
    @current_pos = s0
    s0 = :failed
  end

  s0
end
parse_initialboard() click to toggle source

initialboard : (“ ” nonls nl)? (“+” nonls nl)? ikkatsuline+ (“+” nonls nl)?

# File lib/jkf/parser/kifuable.rb, line 7
def parse_initialboard
  s0 = s1 = @current_pos
  if match_space != :failed
    parse_nonls
    s2 = parse_nl
    @current_pos = s1 if s2 == :failed
  else
    @current_pos = s1
  end
  s2 = @current_pos
  if match_str("+") != :failed
    parse_nonls
    @current_pos = s2 if parse_nl == :failed
  else
    @current_pos = s2
  end
  s4 = parse_ikkatsuline
  if s4 != :failed
    s3 = []
    while s4 != :failed
      s3 << s4
      s4 = parse_ikkatsuline
    end
  else
    s3 = :failed
  end
  if s3 != :failed
    s4 = @current_pos
    if match_str("+") != :failed
      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
parse_masu() click to toggle source

masu : teban piece | “ ・”

# File lib/jkf/parser/kifuable.rb, line 95
def parse_masu
  s0 = @current_pos
  s1 = parse_teban
  if s1 != :failed
    s2 = parse_piece
    if s2 != :failed
      @reported_pos = s0
      s0 = { "color" => s1, "kind" => s2 }
    else
      @current_pos = s0
      s0 = :failed
    end
  else
    @current_pos = s0
    s0 = :failed
  end
  if s0 == :failed
    s0 = @current_pos
    s1 = match_str(" ・")
    if s1 != :failed
      @reported_pos = s0
      s1 = {}
    end
    s0 = s1
  end

  s0
end
parse_newline() click to toggle source

newline : whitespace* (“n” | “r” “n”?)

# File lib/jkf/parser/kifuable.rb, line 445
def parse_newline
  s0 = @current_pos
  s1 = []
  s2 = parse_whitespace
  while s2 != :failed
    s1 << s2
    s2 = parse_whitespace
  end
  s2 = match_str("\n")
  if s2 == :failed
    s2 = @current_pos
    s3 = match_str("\r")
    s2 = if s3 != :failed
           s4 = match_str("\n")
           s4 = nil if s4 == :failed
           [s3, s4]
         else
           @current_pos = s2
           :failed
         end
  end
  if s2 != :failed
    [s1, s2]
  else
    @current_pos = s0
    :failed
  end
end
parse_nl() click to toggle source

nl : newline+ skipline*

# File lib/jkf/parser/kifuable.rb, line 475
def parse_nl
  s0 = @current_pos
  s2 = parse_newline
  if s2 != :failed
    s1 = []
    while s2 != :failed
      s1 << s2
      s2 = parse_newline
    end
  else
    s1 = :failed
  end
  if s1 != :failed
    s2 = []
    s3 = parse_skipline
    while s3 != :failed
      s2 << s3
      s3 = parse_skipline
    end
    [s1, s2]
  else
    @current_pos = s0
    :failed
  end
end
parse_nonl() click to toggle source

nonl :

# File lib/jkf/parser/kifuable.rb, line 502
def parse_nonl
  match_regexp(/^[^\r\n]/)
end
parse_nonls() click to toggle source

nonls : nonl*

# File lib/jkf/parser/kifuable.rb, line 507
def parse_nonls
  stack = []
  matched = parse_nonl
  while matched != :failed
    stack << matched
    matched = parse_nonl
  end
  stack
end
parse_nonls!() click to toggle source

nonls! : nonl+

# File lib/jkf/parser/kifuable.rb, line 518
def parse_nonls!
  matched = parse_nonls
  if matched.empty?
    :failed
  else
    matched
  end
end
parse_num() click to toggle source

num : [123456789]

# File lib/jkf/parser/kifuable.rb, line 171
def parse_num
  s0 = @current_pos
  s1 = match_regexp(/^[123456789]/)
  if s1 != :failed
    @reported_pos = s0
    s1 = zen2n(s1)
  end
  s1
end
parse_numkan() click to toggle source

numkan : [一二三四五六七八九]

# File lib/jkf/parser/kifuable.rb, line 182
def parse_numkan
  s0 = @current_pos
  s1 = match_regexp(/^[一二三四五六七八九]/)
  if s1 != :failed
    @reported_pos = s0
    s1 = kan2n(s1)
  end
  s1
end
parse_piece() click to toggle source

piece : “成”? [歩香桂銀金角飛王玉と杏圭全馬竜龍]

# File lib/jkf/parser/kifuable.rb, line 193
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
    @current_pos = s0
    :failed
  end
end
parse_pointer() click to toggle source

pointer : “&” nonls nl

# File lib/jkf/parser/kifuable.rb, line 151
def parse_pointer
  s0 = @current_pos
  s1 = match_str("&")
  if s1 != :failed
    s2 = parse_nonls
    s3 = parse_nl
    if s3 != :failed
      s0 = [s1, s2, s3]
    else
      @current_pos = s0
      s0 = :failed
    end
  else
    @current_pos = s0
    s0 = :failed
  end
  s0
end
parse_result() click to toggle source

result : “まで” [0-9]+ “手” (

  "で" (turn "手の" (result_toryo | result_illegal)) |
  result_timeup | result_chudan | result_jishogi |
  result_sennichite | result_tsumi | result_fuzumi
) nl
# File lib/jkf/parser/kifuable.rb, line 212
def parse_result
  s0 = @current_pos
  if match_str("まで") != :failed
    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
          @current_pos = s4
          s4 = :failed
        end
        if s4 == :failed
          s4 = parse_result_timeup
          if s4 == :failed
            s4 = parse_result_chudan
            if s4 == :failed
              s4 = parse_result_jishogi
              if s4 == :failed
                s4 = parse_result_sennichite
                if s4 == :failed
                  s4 = parse_result_tsumi
                  s4 = parse_result_fuzumi if s4 == :failed
                end
              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
      else
        @current_pos = s0
        :failed
      end
    else
      @current_pos = s0
      :failed
    end
  else
    @current_pos = s0
    :failed
  end
end
parse_result_chudan() click to toggle source

result_chudan : “で中断”

# File lib/jkf/parser/kifuable.rb, line 354
def parse_result_chudan
  s0 = @current_pos
  s1 = match_str("で中断")
  if s1 != :failed
    @reported_pos = s0
    "CHUDAN"
  else
    @current_pos = s0
    :failed
  end
end
parse_result_fuzumi() click to toggle source

result_fuzumi : “で不詰”

# File lib/jkf/parser/kifuable.rb, line 407
def parse_result_fuzumi
  s0 = @current_pos
  s1 = match_str("で不詰")
  if s1 != :failed
    @reported_pos = s0
    "FUZUMI"
  else
    @current_pos = s0
    :failed
  end
end
parse_result_illegal() click to toggle source

result_illegal : “反則” (“勝ち” | “負け”)

# File lib/jkf/parser/kifuable.rb, line 299
def parse_result_illegal
  s0 = @current_pos
  if match_str("反則") != :failed
    s10 = @current_pos
    s11 = match_str("勝ち")
    if s11 != :failed
      @reported_pos = s10
      s11 = "ILLEGAL_ACTION"
    end
    s10 = s11
    if s10 == :failed
      s10 = @current_pos
      s11 = match_str("負け")
      if s11 != :failed
        @reported_pos = s10
        s11 = "ILLEGAL_MOVE"
      end
      s10 = s11
    end
    if s10 != :failed
      @reported_pos = s0
      s10
    else
      @current_pos = s0
      :failed
    end
  else
    @current_pos = s0
    :failed
  end
end
parse_result_jishogi() click to toggle source

result_jishogi : “で持将棋”

# File lib/jkf/parser/kifuable.rb, line 367
def parse_result_jishogi
  s0 = @current_pos
  s1 = match_str("で持将棋")
  if s1 != :failed
    @reported_pos = s0
    "JISHOGI"
  else
    @current_pos = s0
    :failed
  end
end
parse_result_sennichite() click to toggle source

result_sennichite : “で千日手”

# File lib/jkf/parser/kifuable.rb, line 380
def parse_result_sennichite
  s0 = @current_pos
  s1 = match_str("で千日手")
  if s1 != :failed
    @reported_pos = s0
    "SENNICHITE"
  else
    @current_pos = s0
    :failed
  end
end
parse_result_timeup() click to toggle source

result_timeup : “で時間切れにより” turn “手の勝ち”

# File lib/jkf/parser/kifuable.rb, line 332
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
      @current_pos = s0
      :failed
    end
  else
    @current_pos = s0
    :failed
  end
end
parse_result_toryo() click to toggle source

result_toryo : “勝ち”

# File lib/jkf/parser/kifuable.rb, line 286
def parse_result_toryo
  s0 = @current_pos
  s1 = match_str("勝ち")
  if s1 != :failed
    @reported_pos = s0
    "TORYO"
  else
    @current_pos = s0
    :failed
  end
end
parse_result_tsumi() click to toggle source

result_tsumi : “で”? “詰” “み”?

# File lib/jkf/parser/kifuable.rb, line 393
def parse_result_tsumi
  s0 = @current_pos
  match_str("で")
  if match_str("詰") != :failed
    match_str("み")
    @reported_pos = s0
    "TSUMI"
  else
    @current_pos = s0
    :failed
  end
end
parse_skipline() click to toggle source

skipline : “#” nonls newline

# File lib/jkf/parser/kifuable.rb, line 420
def parse_skipline
  s0 = @current_pos
  s1 = match_str("#")
  if s1 != :failed
    s2 = parse_nonls
    s3 = parse_newline
    s0 = if s3 != :failed
           [s1, s2, s3]
         else
           @current_pos = s0
           :failed
         end
  else
    @current_pos = s0
    s0 = :failed
  end
  s0
end
parse_teban() click to toggle source

teban : (“ ” | “+” | “^”) | (“v” | “V”)

# File lib/jkf/parser/kifuable.rb, line 125
def parse_teban
  s0 = @current_pos
  s1 = match_space
  if s1 == :failed
    s1 = match_str("+")
    s1 = match_str("^") if s1 == :failed
  end
  if s1 != :failed
    @reported_pos = s0
    s1 = 0
  end
  s0 = s1
  if s0 == :failed
    s0 = @current_pos
    s1 = match_str("v")
    s1 = match_str("V") if s1 == :failed
    if s1 != :failed
      @reported_pos = s0
      s1 = 1
    end
    s0 = s1
  end
  s0
end
parse_whitespace() click to toggle source

whitespace : “ ” | “t”

# File lib/jkf/parser/kifuable.rb, line 440
def parse_whitespace
  match_regexp(/^[ \t]/)
end
preset2str(preset) click to toggle source

preset string to jkf

# File lib/jkf/parser/kifuable.rb, line 625
def preset2str(preset)
  {
    "平手" => "HIRATE",
    "香落ち" => "KY",
    "右香落ち" => "KY_R",
    "角落ち" => "KA",
    "飛車落ち" => "HI",
    "飛香落ち" => "HIKY",
    "二枚落ち" => "2",
    "三枚落ち" => "3",
    "四枚落ち" => "4",
    "五枚落ち" => "5",
    "左五枚落ち" => "5_L",
    "六枚落ち" => "6",
    "八枚落ち" => "8",
    "十枚落ち" => "10",
    "その他" => "OTHER"
  }[preset.gsub(/\s/, "")]
end
transform_initialboard(lines) click to toggle source

transform initialboard to jkf

# File lib/jkf/parser/kifuable.rb, line 560
def transform_initialboard(lines)
  board = []
  9.times do |i|
    line = []
    9.times do |j|
      line << lines[j][8 - i]
    end
    board << line
  end
  { "preset" => "OTHER", "data" => { "board" => board } }
end
transform_root_forks(forks, moves) click to toggle source

transfrom forks to jkf

# File lib/jkf/parser/kifuable.rb, line 545
def transform_root_forks(forks, moves)
  fork_stack = [{ "te" => 0, "moves" => moves }]
  forks.each do |f|
    now_fork = f
    _fork = fork_stack.pop
    _fork = fork_stack.pop while _fork["te"] > now_fork["te"]
    move = _fork["moves"][now_fork["te"] - _fork["te"]]
    move["forks"] ||= []
    move["forks"] << now_fork["moves"]
    fork_stack << _fork
    fork_stack << now_fork
  end
end
transform_root_header_data(ret) click to toggle source

transform header-data to jkf

# File lib/jkf/parser/kifuable.rb, line 528
def transform_root_header_data(ret)
  if ret["header"]["手番"]
    ret["initial"]["data"]["color"] = "下先".include?(ret["header"]["手番"]) ? 0 : 1
    ret["header"].delete("手番")
  else
    ret["initial"]["data"]["color"] = 0
  end
  ret["initial"]["data"]["hands"] = [
    make_hand(ret["header"]["先手の持駒"] || ret["header"]["下手の持駒"]),
    make_hand(ret["header"]["後手の持駒"] || ret["header"]["上手の持駒"])
  ]
  %w(先手の持駒 下手の持駒 後手の持駒 上手の持駒).each do |key|
    ret["header"].delete(key)
  end
end
zen2n(s) click to toggle source

zenkaku number to number

# File lib/jkf/parser/kifuable.rb, line 573
def zen2n(s)
  "0123456789".index(s)
end