WHITESPACE = _{ " " }
selector = _{ SOI ~ (target | pointer) ~ EOI }
pointer_sep = _{ "/" }
pointer = _{ pointer_sep ~ (ident | index)* ~ pointer* }
target = _{ (array_index | hash | identity)+ }
identity = _{ "." }
hash = _{ identity ~ (ident | ( "[" ~ text ~ "]")) }
array_index = _{ identity ~ "[" ~ (index) ~ "]" }
selector_filter = _{ SOI ~ doc_wildcard | (doc_index_target ~ (filter_target | pointer)? ~ pipe?)* ~ EOI }
doc_index_target = _{ "[" ~ doc_index ~ "]" }
doc_index = { ASCII_DIGIT+ }
doc_wildcard = { "*" }
filter_target = _{ (array_range | array_index | hash | identity)+ }
array_range = _{ identity ~ "[" ~ range ~ "]" }
text = _{ "\"" ~ chars ~ "\"" }
pipe = { "<" | "|" }
chars = { char* }
index = { ASCII_DIGIT+ }
range = @{ (ASCII_DIGIT+)? ~ ":" ~ (ASCII_DIGIT+)? }
char = _{
!("\"" | "\\") ~ ANY
| "\\" ~ ("\"" | "\\" | "/" | "b" | "f" | "n" | "r" | "t")
| "\\" ~ ("u" ~ ASCII_HEX_DIGIT{4})
}
ident = @{ ASCII_ALPHA ~ ASCII_ALPHANUMERIC+? }