snowcap 0.1.3

A simple markup language for iced
Documentation
/* 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 }