// hidden tokens
bopen = _{ "[" }
bclose = _{ "]" }
rsep = _{ "-" }
usep = _{ ":" }
dopen = _{ "{" }
dclose = _{ "}" }
read_num = { "1" | "2" }
single_len = { ASCII_DIGIT+ }
len_range = ${ single_len ~ rsep ~ single_len }
nucstr = { ("A" | "C" | "G" | "T")+ }
fixed_barcode_segment = { "b" ~ bopen ~ single_len ~ bclose }
fixed_umi_segment = { "u" ~ bopen ~ single_len ~ bclose }
fixed_seq_segment = { "f" ~ bopen ~ nucstr ~ bclose }
fixed_read_segment = { "r" ~ bopen ~ single_len ~ bclose }
fixed_discard_segment = { "x" ~ bopen ~ single_len ~ bclose }
ranged_barcode_segment = { "b" ~ bopen ~ len_range ~ bclose }
ranged_umi_segment = { "u" ~ bopen ~ len_range ~ bclose }
ranged_read_segment = { "r" ~ bopen ~ len_range ~ bclose }
ranged_discard_segment = { "x" ~ bopen ~ len_range ~ bclose }
unbounded_barcode_segment = { "b" ~ usep }
unbounded_umi_segment = { "u" ~ usep }
unbounded_read_segment = { "r" ~ usep }
unbounded_discard_segment = { "x" ~ usep }
fixed_segment = {
(fixed_umi_segment | fixed_read_segment | fixed_barcode_segment | fixed_discard_segment)
}
ranged_segment = {
(ranged_umi_segment | ranged_read_segment | ranged_barcode_segment | ranged_discard_segment)
}
bounded_segment = _{
(fixed_segment | fixed_seq_segment | (ranged_segment ~ fixed_segment* ~ fixed_seq_segment) | (unbounded_segment ~ fixed_segment* ~ fixed_seq_segment))
}
unbounded_segment = {
(unbounded_umi_segment | unbounded_read_segment | unbounded_barcode_segment | unbounded_discard_segment)
}
read_desc = {
dopen ~ ((bounded_segment)+ ~ (ranged_segment | unbounded_segment)? | unbounded_segment | ranged_segment) ~ dclose
}
read_1_desc = { "1" ~ read_desc }
read_2_desc = { "2" ~ read_desc }
frag_desc = _{ SOI ~ read_1_desc ~ read_2_desc ~ EOI }