diff options
Diffstat (limited to 'src/redfsm.h')
-rw-r--r-- | src/redfsm.h | 889 |
1 files changed, 0 insertions, 889 deletions
diff --git a/src/redfsm.h b/src/redfsm.h deleted file mode 100644 index 392b1a9c..00000000 --- a/src/redfsm.h +++ /dev/null @@ -1,889 +0,0 @@ -/* - * Copyright 2001-2018 Adrian Thurston <thurston@colm.net> - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef _REDFSM_H -#define _REDFSM_H - -#include <assert.h> -#include <string.h> -#include <string> -#include "config.h" -#include "common.h" -#include "vector.h" -#include "dlist.h" -#include "compare.h" -#include "bstmap.h" -#include "bstset.h" -#include "avlmap.h" -#include "avltree.h" -#include "avlbasic.h" -#include "mergesort.h" -#include "sbstmap.h" -#include "sbstset.h" -#include "sbsttable.h" - -#define TRANS_ERR_TRANS 0 -#define STATE_ERR_STATE 0 -#define FUNC_NO_FUNC 0 - -// #define SCORE_ORDERING 1 - -using std::string; - -struct RedStateAp; -struct GenInlineList; -struct GenAction; -struct FsmCtx; -struct GenCondSpace; -typedef BstSet<int> RedCondKeySet; - -/* - * Inline code tree - */ -struct GenInlineItem -{ - enum Type - { - Text, Goto, Call, Ncall, Next, GotoExpr, CallExpr, - NcallExpr, NextExpr, Ret, Nret, - PChar, Char, Hold, Curs, Targs, Entry, Exec, Break, Nbreak, - LmSwitch, LmExec, LmSetActId, LmSetTokEnd, LmGetTokEnd, - LmInitAct, LmInitTokStart, LmSetTokStart, NfaClear, - HostStmt, HostExpr, HostText, - GenStmt, GenExpr, LmCase, LmHold, - NfaWrapAction, NfaWrapConds - }; - - GenInlineItem( const InputLoc &loc, Type type ) : - loc(loc), targId(0), targState(0), - lmId(0), children(0), offset(0), - wrappedAction(0), type(type) { } - - ~GenInlineItem(); - - InputLoc loc; - std::string data; - int targId; - RedStateAp *targState; - int lmId; - GenInlineList *children; - int offset; - GenAction *wrappedAction; - GenCondSpace *condSpace; - RedCondKeySet condKeySet; - Type type; - - GenInlineItem *prev, *next; -}; - -/* Normally this would be atypedef, but that would entail including DList from - * ptreetypes, which should be just typedef forwards. */ -struct GenInlineList : public DList<GenInlineItem> { }; - -struct GenInlineExpr -{ - GenInlineExpr( const InputLoc &loc, GenInlineList *inlineList ) - : loc(loc), inlineList( inlineList ) {} - - ~GenInlineExpr() - { - if ( inlineList != 0 ) { - inlineList->empty(); - delete inlineList; - } - } - - InputLoc loc; - GenInlineList *inlineList; -}; - -/* Element in list of actions. Contains the string for the code to exectute. */ -struct GenAction -: - public DListEl<GenAction> -{ - GenAction( ) - : - inlineList(0), - actionId(0), - numTransRefs(0), - numToStateRefs(0), - numFromStateRefs(0), - numEofRefs(0), - numNfaPushRefs(0), - numNfaRestoreRefs(0), - numNfaPopActionRefs(0), - numNfaPopTestRefs(0) - { - } - - ~GenAction() - { - if ( inlineList != 0 ) { - inlineList->empty(); - delete inlineList; - } - } - - /* Data collected during parse. */ - InputLoc loc; - std::string name; - GenInlineList *inlineList; - int actionId; - - string nameOrLoc(); - - /* Number of references in the final machine. */ - int numRefs() - { return numTransRefs + numToStateRefs + numFromStateRefs + numEofRefs; } - int numTransRefs; - int numToStateRefs; - int numFromStateRefs; - int numEofRefs; - int numNfaPushRefs; - int numNfaRestoreRefs; - int numNfaPopActionRefs; - int numNfaPopTestRefs; -}; - - -/* Forwards. */ -struct RedStateAp; -struct StateAp; - -/* Transistion GenAction Element. */ -typedef SBstMapEl< int, GenAction* > GenActionTableEl; - -/* Transition GenAction Table. */ -struct GenActionTable - : public SBstMap< int, GenAction*, CmpOrd<int> > -{ - void setAction( int ordering, GenAction *action ); - void setActions( int *orderings, GenAction **actions, int nActs ); - void setActions( const GenActionTable &other ); -}; - -/* Compare of a whole action table element (key & value). */ -struct CmpGenActionTableEl -{ - static int compare( const GenActionTableEl &action1, - const GenActionTableEl &action2 ) - { - if ( action1.key < action2.key ) - return -1; - else if ( action1.key > action2.key ) - return 1; - else if ( action1.value < action2.value ) - return -1; - else if ( action1.value > action2.value ) - return 1; - return 0; - } -}; - -/* Compare for GenActionTable. */ -typedef CmpSTable< GenActionTableEl, CmpGenActionTableEl > CmpGenActionTable; - -/* Set of states. */ -typedef BstSet<RedStateAp*> RedStateSet; -typedef BstSet<int> IntSet; - -/* Reduced action. */ -struct RedAction -: - public AvlTreeEl<RedAction> -{ - RedAction( ) - : - key(), - eofRefs(0), - numTransRefs(0), - numToStateRefs(0), - numFromStateRefs(0), - numEofRefs(0), - numNfaPushRefs(0), - numNfaRestoreRefs(0), - numNfaPopActionRefs(0), - numNfaPopTestRefs(0), - bAnyNextStmt(false), - bAnyCurStateRef(false), - bAnyBreakStmt(false), - bUsingAct(false) - { } - - const GenActionTable &getKey() - { return key; } - - GenActionTable key; - int actListId; - int location; - IntSet *eofRefs; - - /* Number of references in the final machine. */ - int numRefs() - { return numTransRefs + numToStateRefs + numFromStateRefs + numEofRefs; } - int numTransRefs; - int numToStateRefs; - int numFromStateRefs; - int numEofRefs; - int numNfaPushRefs; - int numNfaRestoreRefs; - int numNfaPopActionRefs; - int numNfaPopTestRefs; - - bool anyNextStmt() { return bAnyNextStmt; } - bool anyCurStateRef() { return bAnyCurStateRef; } - bool anyBreakStmt() { return bAnyBreakStmt; } - bool usingAct() { return bUsingAct; } - - bool bAnyNextStmt; - bool bAnyCurStateRef; - bool bAnyBreakStmt; - bool bUsingAct; -}; - -typedef AvlTree<RedAction, GenActionTable, CmpGenActionTable> GenActionTableMap; - -struct RedCondPair -{ - int id; - RedStateAp *targ; - RedAction *action; -}; - -struct RedCondAp -: - public AvlTreeEl<RedCondAp> -{ - RedCondAp( RedStateAp *targ, RedAction *action, int id ) - { - p.id = id; - p.targ = targ; - p.action = action; - } - - RedCondPair p; -}; - -struct RedCondEl -{ - CondKey key; - RedCondAp *value; -}; - -struct CmpRedCondEl -{ - static int compare( const RedCondEl &el1, const RedCondEl &el2 ) - { - if ( el1.key < el2.key ) - return -1; - else if ( el1.key > el2.key ) - return 1; - else if ( el1.value < el2.value ) - return -1; - else if ( el1.value > el2.value ) - return 1; - else - return 0; - } -}; - -typedef Vector< GenAction* > GenCondSet; - -struct GenCondSpace -{ - GenCondSpace() - : - numTransRefs(0), - numNfaRefs(0) - {} - - Key baseKey; - GenCondSet condSet; - int condSpaceId; - - long fullSize() - { return ( 1 << condSet.length() ); } - - long numTransRefs; - long numNfaRefs; - - GenCondSpace *next, *prev; -}; - -typedef DList<GenCondSpace> CondSpaceList; - -struct RedCondVect -{ - int numConds; - RedCondEl *outConds; - RedCondAp *errCond; -}; - -/* Reduced transition. */ -struct RedTransAp -: - public AvlTreeEl<RedTransAp> -{ - RedTransAp( int id, GenCondSpace *condSpace, - RedCondEl *outConds, int numConds, RedCondAp *errCond ) - : - id(id), - condSpace(condSpace) - { - v.outConds = outConds; - v.numConds = numConds; - v.errCond = errCond; - } - - RedTransAp( int id, int condId, RedStateAp *targ, RedAction *action ) - : - id(id), - condSpace(0) - { - p.id = condId; - p.targ = targ; - p.action = action; - } - - long condFullSize() - { - return condSpace == 0 ? 1 : condSpace->fullSize(); - } - - CondKey outCondKey( int off ) - { - return condSpace == 0 ? CondKey(0) : v.outConds[off].key; - } - - RedCondPair *outCond( int off ) - { - return condSpace == 0 ? &p : &v.outConds[off].value->p; - } - - int numConds() - { - return condSpace == 0 ? 1 : v.numConds; - } - - RedCondPair *errCond() - { - return condSpace == 0 ? 0 : ( v.errCond != 0 ? &v.errCond->p : 0 ); - } - - int id; - GenCondSpace *condSpace; - - /* Either a pair or a vector of conds. */ - union - { - RedCondPair p; - RedCondVect v; - }; -}; - -/* Compare of transitions for the final reduction of transitions. Comparison - * is on target and the pointer to the shared action table. It is assumed that - * when this is used the action tables have been reduced. */ -struct CmpRedTransAp -{ - static int compare( const RedTransAp &t1, const RedTransAp &t2 ) - { - if ( t1.condSpace < t2.condSpace ) - return -1; - else if ( t1.condSpace > t2.condSpace ) - return 1; - else { - if ( t1.condSpace == 0 ) { - if ( t1.p.targ < t2.p.targ ) - return -1; - else if ( t1.p.targ > t2.p.targ ) - return 1; - else if ( t1.p.action < t2.p.action ) - return -1; - else if ( t1.p.action > t2.p.action ) - return 1; - else - return 0; - - } - else { - if ( t1.v.numConds < t2.v.numConds ) - return -1; - else if ( t1.v.numConds > t2.v.numConds ) - return 1; - else - { - RedCondEl *i1 = t1.v.outConds, *i2 = t2.v.outConds; - long len = t1.v.numConds, cmpResult; - for ( long pos = 0; pos < len; - pos += 1, i1 += 1, i2 += 1 ) - { - cmpResult = CmpRedCondEl::compare(*i1, *i2); - if ( cmpResult != 0 ) - return cmpResult; - } - return 0; - } - } - } - } -}; - -struct CmpRedCondAp -{ - static int compare( const RedCondAp &t1, const RedCondAp &t2 ) - { - if ( t1.p.targ < t2.p.targ ) - return -1; - else if ( t1.p.targ > t2.p.targ ) - return 1; - else if ( t1.p.action < t2.p.action ) - return -1; - else if ( t1.p.action > t2.p.action ) - return 1; - else - return 0; - } -}; - -typedef AvlBasic<RedTransAp, CmpRedTransAp> TransApSet; -typedef AvlBasic<RedCondAp, CmpRedCondAp> CondApSet; - -/* Element in out range. */ -struct RedTransEl -{ - /* Constructors. */ - RedTransEl( Key lowKey, Key highKey, RedTransAp *value ) - : - lowKey(lowKey), - highKey(highKey), - value(value) -#ifdef SCORE_ORDERING - , score(0) -#endif - { } - - Key lowKey, highKey; - RedTransAp *value; -#ifdef SCORE_ORDERING - long long score; -#endif -}; - -typedef Vector<RedTransEl> RedTransList; -typedef Vector<RedStateAp*> RedStateVect; - -typedef BstMapEl<RedStateAp*, unsigned long long> RedSpanMapEl; -typedef BstMap<RedStateAp*, unsigned long long> RedSpanMap; - -/* Compare used by span map sort. Reverse sorts by the span. */ -struct CmpRedSpanMapEl -{ - static int compare( const RedSpanMapEl &smel1, const RedSpanMapEl &smel2 ) - { - if ( smel1.value > smel2.value ) - return -1; - else if ( smel1.value < smel2.value ) - return 1; - else - return 0; - } -}; - -/* Sorting state-span map entries by span. */ -typedef MergeSort<RedSpanMapEl, CmpRedSpanMapEl> RedSpanMapSort; - -/* Set of entry ids that go into this state. */ -typedef Vector<int> EntryIdVect; -typedef Vector<char*> EntryNameVect; - -struct Condition -{ - Condition( ) - : key(0), baseKey(0) {} - - Key key; - Key baseKey; - GenCondSet condSet; - - Condition *next, *prev; -}; -typedef DList<Condition> ConditionList; - -struct GenStateCond -{ - Key lowKey; - Key highKey; - - GenCondSpace *condSpace; - - GenStateCond *prev, *next; -}; -typedef DList<GenStateCond> GenStateCondList; -typedef Vector<GenStateCond*> StateCondVect; - -struct RedNfaTarg -{ - RedNfaTarg( RedStateAp *state, RedAction *push, - RedAction *popTest, int order ) - : - id(0), - state(state), - push(push), - popTest(popTest), - order(order) - {} - - long id; - RedStateAp *state; - RedAction *push; - RedAction *popTest; - int order; -}; - -struct RedNfaTargCmp -{ - static inline long compare( const RedNfaTarg &k1, const RedNfaTarg &k2 ) - { - if ( k1.order < k2.order ) - return -1; - else if ( k1.order > k2.order ) - return 1; - return 0; - } -}; - -typedef Vector<RedNfaTarg> RedNfaTargs; - -/* Reduced state. */ -struct RedStateAp -{ - RedStateAp() - : - defTrans(0), - transList(0), - isFinal(false), - labelNeeded(false), - outNeeded(false), - onStateList(false), - onListRest(false), - toStateAction(0), - fromStateAction(0), - eofAction(0), - eofTrans(0), - id(0), - bAnyRegCurStateRef(false), - partitionBoundary(false), - inConds(0), - numInConds(0), - inCondTests(0), - numInCondTests(0), - nfaTargs(0), - outCondSpace(0) - { } - - /* Transitions out. */ - RedTransList outSingle; - RedTransList outRange; - RedTransAp *defTrans; - - /* For flat keys. */ - Key lowKey, highKey; - RedTransAp **transList; - long long low, high; - - /* The list of states that transitions from this state go to. */ - RedStateVect targStates; - - bool isFinal; - bool labelNeeded; - bool outNeeded; - bool onStateList; - bool onListRest; - RedAction *toStateAction; - RedAction *fromStateAction; - RedAction *eofAction; - RedTransAp *eofTrans; - int id; - - /* Pointers for the list of states. */ - RedStateAp *prev, *next; - - bool anyRegCurStateRef() { return bAnyRegCurStateRef; } - bool bAnyRegCurStateRef; - - int partition; - bool partitionBoundary; - - RedCondPair **inConds; - int numInConds; - - RedTransAp **inCondTests; - int numInCondTests; - - RedNfaTargs *nfaTargs; - GenCondSpace *outCondSpace; - RedCondKeySet outCondKeys; -}; - -/* List of states. */ -typedef DList<RedStateAp> RedStateList; - -/* Set of reduced transitons. Comparison is by pointer. */ -typedef BstSet< RedTransAp*, CmpOrd<RedTransAp*> > RedTransSet; - -/* Next version of the fsm machine. */ -struct RedFsmAp -{ - RedFsmAp( FsmCtx *fsmCtx, int machineId ); - ~RedFsmAp(); - - KeyOps *keyOps; - FsmCtx *fsmCtx; - int machineId; - - bool forcedErrorState; - - int nextActionId; - int nextTransId; - int nextCondId; - - /* Next State Id doubles as the total number of state ids. */ - int nextStateId; - - TransApSet transSet; - CondApSet condSet; - GenActionTableMap actionMap; - RedStateList stateList; - RedStateSet entryPoints; - RedStateAp *startState; - RedStateAp *errState; - RedTransAp *errTrans; - RedCondAp *errCond; - RedTransAp *errActionTrans; - RedStateAp *firstFinState; - RedStateAp *allStates; - int numFinStates; - int nParts; - - bool bAnyToStateActions; - bool bAnyFromStateActions; - bool bAnyRegActions; - bool bAnyEofActions; - bool bAnyEofTrans; - bool bAnyEofActivity; - bool bAnyActionGotos; - bool bAnyActionCalls; - bool bAnyActionNcalls; - bool bAnyActionRets; - bool bAnyActionNrets; - bool bAnyActionByValControl; - bool bAnyRegActionRets; - bool bAnyRegActionByValControl; - bool bAnyRegNextStmt; - bool bAnyRegCurStateRef; - bool bAnyRegBreak; - bool bAnyRegNbreak; - bool bUsingAct; - bool bAnyNfaStates; - bool bAnyNfaPushPops; - bool bAnyNfaPushes; - bool bAnyNfaPops; - bool bAnyTransCondRefs; - bool bAnyNfaCondRefs; - - int maxState; - int maxSingleLen; - int maxRangeLen; - int maxKeyOffset; - int maxIndexOffset; - int maxIndex; - int maxActListId; - int maxActionLoc; - int maxActArrItem; - unsigned long long maxSpan; - int maxFlatIndexOffset; - Key maxKey; - int maxCondSpaceId; - int maxCond; - - bool anyActions(); - bool anyToStateActions() { return bAnyToStateActions; } - bool anyFromStateActions() { return bAnyFromStateActions; } - bool anyRegActions() { return bAnyRegActions; } - bool anyEofActions() { return bAnyEofActions; } - bool anyEofTrans() { return bAnyEofTrans; } - bool anyEofActivity() { return bAnyEofActivity; } - bool anyActionGotos() { return bAnyActionGotos; } - bool anyActionCalls() { return bAnyActionCalls; } - bool anyActionNcalls() { return bAnyActionNcalls; } - bool anyActionRets() { return bAnyActionRets; } - bool anyActionNrets() { return bAnyActionNrets; } - bool anyActionByValControl() { return bAnyActionByValControl; } - bool anyRegActionRets() { return bAnyRegActionRets; } - bool anyRegActionByValControl() { return bAnyRegActionByValControl; } - bool anyRegNextStmt() { return bAnyRegNextStmt; } - bool anyRegCurStateRef() { return bAnyRegCurStateRef; } - bool anyRegBreak() { return bAnyRegBreak; } - bool usingAct() { return bUsingAct; } - bool anyRegNbreak() { return bAnyRegNbreak; } - bool anyNfaStates() { return bAnyNfaStates; } - - /* Is is it possible to extend a range by bumping ranges that span only - * one character to the singles array. */ - bool canExtend( const RedTransList &list, int pos ); - - /* Pick single transitions from the ranges. */ - void moveSelectTransToSingle( RedStateAp *state ); - void moveAllTransToSingle( RedStateAp *state ); - - void moveSelectTransToSingle(); - void moveAllTransToSingle(); - - void makeFlat(); - - /* State low/high, in key space and class space. */ - Key lowKey; - Key highKey; - long long nextClass; - long long *classMap; - - /* Support structs for equivalence class computation. */ - struct EquivClass - { - EquivClass( Key lowKey, Key highKey, long long value ) - : lowKey(lowKey), highKey(highKey), value(value) {} - - Key lowKey, highKey; - long long value; - EquivClass *prev, *next; - }; - - typedef DList<EquivClass> EquivList; - typedef BstMap<RedTransAp*, int> EquivAlloc; - typedef BstMapEl<RedTransAp*, int> EquivAllocEl; - - struct PairKey - { - PairKey( long long k1, long long k2 ) - : k1(k1), k2(k2) {} - - long long k1; - long long k2; - }; - - struct PairKeyCmp - { - static inline long compare( const PairKey &k1, const PairKey &k2 ) - { - if ( k1.k1 < k2.k1 ) - return -1; - else if ( k1.k1 > k2.k1 ) - return 1; - if ( k1.k2 < k2.k2 ) - return -1; - else if ( k1.k2 > k2.k2 ) - return 1; - else - return 0; - } - }; - - typedef BstMap< PairKey, long long, PairKeyCmp > PairKeyMap; - typedef BstMapEl< PairKey, long long > PairKeyMapEl; - - void characterClass( EquivList &equiv ); - void makeFlatClass(); - - /* Move a selected transition from ranges to default. */ - void moveToDefault( RedTransAp *defTrans, RedStateAp *state ); - - /* Pick a default transition by largest span. */ - RedTransAp *chooseDefaultSpan( RedStateAp *state ); - void chooseDefaultSpan(); - - /* Pick a default transition by most number of ranges. */ - RedTransAp *chooseDefaultNumRanges( RedStateAp *state ); - void chooseDefaultNumRanges(); - - /* Pick a default transition tailored towards goto driven machine. */ - RedTransAp *chooseDefaultGoto( RedStateAp *state ); - void chooseDefaultGoto(); - - /* Ordering states by transition connections. */ - void optimizeStateOrdering( RedStateAp *state ); - void optimizeStateOrdering(); - - /* Ordering states by transition connections. */ - void depthFirstOrdering( RedStateAp *state ); - void depthFirstOrdering(); - - void breadthFirstAdd( RedStateAp *state ); - void breadthFirstOrdering(); - - void randomizedOrdering(); - -#ifdef SCORE_ORDERING - long **scores; - void scoreSecondPass( RedStateAp *state ); - void scoreOrderingBreadth(); - void readScores(); - void scoreOrderingDepth( RedStateAp *state ); - void scoreOrderingDepth(); -#endif - - /* Set state ids. */ - void sequentialStateIds(); - void sortStateIdsByFinal(); - - /* Arrange states in by final id. This is a stable sort. */ - void sortStatesByFinal(); - - /* Sorting states by id. */ - void sortByStateId(); - - /* Locating the first final state. This is the final state with the lowest - * id. */ - void findFirstFinState(); - - void assignActionLocs(); - - RedCondAp *getErrorCond(); - RedTransAp *getErrorTrans(); - RedStateAp *getErrorState(); - - /* Is every char in the alphabet covered? */ - bool alphabetCovered( RedTransList &outRange ); - - RedTransAp *allocateTrans( RedStateAp *targ, RedAction *action ); - RedTransAp *allocateTrans( GenCondSpace *condSpace, - RedCondEl *outConds, int numConds, RedCondAp *errCond ); - - RedCondAp *allocateCond( RedStateAp *targState, RedAction *actionTable ); - - void partitionFsm( int nParts ); - - void setInTrans(); -}; - -#endif |