Thank you so much Farncisco!

Hurricane Sandy has a lot of my attention, but that was still a
very basic mistake.  >_>  Alexey, this thread is the basic idea
of what you want to accomplish, does it make sense?

-Alan

On Tue, Oct 30, 2012 at 11:43:05AM -0400, Francisco Mota wrote:
> Alan, unfortunately this would not match "a.a(a).a", because ".a(a)"
> does not match "dot a &(dot a)".
> 
> Fortunately, there's a solution, that should work in general. Alexey
> wants the string to always end in ".a". I can think of two ways to
> accomplish this:
> 
> expr = a (dot a &. / left a right &.)* dot a
> 
> Or,
> 
> expr = a rest
> rest  = dot a rest / left a right rest / dot a
> 
> I also haven't tested this. The second version should allow you to put
> "expr" in the middle of a larger grammar. The first version requires
> "expr" to be at the end of the string.
> 
> Take care,
> Francisco
> 
> On Tue, Oct 30, 2012 at 11:23 AM, Alan Post <alanp...@sunflowerriver.org> 
> wrote:
> > Where you said:
> >
> >   expr = a (dot a / left a right)* dot a
> >
> > The following should work:
> >
> >   expr = a (dot a &(dot a) / left a right &(dot a))* dot a
> >
> > But it depends a little on what your actual use case is.  What
> > I did here was insist that either case of the choice operator
> > require but leave the rest of the needed expression.  This should
> > prevent the (dot a)* from being too greedy, or in your description,
> > it will make it properly backtrack.
> >
> > Untested, as this is off the top of my head.  Mistakes entirely
> > possible.
> >
> > -Alan
> >
> > On Tue, Oct 30, 2012 at 07:12:23PM +0400, Alexey Shamrin wrote:
> >> Hello,
> >>
> >> I'm trying to write a PEG grammar that would match this input:
> >>
> >>   a.a(a).a
> >>
> >> And would not match this input:
> >>
> >>   a.a(a)
> >>
> >> I want my input to always end with ".a".
> >>
> >> I tried the following grammar in PEG.js [1] and language.js [2]:
> >>
> >>   start = expr !.
> >>   expr = a (dot a / left a right)* dot a
> >>   a = 'a'
> >>   dot = '.'
> >>   left = '('
> >>   right = ')'
> >>
> >> But it doesn't work. In PEG.js my first input fails with "Expected "("
> >> or "." but end of input found.".
> >>
> >> It seems PEG doesn't try to backtrack at this point. Why doesn't it?
> >> What grammar can work for me?
> >>
> >> [1]: http://pegjs.majda.cz/online
> >> [2]: http://languagejs.com/
> >>
> >> Alexey
> >>
> >> _______________________________________________
> >> PEG mailing list
> >> PEG@lists.csail.mit.edu
> >> https://lists.csail.mit.edu/mailman/listinfo/peg
> >
> > --
> > .i ma'a lo bradi cu penmi gi'e du
> >
> > _______________________________________________
> > PEG mailing list
> > PEG@lists.csail.mit.edu
> > https://lists.csail.mit.edu/mailman/listinfo/peg
> 
> _______________________________________________
> PEG mailing list
> PEG@lists.csail.mit.edu
> https://lists.csail.mit.edu/mailman/listinfo/peg

-- 
.i ma'a lo bradi cu penmi gi'e du

_______________________________________________
PEG mailing list
PEG@lists.csail.mit.edu
https://lists.csail.mit.edu/mailman/listinfo/peg

Reply via email to