def parse_hirate
      s0 = @current_pos
      if match_str("PI") != :failed
        s2 = []
        s3 = parse_xy_piece
        while s3 != :failed
          s2 << s3
          s3 = parse_xy_piece
        end
        if parse_nl != :failed
          @reported_pos = s0
          s0 = -> (ps) do
            ret = { "preset" => "OTHER", "data" => { "board" => get_hirate } }
            ps.each do |piece|
              ret["data"]["board"][piece["xy"]["x"] - 1][piece["xy"]["y"] - 1] = {}
            end
            ret
          end.call(s2)
        else
          @current_pos = s0
          s0 = :failed
        end
      else
        @current_pos = s0
        s0 = :failed
      end
      s0
    end
def parse_hirate
      s0 = @current_pos
      if match_str("PI") != :failed
        s2 = []
        s3 = parse_xy_piece
        while s3 != :failed
          s2 << s3
          s3 = parse_xy_piece
        end
        if parse_nl != :failed
          @reported_pos = s0
          s0 = -> (ps) do
            ret = { "preset" => "OTHER", "data" => { "board" => get_hirate } }
            ps.each do |piece|
              ret["data"]["board"][piece["xy"]["x"] - 1][piece["xy"]["y"] - 1] = {}
            end
            ret
          end.call(s2)
        else
          @current_pos = s0
          s0 = :failed
        end
      else
        @current_pos = s0
        s0 = :failed
      end
      s0
    end
hirate : "PI" xypiece* nl