token Dot='.' Eq='=' LBrak='[' RBrak=']' Comma=',' LBrace='{' RBrace='}'; token True='true' False='false'; token BasicString='' LiteralString='' MlBasicString='' MlLiteralString='' Integer='' Float='' OffsetDateTime='' LocalDateTime='' LocalDate='' LocalTime='' UnquotedKey=''; token Newline Whitespace Comment; skip Whitespace Comment; start toml; toml: [expression] (Newline [expression])*; expression^: keyval | table; keyval: key '=' val; table^: ?1 std_table | array_table; std_table: '[' header_key ']'; array_table: '[' '[' header_key !1 ']' ']'; header_key: simple_key ('.' simple_key)* @key; // extra rule for better error messages key: simple_key ('.' simple_key)*; simple_key: BasicString | LiteralString | UnquotedKey; val^: string | boolean | array | inline_table | date_time | float | integer ; string: MlBasicString | BasicString | MlLiteralString | LiteralString; boolean: 'true' | 'false'; array: '[' [?1 Newline* val (?2 Newline* ',' Newline* val)* [?3 Newline* ',']] Newline* ']'; inline_table: '{' [keyval (',' keyval)*] '}'; date_time: OffsetDateTime | LocalDateTime | LocalDate | LocalTime; integer: Integer; float: Float;