================================================================================ VALID - comment - basic ================================================================================ # This is a full-line comment key = "value" # This is a comment at the end of a line -------------------------------------------------------------------------------- (document (comment) (pair (key) (string) (comment))) ================================================================================ VALID - key/value pair - basic ================================================================================ key = "value" -------------------------------------------------------------------------------- (document (pair (key) (string))) ================================================================================ INVALID - key/value pair - empty value ================================================================================ key = # INVALID -------------------------------------------------------------------------------- (document (ERROR (key) (comment))) ================================================================================ INVALID - key/value pair - no newline between pairs ================================================================================ first = "Tom" last = "Preston-Werner" # INVALID -------------------------------------------------------------------------------- (document (pair (key) (string) (MISSING _line_ending_or_eof)) (pair (key) (string) (comment))) ================================================================================ VALID - keys - bare keys ================================================================================ key = "value" bare_key = "value" bare-key = "value" 1234 = "value" -------------------------------------------------------------------------------- (document (pair (key) (string)) (pair (key) (string)) (pair (key) (string)) (pair (key) (string))) ================================================================================ VALID - keys - quoted keys ================================================================================ "127.0.0.1" = "value" "character encoding" = "value" "ʎǝʞ" = "value" 'key2' = "value" 'quoted "value"' = "value" -------------------------------------------------------------------------------- (document (pair (key) (string)) (pair (key) (string)) (pair (key) (string)) (pair (key) (string)) (pair (key) (string))) ================================================================================ INVALID - keys - empty bare key ================================================================================ = "no key name" # INVALID "" = "blank" # VALID but discouraged '' = 'blank' # VALID but discouraged -------------------------------------------------------------------------------- (document (pair (key (MISSING _bare_key)) (string) (comment)) (pair (key) (string) (comment)) (pair (key) (string) (comment))) ================================================================================ VALID - keys - dotted keys ================================================================================ name = "Orange" physical.color = "orange" physical.shape = "round" site."google.com" = true -------------------------------------------------------------------------------- (document (pair (key) (string)) (pair (dotted_key (key) (key)) (string)) (pair (dotted_key (key) (key)) (string)) (pair (dotted_key (key) (key)) (boolean))) ================================================================================ VALID - keys - duplicate keys (semantically INVALID) ================================================================================ # DO NOT DO THIS name = "Tom" name = "Pradyun" -------------------------------------------------------------------------------- (document (comment) (pair (key) (string)) (pair (key) (string))) ================================================================================ VALID - keys - directly defined nested keys ================================================================================ # This makes the key "fruit" into a table. fruit.apple.smooth = true # So then you can add to the table "fruit" like so: fruit.orange = 2 -------------------------------------------------------------------------------- (document (comment) (pair (dotted_key (dotted_key (key) (key)) (key)) (boolean)) (comment) (pair (dotted_key (key) (key)) (integer))) ================================================================================ VALID - keys - overlapped keys (semantically INVALID) ================================================================================ # THE FOLLOWING IS INVALID # This defines the value of fruit.apple to be an integer. fruit.apple = 1 # But then this treats fruit.apple like it's a table. # You can't turn an integer into a table. fruit.apple.smooth = true -------------------------------------------------------------------------------- (document (comment) (comment) (pair (dotted_key (key) (key)) (integer)) (comment) (comment) (pair (dotted_key (dotted_key (key) (key)) (key)) (boolean))) ================================================================================ VALID - keys - order ================================================================================ # VALID BUT DISCOURAGED apple.type = "fruit" orange.type = "fruit" apple.skin = "thin" orange.skin = "thick" apple.color = "red" orange.color = "orange" # RECOMMENDED apple.type = "fruit" apple.skin = "thin" apple.color = "red" orange.type = "fruit" orange.skin = "thick" orange.color = "orange" -------------------------------------------------------------------------------- (document (comment) (pair (dotted_key (key) (key)) (string)) (pair (dotted_key (key) (key)) (string)) (pair (dotted_key (key) (key)) (string)) (pair (dotted_key (key) (key)) (string)) (pair (dotted_key (key) (key)) (string)) (pair (dotted_key (key) (key)) (string)) (comment) (pair (dotted_key (key) (key)) (string)) (pair (dotted_key (key) (key)) (string)) (pair (dotted_key (key) (key)) (string)) (pair (dotted_key (key) (key)) (string)) (pair (dotted_key (key) (key)) (string)) (pair (dotted_key (key) (key)) (string))) ================================================================================ VALID - string - basic strings ================================================================================ str = "I'm a string. \"You can quote me\". Name\tJos\u00E9\nLocation\tSF." -------------------------------------------------------------------------------- (document (pair (key) (string (escape_sequence) (escape_sequence) (escape_sequence) (escape_sequence) (escape_sequence) (escape_sequence)))) ================================================================================ VALID - string - multi-line basic strings ================================================================================ str1 = """ Roses are red Violets are blue""" -------------------------------------------------------------------------------- (document (pair (key) (string))) ================================================================================ VALID - string - multi-line basic strings with trailing backslashes ================================================================================ # The following strings are byte-for-byte equivalent: str1 = "The quick brown fox jumps over the lazy dog." str2 = """ The quick brown \ fox jumps over \ the lazy dog.""" str3 = """\ The quick brown \ fox jumps over \ the lazy dog.\ """ -------------------------------------------------------------------------------- (document (comment) (pair (key) (string)) (pair (key) (string (escape_sequence) (escape_sequence))) (pair (key) (string (escape_sequence) (escape_sequence) (escape_sequence) (escape_sequence)))) ================================================================================ VALID - string - multi-line basic strings with double quotes ================================================================================ str4 = """Here are two quotation marks: "". Simple enough.""" # str5 = """Here are three quotation marks: """.""" # INVALID str5 = """Here are three quotation marks: ""\".""" str6 = """Here are fifteen quotation marks: ""\"""\"""\"""\"""\".""" # "This," she said, "is just a pointless statement." str7 = """"This," she said, "is just a pointless statement."""" -------------------------------------------------------------------------------- (document (pair (key) (string)) (comment) (pair (key) (string (escape_sequence))) (pair (key) (string (escape_sequence) (escape_sequence) (escape_sequence) (escape_sequence) (escape_sequence))) (comment) (pair (key) (string))) ================================================================================ VALID - string - literal strings ================================================================================ # What you see is what you get. winpath = 'C:\Users\nodejs\templates' winpath2 = '\\ServerX\admin$\system32\' quoted = 'Tom "Dubs" Preston-Werner' regex = '<\i\c*\s*>' -------------------------------------------------------------------------------- (document (comment) (pair (key) (string)) (pair (key) (string)) (pair (key) (string)) (pair (key) (string))) ================================================================================ VALID - string - multi-line literal strings ================================================================================ regex2 = '''I [dw]on't need \d{2} apples''' lines = ''' The first newline is trimmed in raw strings. All other whitespace is preserved. ''' -------------------------------------------------------------------------------- (document (pair (key) (string)) (pair (key) (string))) ================================================================================ VALID - string - multi-line literal strings with single quotes ================================================================================ quot15 = '''Here are fifteen quotation marks: """""""""""""""''' # apos15 = '''Here are fifteen apostrophes: '''''''''''''''''' # INVALID apos15 = "Here are fifteen apostrophes: '''''''''''''''" # 'That's still pointless', she said. str = ''''That's still pointless', she said.''' -------------------------------------------------------------------------------- (document (pair (key) (string)) (comment) (pair (key) (string)) (comment) (pair (key) (string))) ================================================================================ VALID - integer - signed/unsigned decimal integer ================================================================================ int1 = +99 int2 = 42 int3 = 0 int4 = -17 -------------------------------------------------------------------------------- (document (pair (key) (integer)) (pair (key) (integer)) (pair (key) (integer)) (pair (key) (integer))) ================================================================================ VALID - integer - decimal integer with underscores ================================================================================ int5 = 1_000 int6 = 5_349_221 int7 = 1_2_3_4_5 # VALID but discouraged -------------------------------------------------------------------------------- (document (pair (key) (integer)) (pair (key) (integer)) (pair (key) (integer) (comment))) ================================================================================ VALID - integer - hexadecimal/octal/binary integer ================================================================================ # hexadecimal with prefix `0x` hex1 = 0xDEADBEEF hex2 = 0xdeadbeef hex3 = 0xdead_beef # octal with prefix `0o` oct1 = 0o01234567 oct2 = 0o755 # useful for Unix file permissions # binary with prefix `0b` bin1 = 0b11010110 -------------------------------------------------------------------------------- (document (comment) (pair (key) (integer)) (pair (key) (integer)) (pair (key) (integer)) (comment) (pair (key) (integer)) (pair (key) (integer) (comment)) (comment) (pair (key) (integer))) ================================================================================ VALID - float - float with fractional or exponent or both ================================================================================ # fractional flt1 = +1.0 flt2 = 3.1415 flt3 = -0.01 # exponent flt4 = 5e+22 flt5 = 1e06 flt6 = -2E-2 # both flt7 = 6.626e-34 -------------------------------------------------------------------------------- (document (comment) (pair (key) (float)) (pair (key) (float)) (pair (key) (float)) (comment) (pair (key) (float)) (pair (key) (float)) (pair (key) (float)) (comment) (pair (key) (float))) ================================================================================ VALID - float - float with underscores ================================================================================ flt8 = 224_617.445_991_228 -------------------------------------------------------------------------------- (document (pair (key) (float))) ================================================================================ VALID - float - special float values ================================================================================ # infinity sf1 = inf # positive infinity sf2 = +inf # positive infinity sf3 = -inf # negative infinity # not a number sf4 = nan # actual sNaN/qNaN encoding is implementation specific sf5 = +nan # same as `nan` sf6 = -nan # valid, actual encoding is implementation specific -------------------------------------------------------------------------------- (document (comment) (pair (key) (float) (comment)) (pair (key) (float) (comment)) (pair (key) (float) (comment)) (comment) (pair (key) (float) (comment)) (pair (key) (float) (comment)) (pair (key) (float) (comment))) ================================================================================ VALID - boolean - basic ================================================================================ bool1 = true bool2 = false -------------------------------------------------------------------------------- (document (pair (key) (boolean)) (pair (key) (boolean))) ================================================================================ VALID - offset date time - basic ================================================================================ odt1 = 1979-05-27T07:32:00Z odt2 = 1979-05-27T00:32:00-07:00 odt3 = 1979-05-27T00:32:00.999999-07:00 -------------------------------------------------------------------------------- (document (pair (key) (offset_date_time)) (pair (key) (offset_date_time)) (pair (key) (offset_date_time))) ================================================================================ VALID - offset date time - whitespace as delimiter ================================================================================ odt4 = 1979-05-27 07:32:00Z -------------------------------------------------------------------------------- (document (pair (key) (offset_date_time))) ================================================================================ VALID - local date time - basic ================================================================================ ldt1 = 1979-05-27T07:32:00 ldt2 = 1979-05-27T00:32:00.999999 -------------------------------------------------------------------------------- (document (pair (key) (local_date_time)) (pair (key) (local_date_time))) ================================================================================ VALID - local date - basic ================================================================================ ld1 = 1979-05-27 -------------------------------------------------------------------------------- (document (pair (key) (local_date))) ================================================================================ VALID - local time - basic ================================================================================ lt1 = 07:32:00 lt2 = 00:32:00.999999 -------------------------------------------------------------------------------- (document (pair (key) (local_time)) (pair (key) (local_time))) ================================================================================ VALID - array - basic ================================================================================ integers = [ 1, 2, 3 ] colors = [ "red", "yellow", "green" ] nested_array_of_int = [ [ 1, 2 ], [3, 4, 5] ] nested_mixed_array = [ [ 1, 2 ], ["a", "b", "c"] ] string_array = [ "all", 'strings', """are the same""", '''type''' ] # Mixed-type arrays are allowed numbers = [ 0.1, 0.2, 0.5, 1, 2, 5 ] contributors = [ "Foo Bar ", { name = "Baz Qux", email = "bazqux@example.com", url = "https://example.com/bazqux" } ] -------------------------------------------------------------------------------- (document (pair (key) (array (integer) (integer) (integer))) (pair (key) (array (string) (string) (string))) (pair (key) (array (array (integer) (integer)) (array (integer) (integer) (integer)))) (pair (key) (array (array (integer) (integer)) (array (string) (string) (string)))) (pair (key) (array (string) (string) (string) (string))) (comment) (pair (key) (array (float) (float) (float) (integer) (integer) (integer))) (pair (key) (array (string) (inline_table (pair (key) (string)) (pair (key) (string)) (pair (key) (string)))))) ================================================================================ VALID - array - allow newlines ================================================================================ integers2 = [ 1, 2, 3 ] integers3 = [ 1, 2, # this is ok ] -------------------------------------------------------------------------------- (document (pair (key) (array (integer) (integer) (integer))) (pair (key) (array (integer) (integer) (comment)))) ================================================================================ VALID - table - header ================================================================================ [table] -------------------------------------------------------------------------------- (document (table (key))) ================================================================================ VALID - table - basic ================================================================================ [table-1] key1 = "some string" key2 = 123 [table-2] key1 = "another string" key2 = 456 -------------------------------------------------------------------------------- (document (table (key) (pair (key) (string)) (pair (key) (integer))) (table (key) (pair (key) (string)) (pair (key) (integer)))) ================================================================================ VALID - table - header with dotted key ================================================================================ [dog."tater.man"] type.name = "pug" -------------------------------------------------------------------------------- (document (table (dotted_key (key) (key)) (pair (dotted_key (key) (key)) (string)))) ================================================================================ VALID - table- header with whitespaces ================================================================================ [a.b.c] # this is best practice [ d.e.f ] # same as [d.e.f] [ g . h . i ] # same as [g.h.i] [ j . "ʞ" . 'l' ] # same as [j."ʞ".'l'] -------------------------------------------------------------------------------- (document (table (dotted_key (dotted_key (key) (key)) (key)) (comment)) (table (dotted_key (dotted_key (key) (key)) (key)) (comment)) (table (dotted_key (dotted_key (key) (key)) (key)) (comment)) (table (dotted_key (dotted_key (key) (key)) (key)) (comment))) ================================================================================ VALID - table - directly defined nested header key ================================================================================ # [x] you # [x.y] don't # [x.y.z] need these [x.y.z.w] # for this to work [x] # defining a super-table afterwards is ok -------------------------------------------------------------------------------- (document (comment) (comment) (comment) (table (dotted_key (dotted_key (dotted_key (key) (key)) (key)) (key)) (comment)) (table (key) (comment))) ================================================================================ VALID - table - duplicate header key (semantically INVALID) ================================================================================ # DO NOT DO THIS [fruit] apple = "red" [fruit] orange = "orange" -------------------------------------------------------------------------------- (document (comment) (table (key) (pair (key) (string))) (table (key) (pair (key) (string)))) ================================================================================ VALID - table - overlapped header key (semantically INVALID) ================================================================================ # DO NOT DO THIS EITHER [fruit] apple = "red" [fruit.apple] texture = "smooth" -------------------------------------------------------------------------------- (document (comment) (table (key) (pair (key) (string))) (table (dotted_key (key) (key)) (pair (key) (string)))) ================================================================================ VALID - table - order ================================================================================ # VALID BUT DISCOURAGED [fruit.apple] [animal] [fruit.orange] # RECOMMENDED [fruit.apple] [fruit.orange] [animal] -------------------------------------------------------------------------------- (document (comment) (table (dotted_key (key) (key))) (table (key)) (table (dotted_key (key) (key)) (comment)) (table (dotted_key (key) (key))) (table (dotted_key (key) (key))) (table (key))) ================================================================================ VALID - table - sub-table ================================================================================ [fruit] apple.color = "red" apple.taste.sweet = true # [fruit.apple] # INVALID # [fruit.apple.taste] # INVALID [fruit.apple.texture] # you can add sub-tables smooth = true -------------------------------------------------------------------------------- (document (table (key) (pair (dotted_key (key) (key)) (string)) (pair (dotted_key (dotted_key (key) (key)) (key)) (boolean)) (comment) (comment)) (table (dotted_key (dotted_key (key) (key)) (key)) (comment) (pair (key) (boolean)))) ================================================================================ VALID - inline table - basic ================================================================================ name = { first = "Tom", last = "Preston-Werner" } point = { x = 1, y = 2 } animal = { type.name = "pug" } -------------------------------------------------------------------------------- (document (pair (key) (inline_table (pair (key) (string)) (pair (key) (string)))) (pair (key) (inline_table (pair (key) (integer)) (pair (key) (integer)))) (pair (key) (inline_table (pair (dotted_key (key) (key)) (string))))) ================================================================================ VALID - inline table - overlapped key (semantically INVALID) ================================================================================ [product] type = { name = "Nail" } # type.edible = false # INVALID [product] type.name = "Nail" # type = { edible = false } # INVALID -------------------------------------------------------------------------------- (document (table (key) (pair (key) (inline_table (pair (key) (string)))) (comment)) (table (key) (pair (dotted_key (key) (key)) (string)) (comment))) ================================================================================ VALID - array of tables - basic ================================================================================ [[products]] name = "Hammer" sku = 738594937 [[products]] [[products]] name = "Nail" sku = 284758393 color = "gray" -------------------------------------------------------------------------------- (document (table_array_element (key) (pair (key) (string)) (pair (key) (integer))) (table_array_element (key)) (table_array_element (key) (pair (key) (string)) (pair (key) (integer)) (pair (key) (string)))) ================================================================================ VALID - array of tables - nested arrays of tables ================================================================================ [[fruit]] name = "apple" [fruit.physical] # subtable color = "red" shape = "round" [[fruit.variety]] # nested array of tables name = "red delicious" [[fruit.variety]] name = "granny smith" [[fruit]] name = "banana" [[fruit.variety]] name = "plantain" -------------------------------------------------------------------------------- (document (table_array_element (key) (pair (key) (string))) (table (dotted_key (key) (key)) (comment) (pair (key) (string)) (pair (key) (string))) (table_array_element (dotted_key (key) (key)) (comment) (pair (key) (string))) (table_array_element (dotted_key (key) (key)) (pair (key) (string))) (table_array_element (key) (pair (key) (string))) (table_array_element (dotted_key (key) (key)) (pair (key) (string)))) ================================================================================ VALID - array of tables - append to array in undefined table (semantically INVALID) ================================================================================ # INVALID TOML DOC [fruit.physical] # subtable, but to which parent element should it belong? color = "red" shape = "round" [[fruit]] # parser must throw an error upon discovering that "fruit" is # an array rather than a table name = "apple" -------------------------------------------------------------------------------- (document (comment) (table (dotted_key (key) (key)) (comment) (pair (key) (string)) (pair (key) (string))) (table_array_element (key) (comment) (comment) (pair (key) (string)))) ================================================================================ VALID - array of tables - append to statically defined array (semantically INVALID) ================================================================================ # INVALID TOML DOC fruit = [] [[fruit]] # Not allowed -------------------------------------------------------------------------------- (document (comment) (pair (key) (array)) (table_array_element (key) (comment))) ================================================================================ VALID - array of tables - append to table (semantically INVALID) ================================================================================ # INVALID TOML DOC [[fruit]] name = "apple" [[fruit.variety]] name = "red delicious" # INVALID: This table conflicts with the previous array of tables [fruit.variety] name = "granny smith" [fruit.physical] color = "red" shape = "round" # INVALID: This array of tables conflicts with the previous table [[fruit.physical]] color = "green" -------------------------------------------------------------------------------- (document (comment) (table_array_element (key) (pair (key) (string))) (table_array_element (dotted_key (key) (key)) (pair (key) (string)) (comment)) (table (dotted_key (key) (key)) (pair (key) (string))) (table (dotted_key (key) (key)) (pair (key) (string)) (pair (key) (string)) (comment)) (table_array_element (dotted_key (key) (key)) (pair (key) (string))))