[antlr-interest] Bug when using multi-parameter generics as return values?

Johannes Luber jaluber at gmx.de
Thu Jul 31 06:20:58 PDT 2008


Niemeijer, R.A. schrieb:
> I switched to AntlrWorks 1.2b5 and Antlr 3.1b2.
> Unfortunately this causes two problems.
> 
> The generated code for both the lexer and parser contains a group of
> code that looks like this (the real version is longer):
> 
> const string DFA3_eotS =
>         "\1\uffff\1\17\31\uffff";
>     const string DFA3_eofS =
>         "\33\uffff";
>     const string DFA3_minS =
>  
> "\1\52\1\105\10\uffff\1\125\2\uffff\1\106\2\uffff\1\116\2\uffff"+
>         "\1\103\1\61\2\105\4\uffff";
> 
> This causes compile errors. These can be overcome by putting @'s in
> front of the strings, but that is not something you want to do after
> every code generation.

Are you using CSharp as the target? AW 1.2b5 uses still ANTLR 3.1b1 
which contains the bug you encounter above (although using @'s to "fix" 
it won't actually work - use the command line or the CSharp2 target 
which has further improvements like being maintained beyound ANTLR 3.2).
> 
> Also, the code
> 
> var input = sequence.Select(p => p.ParserText).Flatten();
> var lexer = new PuzzleLexer(new ANTLRStringStream(input));
> 
> now throws a TypeInitializationException with an InnerException of
> "Index was outside the bounds of the array."
> 
> I have the suspicion that both of these have to do with encoding, but
> I'm not sure. Does anyone happen to know the solution to these problems?
> 
> Thanks.

If the encoding doesn't cause the bug tell me about it.

Johannes
> 
> -----Original Message-----
> From: Johannes Luber [mailto:jaluber at gmx.de] 
> Sent: donderdag 31 juli 2008 12:24
> To: Niemeijer, R.A.
> Cc: antlr-interest at antlr.org
> Subject: Re: [antlr-interest] Bug when using multi-parameter generics as
> return values?
> 
> Niemeijer, R.A. schrieb:
>> Hello everyone,
>>
>> I have a question about using generics as return values (with C# as
> the 
>> target language). When the generic has only one parameter everything 
>> works correctly, e.g.
>>
>> elements[Scene scene] returns [IEnumerable<BuildingElement> elems]
>>
>>                 :               ELEMS p=piece { $elems = 
>> (IEnumerable<BuildingElement>)p.piece.Eval(scene); }
>>                 ;
>>
>> However, when I want to return a generic with more than one parameter,
> 
>> e.g. a Func<BuildingElement, int>, the code generation screws up: it 
>> splits the type at the comma, giving one line with
> Func<BuildingElement 
>> and one with int>, which obviously results in a compile error.
>>
>> It is possible to get around this problem with using-statements, such
> as
>> using FBI = System.Func<BuildingElement, int>;
>>
>> and then saying returns [FBI func]. However, this is far from elegant,
> 
>> especially when you have a lot of different types. Is there a correct 
>> way to do this or if not, has this bug been fixed since Antlr 3.0.1?
>>
>> Thanks in advance.
> 
> Try the newest beta. I believe some bugs regarding the handling of 
> generics have been fiyed. Possibly you may need to escape <, >, [ and ] 
> with a \.
> 
> Johannes
> 



More information about the antlr-interest mailing list