[antlr-interest] ANTLR 3: Problem with static DFA class generation

Terence Parr parrt at cs.usfca.edu
Sat Sep 24 14:34:19 PDT 2005


On Sep 24, 2005, at 3:18 AM, Oliver Zeigermann wrote:

> Wow! That is really impressive! StringTemplate is even more powerful
> than I thought!
>
> What making method predict in org.antlr.runtime.DFA non-static as
> well? Just for consistency?

Hi :)

it looks nonstatic to me:

/** The overall cyclic DFA chunk; contains all the DFA states */
cyclicDFA(className,decisionNumber,states,description) ::= <<
class DFA<decisionNumber> extends DFA {
     public int predict(IntStream input) throws RecognitionException {
         return predict(input, s0);
     }
     <states>
}
 >>

maybe sync again :)

Ter
>
> Anyway, again, thanks for fixing this :)
>
> Oliver
>
> 2005/9/24, Terence Parr <parrt at cs.usfca.edu>:
>
>> Hi.  Without altering the code generator *code*, I was easily able to
>> change the output to have nonstatic cyclic DFAs thanks to the power
>> of StringTemplate. :)
>>
>> Originally, the parser template had a "hole" for the cyclic DFAs:
>>
>> <cyclicDFAs>
>>
>> Aside from removing the "static" keyword everywhere, I added the
>> following line in front that applied a template to the DFAs:
>>
>>      <! define a singleton instance for each cyclic DFA !>
>>      <cyclicDFAs:{dfa | protected DFA<dfa.decisionNumber>
>> dfa<dfa.decisionNumber> = new DFA<dfa.decisionNumber>();}>
>>
>> which generates a bunch of singletons:
>>
>>      protected DFA3 dfa3 = new DFA3();
>>      protected DFA4 dfa4 = new DFA4();
>>      ...
>>
>> in addition to the cyclic DFAs.
>>
>> The list of DFAs is actually a list of templates so I can ask for
>> their attributes no problem.  Nothing is converted to string until
>> the last minute.  Notice the really great SmallTalk-inspired syntax
>> of that template application:
>>
>> <attributeList:{ iteratorVar | template}>
>>
>> That was added in StringTemplate 2.2 :)
>>
>> Anyway, all my unit tests pass, but I'll try to add some more to see
>> if they compile ok and can access instance variables.
>>
>> Thanks for the inspiration Oliver!
>>
>> Ter
>>
>> On Sep 19, 2005, at 4:21 AM, Oliver Zeigermann wrote:
>>
>>
>>> OK, I created patches for the new Java.stg, DFA.java (optional -  
>>> makes
>>> predicat non-static) and finally a small one for Codegenerator.java.
>>> Using them will generate the code below.
>>>
>>> Oliver
>>>
>>> 2005/9/19, Oliver Zeigermann <oliver.zeigermann at gmail.com>:
>>>
>>>
>>>> 2005/9/18, Terence Parr <parrt at cs.usfca.edu>:
>>>>
>>>>
>>>>>
>>>>> On Sep 12, 2005, at 3:41 AM, Oliver Zeigermann wrote:
>>>>>
>>>>>
>>>>>> It simple makes all DFA code non static to allow full access  
>>>>>> to the
>>>>>> outer class' (Lexer) fields. The part that creates a single  
>>>>>> DFA per
>>>>>> decision and lexer like this:
>>>>>>
>>>>>> class XMLLexer extends Lexer {
>>>>>>
>>>>>> ...
>>>>>>
>>>>>> private dfa10 = new DFA10();
>>>>>>
>>>>>> ...
>>>>>>
>>>>>> alt10 = dfa10.predict(input);
>>>>>>
>>>>>> ...
>>>>>>
>>>>>> }
>>>>>>
>>>>>>
>>>>>
>>>>> Ok, I think figured out why I didn't want to do this before.   
>>>>> There
>>>>> is a bunch of state construction "new" operations that go on when
>>>>> you
>>>>> say new DFA10().  I only wanted them to occur once as they are
>>>>> expensive.  I somehow missed the obvious reuse of the outermost  
>>>>> DFA
>>>>> object; here you are using dfa10 to create DFA10 just once.  In  
>>>>> this
>>>>> way, we only create the DFA states once like with static, but the
>>>>> inner classes have an implied "this" pointer and can see the
>>>>> instance
>>>>> variables of the outer Lexer object.   I like it!
>>>>>
>>>>>
>>>>
>>>> Yes, that's right! My patch does not include the above single
>>>> construction, as this would have required a bit more than  
>>>> changing a
>>>> template, though. But I am pretty sure that you know how to do
>>>> this...
>>>>
>>>> Oliver
>>>>
>>>>
>>>> <Java.stg.diff>
>>>> <DFA.java.diff>
>>>> <CodeGenerator.java.diff>
>>>>
>>>
>>>
>>
>> --
>> CS Professor & Grad Director, University of San Francisco
>> Creator, ANTLR Parser Generator, http://www.antlr.org
>> Cofounder, http://www.jguru.com
>>
>>
>

--
CS Professor & Grad Director, University of San Francisco
Creator, ANTLR Parser Generator, http://www.antlr.org
Cofounder, http://www.jguru.com



More information about the antlr-interest mailing list