Module: Sashite::Feen::Parser::PiecePlacement

Defined in:
lib/sashite/feen/parser/piece_placement.rb

Overview

Parser for the piece placement field (first field of FEEN).

Converts a FEEN piece placement string into a Placement object, decoding board configuration from EPIN notation with:

  • Empty square compression (numbers → consecutive nils)

  • Multi-dimensional separator preservation (exact “/” counts)

  • Support for any irregular board structure

The parser preserves the exact separator structure, enabling perfect round-trip conversion (parse → dump → parse).

Constant Summary collapse

RANK_SEPARATOR =

Rank separator character.

"/"
EPIN_PATTERN =

Pattern to match EPIN pieces (optional state, letter, optional derivation).

/\A[-+]?[A-Za-z]'?\z/

Class Method Summary collapse

Class Method Details

.parse(string) ⇒ Placement

Parse a FEEN piece placement string into a Placement object.

Supports any valid FEEN structure:

  • 1D: Single rank, no separators (e.g., “K2P”)

  • 2D: Ranks separated by “/” (e.g., “8/8/8”)

  • 3D+: Ranks separated by multiple “/” (e.g., “5/5//5/5”)

  • Irregular: Any combination of rank sizes and separators

Examples:

Chess starting position

parse("+rnbq+kbn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+KBN+R")

Empty 8x8 board

parse("8/8/8/8/8/8/8/8")

1D board

parse("K2P3k")

Irregular structure

parse("99999/3///K/k//r")

Parameters:

  • string (String)

    FEEN piece placement field string

Returns:

Raises:



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/sashite/feen/parser/piece_placement.rb', line 54

def self.parse(string)
  # Detect dimension before parsing
  dimension = detect_dimension(string)

  # Handle 1D case (no separators)
  if dimension == 1
    rank = parse_rank(string)
    return Placement.new([rank], [], 1)
  end

  # Parse multi-dimensional structure with separators
  ranks, separators = parse_with_separators(string)

  Placement.new(ranks, separators, dimension)
end