[antlr-interest] Problem with semantic predicates

Thomas Woelfle thomas.woelfle at interactive-objects.com
Mon Jul 28 02:18:28 PDT 2008


Hi,

I have to write a grammar for an existing language that allows keywords 
to be used as variables. I've been able to write most of the grammar 
using semantic predicates. But now I've been running into a problem 
where I don't know whether I'm using semantic predicates the wrong way 
or whether it is a bug in ANTLR. I have reduced the problem to the 
following grammar:


grammar foo;

options
{
    ASTLabelType = CommonTree;
    output = AST;
    language = Java;
}

master   
    :    foo
    |    bar
    |    blup
    ;
  
foo     :    {input.LT(1).getText().equals("FOO")}? IDENTIFIER LBRACE 
IDENTIFIER RBRACE
    ;
  
bar     :    {input.LT(1).getText().equals("BAR")}? IDENTIFIER (LBRACE 
IDENTIFIER RBRACE)?
    ;
  
blup     :    {input.LT(1).getText().equals("BLUP")}? IDENTIFIER
    ;

LBRACE     :    '(';
RBRACE    :    ')';
  
IDENTIFIER
    :    'A'..'Z'*;

The rules 'foo' and 'bar' are almost identical. The only differences are 
the semantic predicates and the fact that in the rule 'bar' the braced 
identifier is optional.
Evaluating a string "BAR(HI)" using this grammar starting with the rule 
'master' leads to an error since the rule 'foo' is chosen instead of 
rule 'bar'. Having a look at the generated JAVA code shows following logic:


    // $ANTLR start master
    // C:\\Temp\\foo.g:10:1: master : ( foo | bar | blup );
    public final master_return master() throws RecognitionException {
        master_return retval = new master_return();
        retval.start = input.LT(1);

        CommonTree root_0 = null;

        foo_return foo1 = null;

        bar_return bar2 = null;

        blup_return blup3 = null;

        try {
            // C:\\Temp\\foo.g:11:5: ( foo | bar | blup )
            int alt1=3;
            int LA1_0 = input.LA(1);

            if ( (LA1_0==IDENTIFIER) ) {
                int LA1_1 = input.LA(2);

                if ( (LA1_1==LBRACE) ) {
                    alt1=1;
                }
                else if ( (input.LT(1).getText().equals("BAR")) ) {
                    alt1=2;
                }
                else if ( (input.LT(1).getText().equals("BLUP")) ) {
                    alt1=3;
                }
                else {
                    NoViableAltException nvae =
                        new NoViableAltException("10:1: master : ( foo | 
bar | blup );", 1, 1, input);

                    throw nvae;
                }
            }
           ......


The first "if" checks whether the current token is an identifier. This 
is ok. But the next "if" statement checks whether the next token is a 
left brace. If true it decides for the sub rule "foo" without evaluating 
the semantic predicates. Is this a bug in ANTLR or am I using semantic 
predicates the wrong way?

Any help appreciated.

Regards,
Thomas

-- 
Interactive Objects Software GmbH
Basler Strasse 61
79100 Freiburg, Germany

Phone:  +49 761 400 73 0
mailto:thomas.woelfle at interactive-objects.com


------------------------------------------------------------------------

Interactive Objects' Legacy Modernization Solutions 

Get Your Applications SOA-Ready!

See http://www.interactive-objects.com/ for more information.

------------------------------------------------------------------------
 

Interactive Objects Software GmbH - Freiburg - Geschäftsführer: Thomas Wager - AG Frbg. HRB 5810 - USt-IdNr. DE197983057



More information about the antlr-interest mailing list