[antlr-interest] Latest intermediate build (ANTLR 3.1b1) produces broken Java code

Terence Parr parrt at cs.usfca.edu
Tue Apr 29 22:40:40 PDT 2008


hi. apparently 3.1 is forcing a DFA not simple LL(k) lookahead...you  
got "lucky" before...i recommend you avoid locals that can lead to  
them being hoisted outside...sorry. not sure how to improve this.
Ter
On Apr 29, 2008, at 9:55 PM, Gerz, Michael wrote:

> Hi,
>
> I encountered a problem with the latest ANTLR snapshot. The problem  
> does not occur with ANTLR 3.0.1.
>
> The following (simplified) rule:
>
>
> record
>             :           {
>                                     List<SyLTParameter> syltPars =  
> classDoc.getConstructors().get(0).getParameters();
>                                    int parNo = 0;
>                                    boolean first = true;
>                         }
>
>                         '{'
>
>                         (           { parNo < syltPars.size() }? =>
>
>                                     (           { first  }? =>  
> { first = false; }
>                                     |           { !first }? => ',' )
>
>                                    f = field[type, false]
>                         )*
>
>                         '}'
>             ;
>
> leads to the following broken code:
>
>     public final void record() throws RecognitionException {
>         try {
>             // Message.g:94:2: ( '{' ({...}? => ({...}? => | {...}?  
> => ',' ) f= field[type, false] )* '}' )
>             // Message.g:94:4: '{' ({...}? => ({...}? => | {...}?  
> => ',' ) f= field[type, false] )* '}'
>             {
>                             List<SyLTParameter> syltPars =  
> classDoc.getConstructors().get(0).getParameters();
>                              int parNo = 0;
>                              boolean first = true;
>        }
>
>             match(input,25,FOLLOW_25_in_record212);
>             // Message.g:112:3: ({...}? => ({...}? => | {...}? =>  
> ',' ) f= field[type, false] )*
>             loop2:
>             do {
>                 int alt2=2;
>                 alt2 = dfa2.predict(input);
>                   ... more code ...
>             } while (true);
>
>             match(input,27,FOLLOW_27_in_record306);
>         }
>         catch (RecognitionException re) {
>             reportError(re);
>             recover(input,re);
>         }
>         finally {
>         }
>     }
>
>     class DFA2 extends DFA {
>
>         public DFA2(BaseRecognizer recognizer) {
>             this.recognizer = recognizer;
>             this.decisionNumber = 2;
>             this.eot = DFA2_eot;
>             this.eof = DFA2_eof;
>             this.min = DFA2_min;
>             this.max = DFA2_max;
>             this.accept = DFA2_accept;
>             this.special = DFA2_special;
>             this.transition = DFA2_transition;
>         }
>         public String getDescription() {
>             return "()* loopback of 112:3: ({...}? => ({...}? => |  
> {...}? => ',' ) f= field[type, false] )*";
>         }
>         public int specialStateTransition(int s, IntStream _input)  
> throws NoViableAltException {
>             TokenStream input = (TokenStream)_input;
>             int _s = s;
>             switch ( s ) {
>                     case 0 :
>                         int LA2_0 = input.LA(1);
>
>
>                         int index2_0 = input.index();
>                         input.rewind();
>                         s = -1;
>                         if ( (LA2_0==27) ) {s = 1;}
>                         else if ( (LA2_0==DECIMAL_LITERAL) &&  
> (( parNo < syltPars.size() && first  ))) {s = 2;}
>                         else if ( (LA2_0==FLOATING_POINT_LITERAL)  
> && (( parNo < syltPars.size() && first  ))) {s = 3;}
>                         else if ( (LA2_0==CHARACTER_LITERAL) &&  
> (( parNo < syltPars.size() && first  ))) {s = 4;}
>                         else if ( (LA2_0==STRING_LITERAL) &&  
> (( parNo < syltPars.size() && first  ))) {s = 5;}
>                         else if ( (LA2_0==IDENTIFIER) && (( parNo <  
> syltPars.size() && first  ))) {s = 6;}
>                         else if ( (LA2_0==TRUE) && (( parNo <  
> syltPars.size() && first  ))) {s = 7;}
>                         else if ( (LA2_0==FALSE) && (( parNo <  
> syltPars.size() && first  ))) {s = 8;}
>                         else if ( ((LA2_0>=NULL && LA2_0<=OMIT)) &&  
> (( parNo < syltPars.size() && first  ))) {s = 9;}
>                         else if ( (LA2_0==25) && (( parNo <  
> syltPars.size() && first  ))) {s = 10;}
>                         else if ( (LA2_0==28) && (( parNo <  
> syltPars.size() && first  ))) {s = 11;}
>                         else if ( (LA2_0==26) && (( parNo <  
> syltPars.size() && !first ))) {s = 12;}
>
>                         input.seek(index2_0);
>                         if ( s>=0 ) return s;
>                         break;
>             }
>             NoViableAltException nvae =
>                 new NoViableAltException(getDescription(), 2, _s,  
> input);
>             error(nvae);
>             throw nvae;
>         }
>     }
>
>
>
> Obviously, DFA2.specialStateTransition refers to the local  
> variables defined within record(), i.e. "parNo", "syltPars", and  
> "first".
>
> Any idea on how to fix this issue? Or is this in fact a new "feature"?
>
> Many thanks in advance!
>
> Michael
>
>
>
> ********************************************************************** 
> **
> Dr. Michael Gerz
> FGAN e.V.                                       Phone:  +49 228  
> 9435-414
> Department FKIE/ITF                             Fax:    +49 228  
> 9435-685
> Neuenahrer Straße 20                            E-Mail: gerz at fgan.de
> 53343 Wachtberg-Werthhoven, Germany             WWW:    www.fgan.de
>
> Forschungsgesellschaft für Angewandte Naturwissenschaften e. V. (FGAN)
> Sitz der Gesellschaft: Bonn
> Registergericht: Amtsgericht Bonn VR 2530
> Vorstand: Dr.rer.nat. R. Dornhaus (Vorst.), Prof. Dr. J. Ender  
> (Stellv.)
>
>
> ********************************************************************** 
> **
> Dr. Michael Gerz
> FGAN e.V.                                       Phone: +49 228  
> 9435-414
> Department FKIE/ITF                             Fax: +49 228 9435-685
> Neuenahrer Straße 20                            E-Mail: gerz at fgan.de
> 53343 Wachtberg-Werthhoven, Germany             WWW: www.fgan.de
>
> Forschungsgesellschaft für Angewandte Naturwissenschaften e. V. (FGAN)
> Sitz der Gesellschaft: Bonn
> Registergericht: Amtsgericht Bonn VR 2530
> Vorstand: Dr.rer.nat. R. Dornhaus (Vorst.), Prof. Dr. J. Ender  
> (Stellv.)
>



More information about the antlr-interest mailing list