[
{
container: :harray,
item: :number,
pat: /^(?<v>[a-z]+)[01](\s+\k<v>.)*(\s+\.+)?(\s+\k<v>.)+$/i,
names: ->(m) { [m[:v]] },
pat2: ->(_) { nil },
size: ->(f) { [f[-1]] }
},
{
container: :harray,
item: :char,
pat: /^(?<v>[a-z]+)[01](\k<v>.)*(\s*\.+\s*)?(\k<v>.)+$/i,
names: ->(m) { [m[:v]] },
pat2: ->(_) { nil },
size: ->(f) { [f[-1]] }
},
{
container: :matrix,
item: :number,
pat: /^(?<v>[a-z]+)[01][01](\s+\k<v>..)*(\s+\.+)?(\s+\k<v>..)+$/i,
names: ->(m) { [m[:v]] },
pat2: ->(v) { /(^#{v}..(\s+#{v}..)*(\s+\.+)?(\s+#{v}..)+|\.+)$/ },
size: ->(f) { f[-2..-1].chars.to_a }
},
{
container: :matrix,
item: :char,
pat: /^(?<v>[a-z]+)[01][01](\k<v>..)*(\s*\.+\s*)?(\k<v>..)+$/i,
names: ->(m) { [m[:v]] },
pat2: ->(v) { /(^#{v}..(#{v}..)*(\s*\.+\s*)?(#{v}..)+|\.+)$/ },
size: ->(f) { f[-2..-1].chars.to_a }
},
{
container: :varray,
item: :number,
pat: /^[a-z]+(?<i>[0-9])(\s+[a-z]+\k<i>)*$/i,
names: ->(m) { m[0].split.map { |w| w[0..-2] } },
pat2: lambda { |vs|
pat = vs.map { |v| v + '.+' }.join('\s+')
/^(#{pat}|\.+)$/
},
size: ->(f) { /(?<sz>\d+)$/ =~ f ? [sz] : [f[-1]] }
},
{
container: :single,
item: :number,
pat: /^[a-z]+(\s+[a-z]+)*$/i,
names: ->(m) { m[0].split },
pat2: ->(_) { nil },
size: ->(_) { [] }
}
].freeze