[antlr-interest] Problem with semantic predicates
Thomas Woelfle
thomas.woelfle at interactive-objects.com
Tue Jul 29 22:24:36 PDT 2008
Hi Loring,
thanks for the tip. I'll try it with version 3.1
Regards,
Thomas
> I would guess that you are using 3.0.1; somehow a critical line was commented out in that version that allows decisions with multiple sempreds (hoisted or otherwise). Try using one of the 3.1 betas.
> --Loring
>
>
>
> ----- Original Message ----
>
>> From: Thomas Woelfle <thomas.woelfle at interactive-objects.com>
>> To: antlr-interest at antlr.org
>> Sent: Monday, July 28, 2008 2:18:28 AM
>> Subject: [antlr-interest] Problem with semantic predicates
>>
>> 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
>>
>
>
>
>
>
--
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