[antlr-interest] Nondeterminism between alts 1 and 2 of block...

Thiago F.G. Albuquerque tfga at terra.com.br
Sun May 18 14:42:02 PDT 2003


At 13:14 18/05/03 -0700, you wrote:
>Hi.  You've correctly analyzed this as a Human. :)  Unfortunately, for
>the moment, ANTLR generates linear approximate k=2 lookahead not the
>real thing (which has sequence information).  This is a weakness of the
>parsing strategy not your understanding of LL(k).  Sorry.
>
>I'm actually working on the analysis stuff at the moment (full LL(k)
>and semantic predicate hoisting). :)
>
>Ter

Ok, thank you for your answer. But how can I fix this? Is there a 
workaround? I need to write my parser. This example I sent is a 
simplification of a larger grammar I am working on (a project for school). 
Here's an excerpt of the original grammar:

exp : func_call
       | (variable "=") => assignment
       | logical_exp
       ;

logical_exp : rel_exp (("||" | "&&" | "!") rel_exp)*
             ;

rel_exp : add_exp (rel_op add_exp)*
         ;

rel_op : "<" | "<=" | ">" | ">=" | "==" | "!="
        ;

add_exp : mul_exp (( "+" | "-") mul_exp)*
         ;

mul_exp : atom (( "*" | "/" | "%" ) atom)*
         ;

atom : const
      | variable
      | "(" exp ")"
      ;

In this grammar I cannot colapse 'exp' and 'atom' into one rule.

What should I do?

TIA,
Thiago

>On Sunday, May 18, 2003, at 09:31  AM, Thiago F.G. Albuquerque wrote:
>
> > Hi, everybody,
> >
> > I am facing a problem with a grammar. I was wondering if you could
> > help me.
> >
> > Here it is:
> >
> > class MyParser extends Parser;
> >
> > options
> > {
> >     k = 2;
> > }
> >
> > //
> > -----------------------------------------------------------------------
> > ----
> >
> > exp : func_call         // <-- this is line 185 (the line of the error)
> >      | atom
> >      ;
> >
> > func_call : ID "(" (exp ("," exp)*)? ")"
> >            ;
> >
> > atom : variable
> >       | "(" exp ")"
> >       ;
> >
> > //
> > -----------------------------------------------------------------------
> > ----
> >
> > variable : ID                  // atomic variable
> >           | ID ("[" exp "]")+   // array
> >           | ID "." variable     // struct
> >           ;
> >
> > //
> > -----------------------------------------------------------------------
> > -----
> >
> > Error:
> >
> > ANTLR Parser Generator   Version 2.7.2   1989-2003 jGuru.com
> > test.g:185: warning:nondeterminism between alts 1 and 2 of block upon
> > test.g:185:     k==1:ID
> > test.g:185:     k==2:"("
> >
> > I don't understand how can there be nondeterminism here. func_call
> > really
> > begins with
> >
> > ID "("
> >
> > but it is not possible to generate this sequence of tokens from atom.
> >
> > Also, I noticed that if I colapse the rules exp and atom into one rule,
> > like this:
> >
> > exp : func_call         // <-- this is line 185 (the line of the error)
> >        | variable
> >        | "(" exp ")"
> >        ;
> >
> > the problem disapears.
> >
> > I am puzzled.
> >
> > Can anybody please explain this to me?
> >
> > TIA,
> > Thiago


 

Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/ 




More information about the antlr-interest mailing list