lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]

Hi Graham,

that returns the position after the match _after_ all the other captures...
lpeg.C(patt) returns the matched string _before_ the captures of patt, which
is convenient sometimes - that's why I mentioned some tricks involving
table.pack(patt:Ct()). Anyway: I'll guess that my problem is not totally trivial,
and I'll tell the whole story in another e-mail in a few hours.


On Fri, May 11, 2012 at 4:28 PM, Graham Wakefield <> wrote:
Maybe I am missing something, but your Cp(patt) sounds like this:

(C(patt) * Cp())

On May 11, 2012, at 11:35 AM, Eduardo Ochs wrote:

> Hello list,
> I am trying to reimplement in LPeg a recursive-descent parser that I
> wrote by hand, and - for some reasons that I'll explain in a next
> message if it turns out that my doubts are not too dumb - I had to use
> lpeg.Cmt(f) in several of my sub-patterns, and I realized that my work
> would be much easier if lpeg.Cp accepted a pattern as an argument,
> i.e., if instead of
>  lpeg.C(patt)  the match for patt plus all captures made by patt
>  lpeg.Cp()     the current position (matches the empty string)
> we had:
>  lpeg.C(patt)  the match for patt plus all captures made by patt
>  lpeg.Cp(patt) if patt is nil, then the current position;
>                if patt is a pattern, then the position after
>                matching patt (if the match succeeds), plus all
>                captures made by patt
> Anyone knows a way to simulate the behavior I'm suggesting for lpeg.Cp
> when its `patt' is not nil?
>  Cheers and thanks in advance,
>    Eduardo Ochs
> P.S.: I _think_ I know two ways for doing that: one is a very, very,
> _very_ ugly hack using the fact that `patt / f' is supposed to
> evaluates f as late as possible (modulo optimizations), and the other
> way involves running table.pack on the captures of patt*lpeg.Cp(),
> then returning the last value in that table plus the unpacking of the
> rest... But there must be better ways! =|