diff --git a/toml/acceptor.hpp b/toml/acceptor.hpp index 4a152df..0c6037a 100644 --- a/toml/acceptor.hpp +++ b/toml/acceptor.hpp @@ -520,9 +520,9 @@ using is_fundamental_type = is_basic_multiline_string, is_literal_inline_string, is_literal_multiline_string, - is_integer, - is_float, is_boolean, + is_float, + is_integer, is_offset_date_time, is_local_date_time, is_local_date, @@ -608,6 +608,7 @@ struct is_inline_table { typedef is_one_of, is_array, is_inline_table> is_component; + typedef is_chain_of< is_any_num_of_ws, is_key, @@ -632,13 +633,13 @@ struct is_inline_table > >, is_ignorable< - is_chain_of< - is_any_num_of_ws, - is_inline_key_value_pair, - is_any_num_of_ws, - is_ignorable> - > - >, + is_chain_of< + is_any_num_of_ws, + is_inline_key_value_pair, + is_any_num_of_ws, + is_ignorable> + > + >, is_any_num_of_ws, is_charactor > entity; @@ -657,18 +658,18 @@ using is_table_definition = is_any_num_of_ws, is_charactor, is_any_num_of_ws, + is_key, is_ignorable< is_repeat_of< is_chain_of< - is_any_num_of_ws, - is_key, is_any_num_of_ws, is_charactor, + is_any_num_of_ws, + is_key, is_any_num_of_ws >, repeat_infinite()> >, - is_key, is_charactor >; @@ -677,18 +678,19 @@ using is_array_of_table_definition = is_chain_of< is_any_num_of_ws, is_repeat_of, 2>, + is_any_num_of_ws, + is_key, is_ignorable< is_repeat_of< is_chain_of< - is_any_num_of_ws, - is_key, is_any_num_of_ws, is_charactor, + is_any_num_of_ws, + is_key, is_any_num_of_ws >, repeat_infinite()> >, - is_key, is_repeat_of, 2> >; diff --git a/toml/parser.hpp b/toml/parser.hpp index 858465d..be612e7 100644 --- a/toml/parser.hpp +++ b/toml/parser.hpp @@ -505,8 +505,9 @@ struct parse_fixed_type_array static result_type invoke(Iterator iter, Iterator end) { result_type result; + --end; assert(*iter == '[' && *end == ']'); - ++iter; --end; + ++iter; iter = skippable::invoke(iter); while(iter != end) { @@ -565,6 +566,9 @@ struct parse_array return parse_fixed_type_array, parse_inline_table>::invoke(iter, end); + if(is_skippable_in_array::invoke(init) == std::prev(end)) + return result_type{}; // empty + throw internal_error("no valid array here"); } }; @@ -582,10 +586,10 @@ struct parse_value { if(iter != is_string::invoke(iter)) return result_type(parse_string::invoke(iter, end)); - else if(iter != is_integer::invoke(iter)) - return result_type(parse_integer::invoke(iter, end)); else if(iter != is_float::invoke(iter)) return result_type(parse_float::invoke(iter, end)); + else if(iter != is_integer::invoke(iter)) + return result_type(parse_integer::invoke(iter, end)); else if(iter != is_boolean::invoke(iter)) return result_type(parse_boolean::invoke(iter, end)); else if(iter != is_datetime::invoke(iter)) @@ -642,6 +646,7 @@ struct parse_key_value_pair { typedef charT value_type; typedef std::pair result_type; + template::value_type, value_type>::value>::type>