Minimisation question

Adrian Thurston thurs... at cs.queensu.ca
Thu Sep 14 16:46:42 UTC 2006


Pretty much every operation can cause unreachable states. For example, 
during union a new start state is created with epsilon transitions drawn to 
the old start states. The epsilon operation effectively copies transition 
lists from the destination state to the source state. If the old start 
states don't have any transitions in from elsewhere in the machine then they 
become unreachable. The on-the-fly cleanup will reap states with no external 
entry points. This gets most unreachables, but just like in garbage 
collection, cycles cause problems.

In your ragel file the subtraction operation is leaving behind unreachables. 
Subtraction may in fact need a full mark and sweep (I had thought the 
on-the-fly was sufficient). The attached patch will allow you to compile 
without -e.

Cheers,
  Adrian

Colin Fleming wrote:
> Ok, thanks for the help! What causes unreachable states? Can I change
> something about the grammar to avoid them (apart from -e, of course)?
> 
> Cheers,
> Colin
> 
> 
-------------- next part --------------
Index: ragel/fsmgraph.cpp
===================================================================
--- ragel/fsmgraph.cpp	(revision 3586)
+++ ragel/fsmgraph.cpp	(working copy)
@@ -496,6 +496,7 @@
 
 	/* Remove states that have no path to a final state. */
 	removeDeadEndStates();
+	removeUnreachableStates();
 }
 
 bool FsmAp::inEptVect( EptVect *eptVect, StateAp *state )


More information about the ragel-users mailing list