[antlr-interest] ANTLR 3.4: missing parameter in the method generated for a syntactic predicate for a rule with a parameter

Jim Idle jimi at temporal-wave.com
Fri Aug 17 08:34:52 PDT 2012


Do you have backtrack turned on? Basically you can't use local variables
in any predicate and backtrack will manufacture predicates for you.

You should really turn backtrack off and solve the ambiguities though as
you will be unable to issue good error messages with backtracking turned
on.

Jim


> -----Original Message-----
> From: Francis ANDRE [mailto:francis.andre.kampbell at orange.fr]
> Sent: Friday, August 17, 2012 1:45 AM
> To: Jim Idle
> Cc: antlr ANTLR
> Subject: Re: [antlr-interest] ANTLR 3.4: missing parameter in the
> method generated for a syntactic predicate for a rule with a parameter
>
> Hi Jim
>
> I got the same missing reference -- here the 'f' parameter of the
> fooSpec rule
> -- for the following snippet while there is no syntactic predicate
>
> fooStatement
>      returns[FOO f = null]
> @init
>      { }
>      : t = foo { f = new FOO (t); }
>        (fooSpec[f])?
> ;
> fooSpec
>      [FOO f]
> : blablabla
>
>
> Is this the same problem?
>
> Does it mean that one cannot have a rule with one or more parameter as
> soon as it is embedded in an optional rule?
>
> FA
>
> Le 16/08/2012 18:04, Jim Idle a écrit :
> > Hi Francis,
> >
> > You cannot use a local parameter to a rule in a predicate because the
> > predicate can be hoisted in to rules higher up the chain and so the
> > predicate is its own function. If you need the local rule variable,
> > then place it in a scope and reference it that way - the scope is
> > available outside the rule, and you will find that that works.
> >
> > A question from your snippet here though is what the difference
> > between a variable and a function is. For many languages, this can be
> > left factored in to something like this:
> >
> >
> > varFuncDecl:  ID
> >                (  LPAREN params RPAREN
> >                    (   funcBody  // Function
> >                      | // Function prototype
> >                    )
> >                  | // Variable reference
> >                )
> > ;
> >
> > I don't know if that is the case for the language you are parsing,
> but
> > keep this kind of technique in mind :)
> >
> >
> > Jim
> >
> >> -----Original Message-----
> >> From: antlr-interest-bounces at antlr.org [mailto:antlr-interest-
> >> bounces at antlr.org] On Behalf Of Francis ANDRE
> >> Sent: Thursday, August 16, 2012 5:02 AM
> >> To: antlr ANTLR
> >> Subject: [antlr-interest] ANTLR 3.4: missing parameter in the method
> >> generated for a syntactic predicate for a rule with a parameter
> >>
> >> Hi
> >>
> >> The generation of the method for the syntactic predicate of a rule
> >> with a parameter is missing the parameter in its signature, which
> >> leads to a compile error. I did not find out a way to fix this
> >> problem in the code base of antlr.
> >>
> >> I would appreciate that someone looks at it and eventually fix this
> >> problem because I am stuck
> >>
> >> Rgds
> >>
> >> FA
> >>
> >> Here the CMinus grammar modified with the variable rule having a
> >> parameter and conditioned by a syntactic predicate:
> >> --------------------------------------------------------------------
> -
> >> --
> >> --------------------------------------------------------------------
> -
> >> --
> >> ---------------------------
> >> program
> >> scope {
> >>     List globals;
> >>     List functions;
> >> }
> >> @init {
> >>     $program::globals = new ArrayList();
> >>     $program::functions = new ArrayList(); }
> >>       : _declaration[2]_+
> >>           ->
> >> program(globals={$program::globals},functions={$program::functions})
> >>       ;
> >>
> >> declaration[int i]
> >>       : _(variable[i])=>variable[i]_
> >> {$program::globals.add($variable.st);}
> >>       |   f=function {$program::functions.add($f.st);}
> >>       ;
> >>
> >>
> >> _variable[int i]_
> >>       :   type declarator ';'
> >>           -> {$function.size()>0 && $function::name==null}?
> >>              globalVariable(type={$type.st},name={$declarator.st})
> >>           -> variable(type={$type.st},name={$declarator.st})
> >>       ;
> >>
> >>
> >> Here the generated code
> >> ---------------------------------
> >>       // $ANTLR start synpred1_CMinus
> >>       public final void synpred1_CMinus_fragment() throws
> >> RecognitionException {
> >>           //
> >>
> C:\\Users\\FrancisANDRE\\workspace\\zAntlr3\\src\\cminus\\CMinus.g:39
> >> :9
> >> : ( variable[i] )
> >>           //
> >>
> C:\\Users\\FrancisANDRE\\workspace\\zAntlr3\\src\\cminus\\CMinus.g:39
> >> :1
> >> 0:
> >> variable[i]
> >>           {
> >>           pushFollow(FOLLOW_variable_in_synpred1_CMinus101);
> >>           variable(i); _// <== i cannot be resolved to a variable
> >> CMinusParser.java    /zAntlr3/src/cminus line 1744    Java Problem_
> >>
> >>
> >>           state._fsp--;
> >>           if (state.failed) return ;
> >>
> >>           }
> >>
> >>       }
> >>       // $ANTLR end synpred1_CMinus
> >>
> >>
> >>
> >> _______________________________________________
> >> antlr-dev mailing list
> >> antlr-dev at antlr.org
> >> http://www.antlr.org/mailman/listinfo/antlr-dev
> >>
> >>
> >> 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
> >


More information about the antlr-interest mailing list