Nikolay Ognyanov wrote:



Loring's explanation of the parse interpretations may help you to visualize this better. Your are asking ANTLR to analyze all possible combinations of rules as one big rule basically. Consider what happens when you want actions at various points.

Jim
Jim Idle wrote:
Nikolay Ognyanov wrote:


Jim Idle wrote:
Nikolay Ognyanov wrote:
Hi everybody,

Please have a look at a toy grammar for  language consisting of 2 
statements :

grammar Ambiguous;

expr
    : expr1
    | expr2
    ;
expr1
    : PREFIX_1 expr2 SUFFIX
    ;
expr2
    : PREFIX_2
    | PREFIX_2 SUFFIX
    ;

PREFIX_1   : 'prefix_1';
PREFIX_2   : 'prefix_2';
SUFFIX     : 'suffix';
WS         : (' ' | '\r' | '\n' | '\t')+ {$channel=HIDDEN;};


Please do not advise how to fix it :) I know that but the question is why
ANTLR considers rule for expr2 ambiguous?  Here is a tool run:

java org.antlr.Tool Ambiguous.g
warning(200): Ambiguous.g:11:5: Decision can match input such as 
"PREFIX_2 {EOF, SUFFIX}" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input
error(201): Ambiguous.g:11:5: The following alternatives can never be 
matched: 2
  
Clearly, this is ambiguous because you follow expr2 with SUFFIX in the expr1 rule. When parsing expr2 as part of expr1, the paths of taking PREFIX_2 the using SUFFIX in expr1 and taking PREFIX_2 then SUFFIX in expr2 followed by SUFFIX in expr1 are ambiguous as written.

You say you know how to fix it, but perhaps you do not if you cannot see the ambiguity here. Because expr2 is a stand alone path from expr, there is no way to know how to disambiguate when called from expr1. Basically, you need to left factor these rules properly:

expr
   : PREFIX_1 PREFIX_2 SUFFIX SUFFIX?
   | PREFIX_2 SUFFIX?
   ;




Jim



List: http://www.antlr.org/mailman/listinfo/antlr-interest Unsubscribe: http://www.antlr.org/mailman/options/antlr-interest/your-email-address
By definition a grammar is ambiguous if there is more than 1 way to derive at least one statement.
This is not the case here. There is only 1 way to derive the offending statement

PREFIX_1 PREFIX_2 SUFFIX SUFFIX

And it would take the procedure for expr2 just about 3 tokens lookahead to figure out what is the
right thing to do.
The question is why ANTLR does not do this?
That isn't the definition of an ambiguous grammar in terms of what ANTLR can anaylzye (at least at the moment.) How do you expect ANTLR to generate disambiguation in  expr2 when called from expr1 but handle being called from expr as well, where as you have the expr rule right now it could be followed by SUFFIX and the parse can just stop. Sure, as humans we can see that in this particular case it could be done if we make assumptions about follow sets, but for the current analysis algorithms, this is ambiguous.

As I said, you need to left factor your rules - your grammar will be much more readable that way too. You could also just conflate expr2 into expr1 and the lookahead predictions you think it should do now would actually happen. However, that way your are increasing the complexity.

Consider:

x : P1 P2? P2 ;

vs

x : P1 P2 P2?

as the simplistic case, then when P2 is a series of tokens, and so on.

Jim

List: http://www.antlr.org/mailman/listinfo/antlr-interest Unsubscribe: http://www.antlr.org/mailman/options/antlr-interest/your-email-address
Thank you, Jim. I really do know how to revamp the grammar. At least in such toy cases :) What
I am trying to understand better is in what situations ANTLR will fail to do otherwise doable by
recursive decent parser things. Your comment about competition between parsing of standalone
and embedded exp2 gives me something to think about. I am not really sure I can learn much
more than this without diving into ANLR inernals but I am giving it a try :)

Regards
Nikolay









--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---

List: http://www.antlr.org/mailman/listinfo/antlr-interest
Unsubscribe: 
http://www.antlr.org/mailman/options/antlr-interest/your-email-address

Reply via email to