[antlr-interest] Syntactic predicates and loops
Noel F Bryson
nfb at silistix.com
Tue May 4 03:12:58 PDT 2004
On Fri, 2004-04-30 at 17:57, Monty Zukowski wrote:
> On Apr 30, 2004, at 9:18 AM, Noel F Bryson wrote:
>
> > I'm trying to build a grammar which includes something like the
> > following rules, which are intended to parse declaration-lists e.g. T1
> > a,b,c,T2 d,e,f,T3 g,h (where T1,T2 are types and a-h are variables).
> >
> > type: identifier;
> > variable: identifier;
> >
> > list_of_variables: variable (COMMA variable)*;
> >
> > declaration_list: type list_of_variables
> > ( COMMA type list_of_variables)*;
> >
> >
> > I have simplified the rules to illustrate my problem - which is that
> > I get an ambiguity in list_of_variables:
> >
> > sand2.g:35: warning:nondeterminism upon
> > sand2.g:35: k==1:COMMA
> > sand2.g:35: k==2:identifier
> > sand2.g:35: k==3:EOF
> > sand2.g:35: between alt 1 and exit branch of block
> >
> > This occurs because ANTLR sees that, when it meets a COMMA, it can
> > either match using the loop in list_of_variables, or exit and match
> > using the loop in list_of_declarations. hence it can't tell if T2 is a
> > variable name or a type name.
> >
> > Since 'type' and 'variable' are actually more complex than I have shown
> > here, and themselves involve loops at the end, I don't think I can
> > resolve this be factoring or increasing the look-ahead.
> >
> >
> > I'd like to be able to resolve this by getting list_of_variables to use
> > a syntactic predicate to lookahead through the identifier to see if
> > there is a COMMA (or EOF) after it. I'm new to this field, and would be
> > grateful if someone could show me how to do this - ANTLR ignores my
> > feeble efforts e.g.
> >
> > list_of_variables: variable ((COMMA identifier COMMA identifier
> > identifier) => COMMA variable)*;
> >
> What goes wrong with this attempt? It looks like it should work,
> though ANTLR will complain of a superflous syntactic predicate since
> there is only one alternative in the ()* closure.
>
> Monty Zukowski
>
> ANTLR & Java Consultant -- http://www.codetransform.com
> ANSI C/GCC transformation toolkit --
> http://www.codetransform.com/gcc.html
> Embrace the Decay -- http://www.codetransform.com/EmbraceDecay.html
>
>
It gives:
ANTLR Parser Generator Version 2.7.3 (20040325-1) 1989-2004 jGuru.com
sand2.g:18: warning:nondeterminism upon
sand2.g:18: k==1:COMMA
sand2.g:18: k==2:Identifier
sand2.g:18: between alt 1 and exit branch of block
sand2.g:19: warning:Syntactic predicate superfluous for single alternative
However, after a week-end hill-walking and drinking beer, I got this example to work with:
list_of_variables: variable list_tail;
list_tail:
(COMMA Identifier) => ((COMMA type variable) => empty | COMMA variable list_tail)
| empty
;
empty: ();
Now I'll go back to the real problem !
>
>
> Yahoo! Groups Links
>
>
>
>
>
Yahoo! Groups Links
<*> To visit your group on the web, go to:
http://groups.yahoo.com/group/antlr-interest/
<*> To unsubscribe from this group, send an email to:
antlr-interest-unsubscribe at yahoogroups.com
<*> Your use of Yahoo! Groups is subject to:
http://docs.yahoo.com/info/terms/
More information about the antlr-interest
mailing list