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
> [email protected]
> https://lists.csail.mit.edu/mailman/listinfo/peg
--
.i ma'a lo bradi cu penmi gi'e du
_______________________________________________
PEG mailing list
[email protected]
https://lists.csail.mit.edu/mailman/listinfo/peg