================================================================================ VALID - comment - basic ================================================================================ # This is a full-line comment key = "value" # This is a comment at the end of a line -------------------------------------------------------------------------------- (document (comment) (pair (bare_key) (string) (comment))) ================================================================================ VALID - key/value pair - basic ================================================================================ key = "value" -------------------------------------------------------------------------------- (document (pair (bare_key) (string))) ================================================================================ INVALID - key/value pair - empty value ================================================================================ key = # INVALID -------------------------------------------------------------------------------- (document (ERROR (bare_key) (comment))) ================================================================================ INVALID - key/value pair - no newline between pairs ================================================================================ first = "Tom" last = "Preston-Werner" # INVALID -------------------------------------------------------------------------------- (document (pair (bare_key) (string) (MISSING _line_ending_or_eof)) (pair (bare_key) (string) (comment))) ================================================================================ VALID - keys - bare keys ================================================================================ key = "value" bare_key = "value" bare-key = "value" 1234 = "value" -------------------------------------------------------------------------------- (document (pair (bare_key) (string)) (pair (bare_key) (string)) (pair (bare_key) (string)) (pair (bare_key) (string))) ================================================================================ VALID - keys - quoted keys ================================================================================ "127.0.0.1" = "value" "character encoding" = "value" "ʎǝʞ" = "value" 'key2' = "value" 'quoted "value"' = "value" -------------------------------------------------------------------------------- (document (pair (quoted_key) (string)) (pair (quoted_key) (string)) (pair (quoted_key) (string)) (pair (quoted_key) (string)) (pair (quoted_key) (string))) ================================================================================ INVALID - keys - empty bare key ================================================================================ = "no key name" # INVALID "" = "blank" # VALID but discouraged '' = 'blank' # VALID but discouraged -------------------------------------------------------------------------------- (document (ERROR) (pair (quoted_key) (comment) (ERROR) (string) (comment)) (pair (quoted_key) (string) (comment))) ================================================================================ VALID - keys - dotted keys ================================================================================ name = "Orange" physical.color = "orange" physical.shape = "round" site."google.com" = true -------------------------------------------------------------------------------- (document (pair (bare_key) (string)) (pair (dotted_key (bare_key) (bare_key)) (string)) (pair (dotted_key (bare_key) (bare_key)) (string)) (pair (dotted_key (bare_key) (quoted_key)) (boolean))) ================================================================================ VALID - keys - duplicate keys (semantically INVALID) ================================================================================ # DO NOT DO THIS name = "Tom" name = "Pradyun" -------------------------------------------------------------------------------- (document (comment) (pair (bare_key) (string)) (pair (bare_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 (bare_key) (bare_key)) (bare_key)) (boolean)) (comment) (pair (dotted_key (bare_key) (bare_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 (bare_key) (bare_key)) (integer)) (comment) (comment) (pair (dotted_key (dotted_key (bare_key) (bare_key)) (bare_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 (bare_key) (bare_key)) (string)) (pair (dotted_key (bare_key) (bare_key)) (string)) (pair (dotted_key (bare_key) (bare_key)) (string)) (pair (dotted_key (bare_key) (bare_key)) (string)) (pair (dotted_key (bare_key) (bare_key)) (string)) (pair (dotted_key (bare_key) (bare_key)) (string)) (comment) (pair (dotted_key (bare_key) (bare_key)) (string)) (pair (dotted_key (bare_key) (bare_key)) (string)) (pair (dotted_key (bare_key) (bare_key)) (string)) (pair (dotted_key (bare_key) (bare_key)) (string)) (pair (dotted_key (bare_key) (bare_key)) (string)) (pair (dotted_key (bare_key) (bare_key)) (string))) ================================================================================ VALID - string - basic strings ================================================================================ str = "I'm a string. \"You can quote me\". Name\tJos\u00E9\nLocation\tSF." -------------------------------------------------------------------------------- (document (pair (bare_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 (bare_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 (bare_key) (string)) (pair (bare_key) (string (escape_sequence) (escape_sequence))) (pair (bare_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 (bare_key) (string)) (comment) (pair (bare_key) (string (escape_sequence))) (pair (bare_key) (string (escape_sequence) (escape_sequence) (escape_sequence) (escape_sequence) (escape_sequence))) (comment) (pair (bare_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 (bare_key) (string)) (pair (bare_key) (string)) (pair (bare_key) (string)) (pair (bare_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 (bare_key) (string)) (pair (bare_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 (bare_key) (string)) (comment) (pair (bare_key) (string)) (comment) (pair (bare_key) (string))) ================================================================================ VALID - integer - signed/unsigned decimal integer ================================================================================ int1 = +99 int2 = 42 int3 = 0 int4 = -17 -------------------------------------------------------------------------------- (document (pair (bare_key) (integer)) (pair (bare_key) (integer)) (pair (bare_key) (integer)) (pair (bare_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 (bare_key) (integer)) (pair (bare_key) (integer)) (pair (bare_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 (bare_key) (integer)) (pair (bare_key) (integer)) (pair (bare_key) (integer)) (comment) (pair (bare_key) (integer)) (pair (bare_key) (integer) (comment)) (comment) (pair (bare_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 (bare_key) (float)) (pair (bare_key) (float)) (pair (bare_key) (float)) (comment) (pair (bare_key) (float)) (pair (bare_key) (float)) (pair (bare_key) (float)) (comment) (pair (bare_key) (float))) ================================================================================ VALID - float - float with underscores ================================================================================ flt8 = 224_617.445_991_228 -------------------------------------------------------------------------------- (document (pair (bare_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 (bare_key) (float) (comment)) (pair (bare_key) (float) (comment)) (pair (bare_key) (float) (comment)) (comment) (pair (bare_key) (float) (comment)) (pair (bare_key) (float) (comment)) (pair (bare_key) (float) (comment))) ================================================================================ VALID - boolean - basic ================================================================================ bool1 = true bool2 = false -------------------------------------------------------------------------------- (document (pair (bare_key) (boolean)) (pair (bare_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 (bare_key) (offset_date_time)) (pair (bare_key) (offset_date_time)) (pair (bare_key) (offset_date_time))) ================================================================================ VALID - offset date time - whitespace as delimiter ================================================================================ odt4 = 1979-05-27 07:32:00Z -------------------------------------------------------------------------------- (document (pair (bare_key) (offset_date_time))) ================================================================================ VALID - local date time - basic ================================================================================ ldt1 = 1979-05-27T07:32:00 ldt2 = 1979-05-27T00:32:00.999999 -------------------------------------------------------------------------------- (document (pair (bare_key) (local_date_time)) (pair (bare_key) (local_date_time))) ================================================================================ VALID - local date - basic ================================================================================ ld1 = 1979-05-27 -------------------------------------------------------------------------------- (document (pair (bare_key) (local_date))) ================================================================================ VALID - local time - basic ================================================================================ lt1 = 07:32:00 lt2 = 00:32:00.999999 -------------------------------------------------------------------------------- (document (pair (bare_key) (local_time)) (pair (bare_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 (bare_key) (array (integer) (integer) (integer))) (pair (bare_key) (array (string) (string) (string))) (pair (bare_key) (array (array (integer) (integer)) (array (integer) (integer) (integer)))) (pair (bare_key) (array (array (integer) (integer)) (array (string) (string) (string)))) (pair (bare_key) (array (string) (string) (string) (string))) (comment) (pair (bare_key) (array (float) (float) (float) (integer) (integer) (integer))) (pair (bare_key) (array (string) (inline_table (pair (bare_key) (string)) (pair (bare_key) (string)) (pair (bare_key) (string)))))) ================================================================================ VALID - array - allow newlines ================================================================================ integers2 = [ 1, 2, 3 ] integers3 = [ 1, 2, # this is ok ] -------------------------------------------------------------------------------- (document (pair (bare_key) (array (integer) (integer) (integer))) (pair (bare_key) (array (integer) (integer) (comment)))) ================================================================================ VALID - table - header ================================================================================ [table] -------------------------------------------------------------------------------- (document (table (bare_key))) ================================================================================ VALID - table - basic ================================================================================ [table-1] key1 = "some string" key2 = 123 [table-2] key1 = "another string" key2 = 456 -------------------------------------------------------------------------------- (document (table (bare_key) (pair (bare_key) (string)) (pair (bare_key) (integer))) (table (bare_key) (pair (bare_key) (string)) (pair (bare_key) (integer)))) ================================================================================ VALID - table - header with dotted key ================================================================================ [dog."tater.man"] type.name = "pug" -------------------------------------------------------------------------------- (document (table (dotted_key (bare_key) (quoted_key)) (pair (dotted_key (bare_key) (bare_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 (bare_key) (bare_key)) (bare_key)) (comment)) (table (dotted_key (dotted_key (bare_key) (bare_key)) (bare_key)) (comment)) (table (dotted_key (dotted_key (bare_key) (bare_key)) (bare_key)) (comment)) (table (dotted_key (dotted_key (bare_key) (quoted_key)) (quoted_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 (bare_key) (bare_key)) (bare_key)) (bare_key)) (comment)) (table (bare_key) (comment))) ================================================================================ VALID - table - duplicate header key (semantically INVALID) ================================================================================ # DO NOT DO THIS [fruit] apple = "red" [fruit] orange = "orange" -------------------------------------------------------------------------------- (document (comment) (table (bare_key) (pair (bare_key) (string))) (table (bare_key) (pair (bare_key) (string)))) ================================================================================ VALID - table - overlapped header key (semantically INVALID) ================================================================================ # DO NOT DO THIS EITHER [fruit] apple = "red" [fruit.apple] texture = "smooth" -------------------------------------------------------------------------------- (document (comment) (table (bare_key) (pair (bare_key) (string))) (table (dotted_key (bare_key) (bare_key)) (pair (bare_key) (string)))) ================================================================================ VALID - table - order ================================================================================ # VALID BUT DISCOURAGED [fruit.apple] [animal] [fruit.orange] # RECOMMENDED [fruit.apple] [fruit.orange] [animal] -------------------------------------------------------------------------------- (document (comment) (table (dotted_key (bare_key) (bare_key))) (table (bare_key)) (table (dotted_key (bare_key) (bare_key)) (comment)) (table (dotted_key (bare_key) (bare_key))) (table (dotted_key (bare_key) (bare_key))) (table (bare_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 (bare_key) (pair (dotted_key (bare_key) (bare_key)) (string)) (pair (dotted_key (dotted_key (bare_key) (bare_key)) (bare_key)) (boolean)) (comment) (comment)) (table (dotted_key (dotted_key (bare_key) (bare_key)) (bare_key)) (comment) (pair (bare_key) (boolean)))) ================================================================================ VALID - inline table - basic ================================================================================ name = { first = "Tom", last = "Preston-Werner" } point = { x = 1, y = 2 } animal = { type.name = "pug" } -------------------------------------------------------------------------------- (document (pair (bare_key) (inline_table (pair (bare_key) (string)) (pair (bare_key) (string)))) (pair (bare_key) (inline_table (pair (bare_key) (integer)) (pair (bare_key) (integer)))) (pair (bare_key) (inline_table (pair (dotted_key (bare_key) (bare_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 (bare_key) (pair (bare_key) (inline_table (pair (bare_key) (string)))) (comment)) (table (bare_key) (pair (dotted_key (bare_key) (bare_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 (bare_key) (pair (bare_key) (string)) (pair (bare_key) (integer))) (table_array_element (bare_key)) (table_array_element (bare_key) (pair (bare_key) (string)) (pair (bare_key) (integer)) (pair (bare_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 (bare_key) (pair (bare_key) (string))) (table (dotted_key (bare_key) (bare_key)) (comment) (pair (bare_key) (string)) (pair (bare_key) (string))) (table_array_element (dotted_key (bare_key) (bare_key)) (comment) (pair (bare_key) (string))) (table_array_element (dotted_key (bare_key) (bare_key)) (pair (bare_key) (string))) (table_array_element (bare_key) (pair (bare_key) (string))) (table_array_element (dotted_key (bare_key) (bare_key)) (pair (bare_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 (bare_key) (bare_key)) (comment) (pair (bare_key) (string)) (pair (bare_key) (string))) (table_array_element (bare_key) (comment) (comment) (pair (bare_key) (string)))) ================================================================================ VALID - array of tables - append to statically defined array (semantically INVALID) ================================================================================ # INVALID TOML DOC fruit = [] [[fruit]] # Not allowed -------------------------------------------------------------------------------- (document (comment) (pair (bare_key) (array)) (table_array_element (bare_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 (bare_key) (pair (bare_key) (string))) (table_array_element (dotted_key (bare_key) (bare_key)) (pair (bare_key) (string)) (comment)) (table (dotted_key (bare_key) (bare_key)) (pair (bare_key) (string))) (table (dotted_key (bare_key) (bare_key)) (pair (bare_key) (string)) (pair (bare_key) (string)) (comment)) (table_array_element (dotted_key (bare_key) (bare_key)) (pair (bare_key) (string))))