[antlr-interest] Rule optimization - inline

Jim Idle jimi at temporal-wave.com
Tue Feb 22 08:19:57 PST 2011


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


More information about the antlr-interest mailing list