[antlr-interest] Rule optimization - inline

Alex Lujan alex at apption.com
Tue Feb 22 08:28:35 PST 2011


Thanks Jim, I'll check that.

On Tue, Feb 22, 2011 at 11:19 AM, Jim Idle <jimi at temporal-wave.com> wrote:

> Use the mailing list search at antlr.markmail.org for examples of local
> variable out of scope in predicates. Generally you cannot use local
> parameters as elements of your predicate because the code generator
> generates the predicate as a separate method and so the local parameter to
> your rule is out of scope. You need to use a scope variable to do that.
>
> That said, your design is the best one in that you are trying to enforce
> semantics/context within your parser grammar rules. This will result in a
> parser that is error prone and is also unable to give out good error
> messages to your users. The better way to do this is to accept any
> BYTE_VALUE and merge type_sell and type_itsp into one left factored rule.
> Then you can tell this rule what to check for as a rule parameter and
> compare what it finds. If what it finds is not what is expected you can
> now issue a semantic error such as "Must have a type selector here" or
> something. Ideally you would create a tree and then walk the tree to check
> semantics and so on.
>
> Hope that helps,
>
> Jim
>
>
> > -----Original Message-----
> > From: antlr-interest-bounces at antlr.org [mailto:antlr-interest-
> > bounces at antlr.org] On Behalf Of Alex Lujan
> > Sent: Tuesday, February 22, 2011 7:22 AM
> > To: antlr-interest at antlr.org
> > Subject: [antlr-interest] Rule optimization - inline
> >
> > Hi All,
> >
> > I'm having a problem with what I believe is an optimization within the
> > ANTLR code generation.
> >
> > Consider the following sample grammar:
> >
> > grammar CharSelectionTest;
> >
> > @header {
> > import org.apache.commons.lang.StringUtils;
> > }
> >
> > type             :    (type_sell | type_itsp) data ;
> >
> > type_sell         :    character['s'];
> >
> > type_itsp         :    character['i'];
> >
> > data            :    BYTE_VALUE*;
> >
> > character[char character_to_match]
> >                 :    {input.LT(1).getText().charAt(0) ==
> > character_to_match}? BYTE_VALUE;
> >
> > BYTE_VALUE        :    '\u0000'..'\uFFFE';
> >
> >
> > When ANTLR generates the Parser java code, the type() method seems to
> > be replacing the call to the character rule with an inline equivalent:
> >
> > public final void type() throws RecognitionException {
> >         try {
> >             {
> >             int alt1=2;
> >             int LA1_0 = input.LA(1);
> >
> >             if ( (LA1_0==BYTE_VALUE) ) {
> >                 int LA1_1 = input.LA(2);
> >
> >                 // Compile error: character_to_match is not defined!
> >                 if ( ((input.LT(1).getText().charAt(0) ==
> > character_to_match)) ) {
> >                     alt1=1;
> >                 }
> >                 else if ( ((input.LT(1).getText().charAt(0) ==
> > character_to_match)) ) {
> >                     alt1=2;
> >                 }
> >                 else {
> >                     NoViableAltException nvae =
> >                         new NoViableAltException("", 1, 1, input);
> >
> >                     throw nvae;
> >                 }
> >             }
> >             ...
> >     }
> >
> > Note that the variable character_to_match is not defined, since it's
> > supposed to be a parameter of the character rule.
> >
> > Is there anything wrong with the rule definition in this simple
> > grammar?
> >
> > Is this a known issue?
> >
> > Any workarounds / solutions to this problem?
> >
> > Thanks very much for your help.
> >
> > --
> > Alejandro Lujan
> >
> > 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
>



-- 
Alejandro Lujan
Apption Software
(613) 725 62 68 x625


More information about the antlr-interest mailing list