anchor.diff:      {ok, [{field11, a}], []} = parse_config([{field11, a}], Spec),
       {ok, [{field11, <<"b">>}], []} = parse_config([{field11, b}], Spec),
   
  -    {error, {invalid_key, field12}} = parse_config([{field12, a}], Spec),
  -    {error, {unknown_atom, 1}} = parse_config([{field12, [{field12_a, 1}]}], Spec),
  +    {error, {syntax_error, <<"field12">>}} = parse_config([{field12, a}], Spec),
  +    {error, {syntax_error, <<"field12.field12_a">>}} = 
  +        parse_config([{field12, [{field12_a, 1}]}], Spec),
  +    {error, {syntax_error, <<"mypath.field12.field12_a">>}} = 
  +        parse_config([{field12, [{field12_a, 1}]}], Spec, #{path=><<"mypath">>}),
  +
       % Field 12c is ignored
       {ok, [{field12, [{field12_a, ok},{field12_b, 1}]}],[]} = Sub1 = 
           parse_config(
  
positive.code:     {integer, [integer()]} | {record, atom()} |
      string | binary | lower | upper |
      ip | host | host6 | {function, pos_integer()} |
      unquote | path | uris | tokens | map() | list() |
      fun((atom(), term(), [{atom(), term()}]) -> 
              ok | {ok, term()} | {ok, term(), term()} |
              {new_ok, [{atom(), term()}]} | error | {error, term()}).
  
  -type syntax_opt() ::
      syntax_subopt() | {list|slist|ulist, syntax_subopt()} | 
  
negative.code: parse_config([], _Syntax, _) ->
      {ok, [], []};
  
  parse_config(Terms, Syntax, Opts) when is_list(Terms), is_map(Opts) ->
      try
          parse_config(Terms, [], [], Syntax, Opts)
      catch
          throw:Throw ->
              {error, Throw}
      end;
  
  parse_config(Terms, Syntax, Opts) when is_map(Terms), is_map(Opts) ->
      case maps:size(Terms) of
          0 -> parse_config([], Syntax, Opts);
          _ -> parse_config(maps:to_list(Terms), Syntax, Opts)
  