I'd initially write it as (b* a+ b*) and handle the error of b elements located at both locations with a user-understandable message at a later point. My end goal would be reducing rule1 to the following as long as it stays unambiguous.
rule1 : (rule2 (a|b)*)* Sam -----Original Message----- From: [email protected] [mailto:[email protected]] On Behalf Of Kevin J. Cummings Sent: Wednesday, December 01, 2010 10:21 AM To: [email protected] Subject: Re: [antlr-interest] [ANTLRWorks 1.4][Code Generation] [C target] Bug?? On 12/01/2010 10:32 AM, Amr Muhammad wrote: > Hello, > > I have a rule like this: > > version1 --- rule1: (rule2 (a+ b* | b* a+) )* (rule2 a*)* ^^^^^^^^^^^^^^^^^^^^^^^^^ Hmmm, 1 or more a followed by 0 or more b OR zero or more b followed by 1 or more a. What happens when there are 0 b. Your code reduces to 1 or more a OR 1 or more a. I would re-write this as: rule1: (rule2 ( (a+ b*) | (b+ a+)) )* (rule2 a*)* as the case of just matching a+ is handled by the first alternative. Now you need to handle the problem of the which rule2 case to match given that the first one could be empty and you want to match the second. I think you need to disambiguate your grammar further. -- Kevin J. Cummings [email protected] [email protected] [email protected] Registered Linux User #1232 (http://counter.li.org) 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 -- You received this message because you are subscribed to the Google Groups "il-antlr-interest" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/il-antlr-interest?hl=en.
