added option for explicit termination requirement when parsing streams
This commit is contained in:
parent
3b3e33c6e3
commit
6515f9981d
11 changed files with 59 additions and 2232 deletions
|
@ -38,7 +38,10 @@ start(<<S/utf8, Rest/binary>>, Stack, Callbacks, Opts) when ?is_whitespace(S) ->
|
|||
start(<<>>, Stack, Callbacks, Opts) ->
|
||||
fun(Stream) -> start(Stream, Stack, Callbacks, Opts) end.
|
||||
|
||||
|
||||
maybe_done(eof, [], Callbacks, Opts) when Opts#opts.explicit_termination == true ->
|
||||
{callback(eof, Callbacks), <<>>};
|
||||
maybe_done(Rest, [], Callbacks, Opts) when Opts#opts.explicit_termination == false ->
|
||||
{callback(eof, Callbacks), Rest};
|
||||
maybe_done(<<?end_object/utf8, Rest/binary>>, [object|Stack], Callbacks, Opts) ->
|
||||
maybe_done(Rest, Stack, callback(end_object, Callbacks), Opts);
|
||||
maybe_done(<<?end_array/utf8, Rest/binary>>, [array|Stack], Callbacks, Opts) ->
|
||||
|
@ -51,8 +54,6 @@ maybe_done(<<?solidus/utf8, Rest/binary>>, Stack, Callbacks, Opts) when Opts#opt
|
|||
maybe_comment(Rest, fun(Resume) -> maybe_done(Resume, Stack, Callbacks, Opts) end);
|
||||
maybe_done(<<S/utf8, Rest/binary>>, Stack, Callbacks, Opts) when ?is_whitespace(S) ->
|
||||
maybe_done(Rest, Stack, Callbacks, Opts);
|
||||
maybe_done(<<>>, [], Callbacks, _Opts) ->
|
||||
callback(eof, Callbacks);
|
||||
maybe_done(<<>>, Stack, Callbacks, Opts) ->
|
||||
fun(Stream) -> maybe_done(Stream, Stack, Callbacks, Opts) end.
|
||||
|
||||
|
@ -236,10 +237,14 @@ zero(<<S/utf8, Rest/binary>>, Stack, Callbacks, Opts, Acc) when ?is_whitespace(S
|
|||
maybe_done(Rest, Stack, callback({number, lists:reverse(Acc)}, Callbacks), Opts);
|
||||
zero(<<?solidus/utf8, Rest/binary>>, Stack, Callbacks, Opts, Acc) when Opts#opts.comments == true ->
|
||||
maybe_comment(Rest, fun(Resume) -> zero(Resume, Stack, Callbacks, Opts, Acc) end);
|
||||
zero(<<>>, [], Callbacks, _Opts, Acc) ->
|
||||
callback(eof, callback({number, lists:reverse(Acc)}, Callbacks));
|
||||
zero(<<>>, Stack, Callbacks, Opts, Acc) ->
|
||||
fun(Stream) -> zero(Stream, Stack, Callbacks, Opts, Acc) end.
|
||||
zero(<<>>, [], Callbacks, Opts, Acc) when Opts#opts.explicit_termination == false ->
|
||||
{callback(eof, callback({number, lists:reverse(Acc)}, Callbacks)), <<>>};
|
||||
zero(<<>>, Stack, Callbacks, Opts, Acc) when Opts#opts.explicit_termination == false ->
|
||||
fun(Stream) -> zero(Stream, Stack, Callbacks, Opts, Acc) end;
|
||||
zero(<<>>, Stack, Callbacks, Opts, Acc) when Opts#opts.explicit_termination == true ->
|
||||
fun(eof) -> {callback(eof, callback({number, lists:reverse(Acc)}, Callbacks)), <<>>}
|
||||
;(Stream) -> zero(Stream, Stack, Callbacks, Opts, Acc)
|
||||
end.
|
||||
|
||||
|
||||
integer(<<?end_object/utf8, Rest/binary>>, [object|Stack], Callbacks, Opts, Acc) ->
|
||||
|
@ -264,10 +269,14 @@ integer(<<S/utf8, Rest/binary>>, Stack, Callbacks, Opts, Acc) when ?is_whitespac
|
|||
maybe_done(Rest, Stack, callback({number, lists:reverse(Acc)}, Callbacks), Opts);
|
||||
integer(<<?solidus/utf8, Rest/binary>>, Stack, Callbacks, Opts, Acc) when Opts#opts.comments == true ->
|
||||
maybe_comment(Rest, fun(Resume) -> integer(Resume, Stack, Callbacks, Opts, Acc) end);
|
||||
integer(<<>>, [], Callbacks, _Opts, Acc) ->
|
||||
callback(eof, callback({number, lists:reverse(Acc)}, Callbacks));
|
||||
integer(<<>>, Stack, Callbacks, Opts, Acc) ->
|
||||
fun(Stream) -> integer(Stream, Stack, Callbacks, Opts, Acc) end.
|
||||
integer(<<>>, [], Callbacks, Opts, Acc) when Opts#opts.explicit_termination == false ->
|
||||
{callback(eof, callback({number, lists:reverse(Acc)}, Callbacks)), <<>>};
|
||||
integer(<<>>, Stack, Callbacks, Opts, Acc) when Opts#opts.explicit_termination == false ->
|
||||
fun(Stream) -> integer(Stream, Stack, Callbacks, Opts, Acc) end;
|
||||
integer(<<>>, Stack, Callbacks, Opts, Acc) when Opts#opts.explicit_termination == true ->
|
||||
fun(eof) -> {callback(eof, callback({number, lists:reverse(Acc)}, Callbacks)), <<>>}
|
||||
;(Stream) -> integer(Stream, Stack, Callbacks, Opts, Acc)
|
||||
end.
|
||||
|
||||
|
||||
fraction(<<?end_object/utf8, Rest/binary>>, [object|Stack], Callbacks, Opts, Acc) ->
|
||||
|
@ -290,10 +299,14 @@ fraction(<<S/utf8, Rest/binary>>, Stack, Callbacks, Opts, Acc) when ?is_whitespa
|
|||
maybe_done(Rest, Stack, callback({number, lists:reverse(Acc)}, Callbacks), Opts);
|
||||
fraction(<<?solidus/utf8, Rest/binary>>, Stack, Callbacks, Opts, Acc) when Opts#opts.comments == true ->
|
||||
maybe_comment(Rest, fun(Resume) -> fraction(Resume, Stack, Callbacks, Opts, Acc) end);
|
||||
fraction(<<>>, [], Callbacks, _Opts, Acc) ->
|
||||
callback(eof, callback({number, lists:reverse(Acc)}, Callbacks));
|
||||
fraction(<<>>, Stack, Callbacks, Opts, Acc) ->
|
||||
fun(Stream) -> fraction(Stream, Stack, Callbacks, Opts, Acc) end.
|
||||
fraction(<<>>, [], Callbacks, Opts, Acc) when Opts#opts.explicit_termination == false ->
|
||||
{callback(eof, callback({number, lists:reverse(Acc)}, Callbacks)), <<>>};
|
||||
fraction(<<>>, Stack, Callbacks, Opts, Acc) when Opts#opts.explicit_termination == false ->
|
||||
fun(Stream) -> fraction(Stream, Stack, Callbacks, Opts, Acc) end;
|
||||
fraction(<<>>, Stack, Callbacks, Opts, Acc) when Opts#opts.explicit_termination == true ->
|
||||
fun(eof) -> {callback(eof, callback({number, lists:reverse(Acc)}, Callbacks)), <<>>}
|
||||
;(Stream) -> fraction(Stream, Stack, Callbacks, Opts, Acc)
|
||||
end.
|
||||
|
||||
|
||||
e(<<S/utf8, Rest/binary>>, Stack, Callbacks, Opts, Acc) when S =:= ?positive; S =:= ?negative ->
|
||||
|
@ -326,10 +339,14 @@ exp(<<S/utf8, Rest/binary>>, Stack, Callbacks, Opts, Acc) when ?is_whitespace(S)
|
|||
maybe_done(Rest, Stack, callback({number, lists:reverse(Acc)}, Callbacks), Opts);
|
||||
exp(<<?rsolidus/utf8, Rest/binary>>, Stack, Callbacks, Opts, Acc) when Opts#opts.comments == true ->
|
||||
maybe_comment(Rest, fun(Resume) -> exp(Resume, Stack, Callbacks, Opts, Acc) end);
|
||||
exp(<<>>, [], Callbacks, _Opts, Acc) ->
|
||||
callback(eof, callback({number, lists:reverse(Acc)}, Callbacks));
|
||||
exp(<<>>, Stack, Callbacks, Opts, Acc) ->
|
||||
fun(Stream) -> exp(Stream, Stack, Callbacks, Opts, Acc) end.
|
||||
exp(<<>>, [], Callbacks, Opts, Acc) when Opts#opts.explicit_termination == false ->
|
||||
{callback(eof, callback({number, lists:reverse(Acc)}, Callbacks)), <<>>};
|
||||
exp(<<>>, Stack, Callbacks, Opts, Acc) when Opts#opts.explicit_termination == false ->
|
||||
fun(Stream) -> exp(Stream, Stack, Callbacks, Opts, Acc) end;
|
||||
exp(<<>>, Stack, Callbacks, Opts, Acc) when Opts#opts.explicit_termination == true ->
|
||||
fun(eof) -> {callback(eof, callback({number, lists:reverse(Acc)}, Callbacks)), <<>>}
|
||||
;(Stream) -> exp(Stream, Stack, Callbacks, Opts, Acc)
|
||||
end.
|
||||
|
||||
|
||||
tr(<<"r"/utf8, Rest/binary>>, Stack, Callbacks, Opts) ->
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue