/* Snowcap pest grammar */
WHITESPACE = _{ " " | "\t" | "\r" | "\n" }
container = {
"{" ~ ("<" ~ attributes ~ ">")? ~ (row | column | stack | element)? ~ "}"
}
row = { ("row" | "-") ~ ("<" ~ attributes ~ ">")? ~ element_list }
column = { ("col" | "|") ~ ("<" ~ attributes ~ ">")? ~ element_list }
stack = { ("stack" | "^") ~ ("<" ~ attributes ~ ">")? ~ element_list }
element_list = _{ "[" ~ (element | row | column | stack | container) ~ ("," ~ (element | row | column | stack | container))* ~ "]" }
element = { label ~ ("<" ~ attributes ~ ">")? ~ "(" ~ (element_value | element | container | row | column | stack | array)? ~ ")" }
pair = { label ~ ":" ~ value }
attributes = { pair ~ ("," ~ pair)* }
element_value = { value }
value = _{ string | number | boolean | null | data_source }
array = { "[" ~ value ~ ("," ~ value)* ~ "]" }
data_source = { label ~ "!" ~ "(" ~ string ~ ")" }
boolean = { "true" | "false" }
null = { "null" }
label = @{ (ASCII_ALPHA | "-")* }
string = ${ "\"" ~ inner ~ "\"" }
inner = @{ char* }
char = {
!("\"" | "\\") ~ ANY
| "\\" ~ ("\"" | "\\" | "/" | "b" | "f" | "n" | "r" | "t")
| "\\" ~ ("u" ~ ASCII_HEX_DIGIT{4})
}
number = @{
"-"? ~ ("0" | ASCII_NONZERO_DIGIT ~ ASCII_DIGIT*) ~ ("." ~ ASCII_DIGIT*)? ~ (^"e" ~ ("+" | "-")? ~ ASCII_DIGIT+)?
}
markup = _{ SOI ~ (container) ~ EOI }