Marin = { SOI ~ (Keyword | Flag | Value)* ~ EOI }
Keyword = { String ~ ":" ~ Value }
List = { "[" ~ Value ~ ("," ~ Value)* ~ "]" | "[" ~ "]" }
Value = { RangeExpr | Float | Int | List | Bool | String }
Flag = { "-" ~ FlagInner }
FlagInner = @{ ASCII_ALPHA ~ Bareword? }
RangeExpr = { RangeTo | Range }
Range = { Number ~ ".." ~ Number }
RangeTo = { ".." ~ Number }
String = { "\"" ~ Inner ~ "\"" | Bareword }
Bareword = @{ (ASCII_ALPHANUMERIC | "@" | "." | ":/" | "/")+ }
Inner = @{ (!("\"" | "\\") ~ ANY)* ~ (Escape ~ Inner)? }
Escape = @{ "\\" ~ ("\"" | "\\") }
Exp = @{ ^"e" ~ ("+" | "-")? ~ ASCII_DIGIT+ }
Number = @{ "-"? ~ ("0" | ASCII_NONZERO_DIGIT ~ ASCII_DIGIT*) }
Float = @{ Number ~ ("." ~ ASCII_DIGIT+ ~ Exp? | Exp) }
Int = @{ Number ~ !Bareword}
Bool = { "true" | "false" | "True" | "False" }
COMMENT = _{ "#" ~ (!NEWLINE ~ ANY)* }
WHITESPACE = _{ " " | "\t" | NEWLINE }