[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: some newbie questions about lpeg
- From: "Duncan Cross" <duncan.cross@...>
- Date: Mon, 17 Sep 2007 17:48:46 +0100
On 9/17/07, Roberto Ierusalimschy <roberto@inf.puc-rio.br> wrote:
> > On 9/16/07, gary ng <garyng2000@yahoo.com> wrote:
> > > What would be the equivalent of pattern{x,y} in regex,
> > > i.e. pattern can occur between x and y times ?
> >
> > First attempt:
> >
> > function lpeg.minmax(patt,min,max)
> > return #(lpeg.P(patt)^min) * lpeg.P(patt)^-max
> > end
>
> Second attempt: (It is much more work, but the result is more efficient,
> as it does not read the patterns twice.)
>
> local function mult (p, n)
> local np = m.P(true)
> while n >= 1 do
> if n%2 >= 1 then np = np * p end
> p = p * p
> n = n/2
> end
> return np
> end
>
> local function minmax (p, min, max)
> if max == true then return p^min
> else
> max = (max == false) and min or max
> if max < min then return m.P(false) end
> local r = mult(p, min)
> if max > min then r = r * p^(min - max) end
> return r
> end
> end
>
> (max == true means no maximum; max == false means exactly min repetitions)
>
> (The next version of 're' will support this syntax.)
>
> -- Roberto
>
You could even replicate the {x,y} syntax directly on patterns:
getmetatable(lpeg.P(1)).__call = function(p,t) return minmax(p,
unpack(t)); end
(Not necessarily recommending this...)