Parsing infinite streams style

Hal Snyder <>
Tue Mar 9 00:04:10 CET 2004


Joe Armstrong <> writes:

> Let me make this clearer with an example.
>
> Suppose we have a infinite stream
>
> like this
>
> begin <Int> end
> begin <Int> end

Thank you. Gradually a light is going on, and some of the confusion
experienced reading Erlang coded by the Masters is abating.

Need to go back to school or otherwise intake megadose FP therapy -
Friedman, Wand and Haynes 1 ed. Ch 8-9 perhaps....

I think I understand why it works, but need a few more iterations to
actually think that way - it's like the difference between listening
to an In-Flight Swedish CD on the plane to Stockholm vs. being able
converse in the language on arrival.

> but this can be broken into arbitrary chucks - we can write a
> reentrant parser like this:
>
> get_begin("begin " ++ T) -> get_int(T, 0);
> get_begin(S)             -> {more, fun(Data) -> get_begin(S ++ D) end}.
>
> get_int(" " ++ T, N) -> get_end(T, N);
> get_int([H|T], N)    -> get_int(T, N*10-H-$0);
> get_int([], N)       -> {more, fun(S) -> get_int(S, N)}.
>
> get_end("end" ++ T, N) -> {done, N, fun(I) -> get_begin(I)};
> get_end(T, N)          -> {more, fun(S) -> get_end(T++S, N) end}.
>
> This way avoids having to restart the parsing at the beginning 
> every time.
>
>   Having said  all of this I'd  be rather careful  - the "continuation
> passing with funs" method is elegant BUT a bugger to debug if you get
> it wrong - continuation passing with explicit data structures is also a
> bit of a pain.
...



More information about the erlang-questions mailing list