Some time ago I wrote about new way to compare states in DFA. You could take for example two states:
expr -> PLUS . expr { func1 }; expr -> MINUS . expr { func1 };
and argue they can be merged in DFA because among other things, they have exactly the same action. Well, I was wrong — sure, the code is shared, the code is the same, but the execution path (flow) can vary. And the difference relies on such basic thing as action parameters — if data associated with PLUS
and MINUS
are not used the merger is possible. If they are used (most likely) you have to create separate states.
So the correction to the action part is this — if the action is the same and we didn’t read any of the parameters used in the action, we can merge.
Such modification makes merger criterion much weaker and it is not possible to stop aliases from exploding when unfolding them. Thus I had to revert almost completely my entire work. Well, life…