flql 0.2.6

Query parser for flinch in-memory database
Documentation
program = _{ SOI ~ ";"* ~ (stmt ~ ";"+) ~ stmt? ~ EOI }
stmt = _{ expr }

expr = {
    new_db |
    perm_db |
    drop_db |
    drop_user |
	new |
    drop |
    exists |
    length |
    ttl |
    put |
    put_when |
    put_pointer |
    get |
    get_when |
    get_pointer |
    get_view |
    get_clip |
    get_index |
    get_range |
    search_typing |
    delete |
    delete_when |
    delete_pointer |
    delete_clip
}

new_db = { "db"~"."~"new"~"("~object~")" }
perm_db = { "db"~"."~"permit"~"("~object~")" }
drop_db = { "db"~"."~"drop"~"("~db~")" }
drop_user = { "db"~"("~db~")"~"."~"user"~"("~quots~")"~"."~"drop"~"("~")" }

new = { "new" ~ "(" ~ object ~ ")" }
drop = { "drop" ~ "(" ~ collection ~ ")" }
exists = { "exists" ~ "(" ~ pointer ~ ")"~"."~"into"~"(" ~ collection ~ ")" }
length = { "length"~"("~ collection ~ ")" }
flush = { "flush"~"("~ collection ~ ")" }

put = { "put"~"(" ~ document ~ ")"~"."~"into"~"(" ~ collection ~ ")" }
put_when = { "put"~"("~document~")"~"."~"when"~"("~condition~")"~"."~"into"~"(" ~ collection ~ ")" }
put_pointer = { "put"~"("~document~")"~"."~"pointer"~"("~pointer~")"~"."~"into"~"(" ~ collection ~ ")" }

ttl = { "ttl"~"("~u64~")"~"."~"if"~"("~condition~")"~"."~"into"~"(" ~ collection ~ ")" }

get = { "get"~"."~"from"~"("~ collection ~")" ~ ("."~"sort"~"(") ~ sort ~ (")") ~ ("."~"page"~"(") ~limit~ (")") }
get_when = { "get"~"."~"when"~"(" ~ condition ~ ")"~"."~"from"~"("~collection~")" ~ ("."~"sort"~"(") ~ sort ~ (")") ~ ("."~"page"~"(") ~limit~ (")") }
get_pointer = { "get"~"."~"pointer"~"("~ pointer ~ ")"~"."~"from"~"("~collection~")" }
get_view = { "get"~"."~"view"~"(" ~ view ~ ")"~"."~"from"~"("~collection~")" }
get_clip = { "get"~"."~"clip"~"(" ~ clip ~ ")"~"."~"from"~"("~collection~")" }
get_index = { "get"~"."~"index"~"("~quots~")"~"."~"from"~"("~collection~")" }
get_range = { "get"~"."~"range"~"("~"start"~":"~quots~","~"end"~":"~quots~","~"on"~":"~quots~")"~"."~"from"~"("~collection~")" }

search_typing = { "search"~"."~"typing"~"("~quots~")"~"."~"from"~"("~collection~")" }

delete = { "delete"~"."~"from"~"(" ~ collection ~ ")" }
delete_when = { "delete"~"."~"when"~"(" ~ condition ~ ")"~"."~"from"~"("~collection~")" }
delete_pointer = { "delete"~"."~"pointer"~"("~ pointer ~ ")"~"."~"from"~"("~collection~")" }
delete_clip = { "delete"~"."~"clip"~"(" ~ clip ~ ")"~"."~"from"~"("~collection~")" }

db = @{quots}
collection = @{quots}
pointer = @{quots}
view = @{quots}
clip = @{quots}
document = @{object}
condition = @{ "'" ~ ( "''" | (!"'" ~ ANY) )* ~ "'" }
u64 = @{ASCII_NONZERO_DIGIT ~ ASCII_DIGIT*}
limit = @{null | ((ASCII_DIGIT*)~","~(ASCII_DIGIT*))}
sort = @{null | (quots~","~("'ASC'" | "'DESC'"))}

quots = @{ "'" ~ ( "''" | (!"'" ~ ANY) )* ~ "'" }
object = {
    "{" ~ "}" |
    "{" ~ pair ~ ("," ~ pair)* ~ "}"
}
array = {
    "[" ~ "]" |
    "[" ~ value ~ ("," ~ value)* ~ "]"
}
string = ${ "\"" ~ inner ~ "\"" }
value = _{ object | array | string | number | boolean | null }
number = @{
    "-"?
    ~ ("0" | ASCII_NONZERO_DIGIT ~ ASCII_DIGIT*)
    ~ ("." ~ ASCII_DIGIT*)?
    ~ (^"e" ~ ("+" | "-")? ~ ASCII_DIGIT+)?
}
boolean = { "true" | "false" }
null = { "null" }
inner = @{ char* }
char = {
    !("\"" | "\\") ~ ANY
    | "\\" ~ ("\"" | "\\" | "/" | "b" | "f" | "n" | "r" | "t")
    | "\\" ~ ("u" ~ ASCII_HEX_DIGIT{4})
}
pair = { string ~ ":" ~ value }

WHITESPACE = _{ " " | "\t" | "\r" | "\n" }

COMMENT = _{ "#" ~ (!"\n" ~ ANY)* }