[antlr-interest] How to fix the ambiguous grammar

Terence Parr parrt at cs.usfca.edu
Tue Jun 5 15:37:56 PDT 2012


a : A B | A ;
On Jun 5, 2012, at 9:26 AM, Jie Li wrote:

> I'm afraid I need 'a' to match both "A" and "A B", so I tried 
> 
> a:  A
>    | A {input.LT(1).getText().equals("B")}? B;
> 
> which works though it doesn't look nice. Do you have any better idea?
> 
> Jie
> 
> On Tue, Jun 5, 2012 at 9:10 AM, Terence Parr <parrt at cs.usfca.edu> wrote:
> Easiest thing to do is simply reorder those alternatives if you want 'a'  to match A B not A.
> T
> On Jun 4, 2012, at 10:18 PM, Jie Li wrote:
> 
> > Thanks Ter. Do you mean I should turn the backbracking off? If I can't, do
> > you have any suggestion?
> >
> > Jie
> >
> > On Mon, Jun 4, 2012 at 9:57 PM, Terence Parr <parrt at cs.usfca.edu> wrote:
> >
> >> It sounds like you have backtracking turned on and that whichever rule
> >> calls 'a' has B following the reference to 'a'. When it can't figure out
> >> what to do with an ambiguity it picks the 1st match.
> >> Ter
> >> On Jun 4, 2012, at 9:49 PM, Jie Li wrote:
> >>
> >>> Hi all,
> >>>
> >>> I'm new to antlr and struggling to fix the grammar like below:
> >>>
> >>> a:   A
> >>>   | A B ;
> >>>
> >>> But this grammar doesn't support "A B" as it complains it expects the end
> >>> character after "A". If I switch the order of this grammar, e.g. "A B"
> >>> comes before "A", then it doesn't support "A" as it complains it expects
> >>> "B" after "A".
> >>>
> >>> Then I tried:
> >>>
> >>> a:  A
> >>>  | A {input.LT(1).getText().equals("B")}? B;
> >>>
> >>> It does work for both rules now. But I wonder if there is some more
> >> elegant
> >>> way?
> >>>
> >>> Thanks,
> >>> Jie Li
> >>>
> >>> List: http://www.antlr.org/mailman/listinfo/antlr-interest
> >>> Unsubscribe:
> >> http://www.antlr.org/mailman/options/antlr-interest/your-email-address
> >>
> >>
> >
> > List: http://www.antlr.org/mailman/listinfo/antlr-interest
> > Unsubscribe: http://www.antlr.org/mailman/options/antlr-interest/your-email-address
> 
> 



More information about the antlr-interest mailing list