Hi Kuba,

As a quick fix, you could always pass a pointer instead of a reference. Or
you could wrap the reference in a struct.

I agree that lvalue references "should" work, but it might be tricky to
design the parser code such that it doesn't accidentally decide to use a
reference where inappropriate, and end up with a dangling reference. Or
maybe it would be easy... I haven't looked much at that code in about 5
years, TBH, so I don't quite remember.

-Kenton

On Mon, Jul 8, 2019 at 10:08 AM <[email protected]> wrote:

> I'm experimenting with caching lexer output, and have devised a `cache()`
> combinator
> that takes a parser outputting `Foo` and returns a parser outputting
> `const Foo &`. The subparser
> is queried only once for a given position in the input.
>
> This works a treat until you get to transforms: the functors all take
> rvalue references. The quick
> fix is to let the cache copy results. Another is to make the functors take
> `auto` arguments.
> Yet another would be to change the transformer argument types to take
> const lvalue references
> where the lower level parsing is cached.
>
> Is there anything more generic or appropriate that you'd suggest to
> address this problem?
>
> The cache might be an unnecessary addition, but at least it can be
> benchmarked, and the hit
> ratio looked at, and then removed should it be redundant. I've ported our
> crusty in-house DSL
> compiler to kj framework and the cache really helps there, because of how
> the grammar is
> written. Of course, the grammar could be fixed, but the cache is a decent
> stop-gap.
>
> An aside: the parsing framework is a joy to work with, as long as one
> doesn't need to decode
> error messages. I'll have to eventually look at more obvious places to add
> compile-time error
> catching to. Usually, it's some low level function applicator in the
> framework that bombs out,
> with the real problem far away. Visual Studio's approach to error
> reporting doesn't help either.
>
> Cheers, Kuba
>
> --
> You received this message because you are subscribed to the Google Groups
> "Cap'n Proto" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> Visit this group at https://groups.google.com/group/capnproto.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/capnproto/1de280d3-e818-4c4b-af5c-126916267116%40googlegroups.com
> <https://groups.google.com/d/msgid/capnproto/1de280d3-e818-4c4b-af5c-126916267116%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"Cap'n Proto" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
Visit this group at https://groups.google.com/group/capnproto.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/capnproto/CAJouXQmAuALD_OO8YYi0BU_U%2B%2BPZCCOwBa5QppBstQkR5eMEkg%40mail.gmail.com.

Reply via email to