1range_set  = { SOI ~ space* ~ range ~ (logical_or ~ range)* ~ space* ~ EOI }
2logical_or = { space* ~ "||" ~ space* }
3range      = { hyphen | simple ~ ( ","? ~ space+ ~ simple )* | empty }
4empty      = { "" }
5hyphen     = { partial ~ space+ ~ "-" ~ space+ ~ partial }
6simple     = { primitive | partial | tilde | caret }
7primitive  = { primitive_op ~ space* ~ partial }
8primitive_op = { ("<=" | ">=" | ">" | "<" | "=") }
9partial    = { xr ~ ("." ~ xr ~ ("." ~ xr ~ qualifier?)?)? }
10xr         = { xr_op | nr }
11xr_op      = { "x" | "X" | "*" }
12nr         = { "0" | ('1' .. '9') ~ (('0' .. '9'))* }
13tilde      = { ( "~>" | "~" ) ~ space* ~ partial }
14caret      = { "^" ~ space* ~ partial }
15qualifier  = { (("-" | "+") ~ parts) }
16parts      = { part ~ ("." ~ part)* }
17part       = { nr | ("-" | '0' .. '9' | 'A' .. 'Z' | 'a' .. 'z')+ }
18space      = _{ " " | "\t" }
19