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