PEG
enum PEG =
`
TOML:
Document <- (ValueLine)* KeyGroup*
KeyGroup <- Header ValueLine*
Header <- ignore "[" HeaderName "]" line_end
HeaderName <- qualifiedIdentifier
ValueLine <- :ignore Name :ws :"=" :ws Value line_end
Name <- identifier
Value <- DatetimeValue / StringValue / FloatValue / IntegerValue / BooleanValue / Array
#
# Strings
# -----------------------------------------------------------------
StringValue <~ :doublequote (!doublequote Char)* :doublequote
Char <~ backslash ( doublequote # '\' Escapes
/ quote
/ backslash
/ [bfnrt]
/ [0-2][0-7][0-7]
/ [0-7][0-7]?
/ 'x' Hex Hex
/ 'u' Hex Hex Hex Hex
/ 'U' Hex Hex Hex Hex Hex Hex Hex Hex
)
/ . # Or any char, really
Hex <- [0-9a-fA-F]
#
# Numbers
# -------------------------------------------
Digit <- [0-9]
IntegerValue <~ "-"? [1-9] digit*
FloatValue <~ IntegerValue "." digit+
#
# DateTime
# -------------------------------------------
DatetimeValue <~ ([1-9] digit digit digit) "-" (digit digit) "-" (digit digit) "T" (digit digit) ":" (digit digit) ":" (digit digit) "Z"
#
# Boolean
# -------------------------------------------
BooleanValue <- ("true" / "false")
#
# Arrays
# -------------------------------------------
Array <- EmptyArray / DatetimeArray / StringArray / IntegerArray / FloatArray / ArrayOfArray
EmptyArray <- :"[" ws :"]"
StringArray <- :"[" ws StringValue (ws :"," ws StringValue)* ws :"]"
IntegerArray <- :"[" ws IntegerValue (ws :"," ws IntegerValue)* ws :"]"
FloatArray <- :"[" ws FloatValue (ws :"," ws FloatValue)* ws :"]"
DatetimeArray <- :"[" ws DatetimeValue (ws :"," ws DatetimeValue)* ws :"]"
ArrayOfArray <- :"[" ws Array (ws :"," ws Array)* ws :"]"
#
# Helpers
# -----------------------------------------
line_end <- ws comment? !(!eol .)
ignore <- :(comment / space / eol)*
comment <- "#" (!eol .)*
ws <- :space*
`;
toml grammar
manifest constants