[antlr-interest] [C Target][3.1.1] Trying to understand the behavior of rules with kleene stars
Loring Craymer
lgcraymer at yahoo.com
Mon May 11 12:03:36 PDT 2009
This is a symptom of not having an EOF at the end of your top level rule--you need to add EOF after ';'.
--Loring
----- Original Message ----
> From: Sven Van Echelpoel <sven.van.echelpoel at empolis.com>
> To: "antlr-interest at antlr.org" <antlr-interest at antlr.org>
> Sent: Monday, May 11, 2009 7:30:29 AM
> Subject: [antlr-interest] [C Target][3.1.1] Trying to understand the behavior of rules with kleene stars
>
> Hi,
>
> I'm having trouble understanding the behavior of the parser w.r.t.
> invalid token in rules with Kleene star elements. I have this grammar
> that says that a translation unit is zero or more rules, declarations,
> etc. e.g.
>
> translation_unit
> : ( declaration | rule )* ';'
> -> ^( UNIT rule* ) // only care about rules
> ;
>
> Now, if a rule is followed after the semi colon by an token that is
> illegal at that position, no more rules are processed. No error is
> generated. Looking at the generated code, you get something like this:
>
> for (;;)
> {
> int alt2=2;
> {
> int LA2_0 = LA(1);
> if ( LA2_0 == /*some tokens expected at this position*/ ) // (1)
> {
> alt2=1;
> }
>
>
> }
> switch (alt2)
> {
> case 1:
> /* Continue here if this was what was expected */
> break;
> default:
> goto loop2; /* break out of the loop */ //(2)
> break;
> }
> }
> loop2: ; /* Jump out to here if this rule does not match */ //(3)
>
> In (1) the look ahead token is checked against a set of expected tokens.
> There can be multiple else if branches following this too. If the token
> is unexpected, the value of alt2 remains 2 and in the subsequent switch
> the default case (2) is taken. This simply breaks out of the loop. After
> the loop2 label processing continues as if nothing has happened (3). In
> our example above, AST rewrite rules are invoked.
>
> Note that this pattern is consistently applied every time a Kleene star
> is used somewhere in a rule. If a token is unexpected at that position,
> processing just stops and no error is raised. It seems to me that the
> code is a bit too liberal in interpreting the zero of zero-or-more :-) ,
> i.e. even zero times something expected is fine, erroneously discounting
> the stuff that is unexpected. Am I right, or am I missing something?
>
> Apologies if this is a real issue and it has already been fixed after
> 3.1.1. I found nothing in the bug db and have currently no time to
> investigate this is a later release.
>
> Sven
>
>
>
>
> 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