[antlr-interest] generating cyclic state machines in Java
Matt Benson
gudnabrsam at yahoo.com
Thu Feb 9 12:56:49 PST 2006
Not much to add here, and am interested to see what
else Jeff says, but I seriously doubt Java would wipe
the contents of arrays for which initial values are
provided... working on the assumption that over the
ten years of Java's evolution somebody smarter than I
has touched each of the major JREs...
-Matt
--- Terence Parr <parrt at cs.usfca.edu> wrote:
> Hi Jeff,
>
> Well, I'm not sure I fully understand what you have,
> but while
> sitting in the beautiful California sun today I
> thought about how I
> would redo them. Perhaps this is similar to what
> you would suggest.
>
> First, my goals:
>
> 1. don't create a lot of classes
> 2. don't create a lot of instances
> 3. avoid method calls per character just to
> transition
> 4. be as small as possible
>
> I thought about just making a huge switch on state
> number that jumped
> to a CASE:
>
> switch ( s ) {
> case 0 : ...
> case 1 : ...
> ...
> }
>
> But, with say 500 states I'm not sure java would do
> this efficiently
> and it would limit the size of our DFAs due to java
> method size
> limits. For states that have semantic predicates
> are truly
> complicated transitions, we could do this.
>
> As an optimization, I would like something tight
> like this:
>
> while ( s != accept state ) {
> s = states[s][input.LA(1)];
> if ( s==-1 ) error;
> }
> return predictedAlt[s];
>
> which works well enough for 8 bits. Actually when
> the range from low
> to high of the edge labels is > threshold then you'd
> decide the array
> would be too big and you resort to another case in
> your switch. So
> for single char labels very high into the unicode
> range, you could
> still use this approach. You need min/max arrays
> too:
>
> while ( s != accept state ) {
> c = input.LA(1);
> if ( c>max[s] ) error;
> s = states[s][c-min[s]];
> if ( s==-1 ) error;
> }
> return predictedAlt[s];
>
> For most states then, you could do this fast scheme
> and then resort
> to a big switch for the others or even use methods
> for s0(), s32(),
> etc.. and jump to them to reduce the size of the
> method containing
> the switch.
>
> Do you see any problems with this?
>
> One could be defining the stuff; java does
> what...ok, web says I can
> do this:
>
> int dfa1_min[] = {...};
> int dfa1_max[] = {...};
> ...
> int dfa1_states[][] = {
> { 0,0,0,3,0,2,0,... }, // state 1 transitions where
> on char x?
> { ... }, // state 2
> ...
> };
>
> Java creates an array of arrays, which is a lot of
> objects and
> hopefully it doesn't wipe to 0 first and then add
> these default
> values. :(
>
> Anybody have experience with this in Java?
>
> Ter
>
__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com
More information about the antlr-interest
mailing list