[antlr-interest] Position of Action Blocks in Combination with Rewrites

Randall R Schulz rschulz at sonic.net
Sun Oct 5 11:39:41 PDT 2008


Hi,

I just discovered that in parser rules with both a rewrite clause _and_
an action block, the action block must _precede_ the rewrite clause or
the generated Java code is malformed and will not compile.


This is OK:

setOption
    :   Set LParen plainName RParen Period
    {
        if ($plainName.text.equals(cPrologStyleVariables)) {
            fPrologStyleVariablesSpecified = true;
            fPrologStyleVariables = true;
        }
    }
    ->  ^(Set plainName)
    ;


But this is not:

setOption
    :   Set LParen plainName RParen Period
    ->  ^(Set plainName)
    {
        if ($plainName.text.equals(cPrologStyleVariables)) {
            fPrologStyleVariablesSpecified = true;
            fPrologStyleVariables = true;
        }
    }
    ;

The generated Java code for this is:

-==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==-
            // 810:2: -> ^( Set plainName )
            {
                // P9.g:810:5: ^( Set plainName )
                {
                CommonTree root_1 = (CommonTree)adaptor.nil();
                root_1 = (CommonTree)adaptor.becomeRoot(stream_Set.nextNode(), root_1);

                adaptor.addChild(root_1, stream_plainName.nextTree());

                adaptor.addChild(root_0, root_1);
                }
                adaptor.addChild(root_0,
                        if ((plainName153!=null?input.toString(plainName153.start,plainName153.stop):null).equals(cPrologStyleVariables)) {
                            fPrologStyleVariablesSpecified = true;
                            fPrologStyleVariables = true;
                        }
                    );

            }
-==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==-

To which javac reacts thusly:

    [javac] Compiling 3 source files to /dar/tau/obj
    [javac] /dar/tau/src/tau/p9/P9Parser.java:5355: illegal start of expression
    [javac]                         if ((plainName153!=null?input.toString(plainName153.start,plainName153.stop):null).equals(cPrologStyleVariables)) {
    [javac]                         ^
    [javac] /dar/tau/src/tau/p9/P9Parser.java:5355: ';' expected
    [javac]                         if ((plainName153!=null?input.toString(plainName153.start,plainName153.stop):null).equals(cPrologStyleVariables)) {
    [javac]                           ^
    [javac] /dar/tau/src/tau/p9/P9Parser.java:5355: ';' expected
    [javac]                         if ((plainName153!=null?input.toString(plainName153.start,plainName153.stop):null).equals(cPrologStyleVariables)) {
    [javac]                                                                                                                                         ^
    [javac] /dar/tau/src/tau/p9/P9Parser.java:5359: illegal start of expression
    [javac]                     );
    [javac]                     ^
    [javac] 4 errors


I don't know if this is a bug or not, but I thought I'd report it.

I'm running ANTLR 3.1.1 with Sun JDK 1.6.0_10 rc2-b32 on x86 Linux.


Randall Schulz


More information about the antlr-interest mailing list