diff options
author | Adrian Thurston <thurston@complang.org> | 2014-11-26 16:20:57 -0500 |
---|---|---|
committer | Adrian Thurston <thurston@complang.org> | 2014-11-26 16:20:57 -0500 |
commit | 2efb22221312d7eef584003ed9e703e819053163 (patch) | |
tree | a011ff6cdfd6e664ba4cb5c03f13acf297a47a15 /ragel/cdtable.cpp | |
parent | 3242fcd9f0a3bf1a986b2b94fb8f8837ac370145 (diff) | |
download | ragel-2efb22221312d7eef584003ed9e703e819053163.tar.gz |
remaing C/D table codegens using table array wrapper
Diffstat (limited to 'ragel/cdtable.cpp')
-rw-r--r-- | ragel/cdtable.cpp | 135 |
1 files changed, 81 insertions, 54 deletions
diff --git a/ragel/cdtable.cpp b/ragel/cdtable.cpp index ade15522..ac1c94fd 100644 --- a/ragel/cdtable.cpp +++ b/ragel/cdtable.cpp @@ -59,7 +59,7 @@ std::ostream &TabCodeGen::TO_STATE_ACTION( RedStateAp *state ) int act = 0; if ( state->toStateAction != 0 ) act = state->toStateAction->location+1; - out << act; + taTSA.VAL( act ); return out; } @@ -68,7 +68,7 @@ std::ostream &TabCodeGen::FROM_STATE_ACTION( RedStateAp *state ) int act = 0; if ( state->fromStateAction != 0 ) act = state->fromStateAction->location+1; - out << act; + taFSA.VAL( act ); return out; } @@ -77,7 +77,7 @@ std::ostream &TabCodeGen::EOF_ACTION( RedStateAp *state ) int act = 0; if ( state->eofAction != 0 ) act = state->eofAction->location+1; - out << act; + taEA.VAL( act ); return out; } @@ -88,7 +88,7 @@ std::ostream &TabCodeGen::TRANS_ACTION( RedTransAp *trans ) int act = 0; if ( trans->action != 0 ) act = trans->action->location+1; - out << act; + taTA.VAL( act ); return out; } @@ -311,6 +311,8 @@ std::ostream &TabCodeGen::RANGE_LENS() std::ostream &TabCodeGen::TO_STATE_ACTIONS() { + taTSA.OPEN( ARRAY_TYPE(redFsm->maxActionLoc) ); + out << "\t"; int totalStateNum = 0; for ( RedStateList::Iter st = redFsm->stateList; st.lte(); st++ ) { @@ -323,11 +325,17 @@ std::ostream &TabCodeGen::TO_STATE_ACTIONS() } } out << "\n"; + + taTSA.CLOSE(); + out << "\n"; + return out; } std::ostream &TabCodeGen::FROM_STATE_ACTIONS() { + taFSA.OPEN( ARRAY_TYPE(redFsm->maxActionLoc) ); + out << "\t"; int totalStateNum = 0; for ( RedStateList::Iter st = redFsm->stateList; st.lte(); st++ ) { @@ -340,11 +348,17 @@ std::ostream &TabCodeGen::FROM_STATE_ACTIONS() } } out << "\n"; + + taFSA.CLOSE(); + out << "\n"; + return out; } std::ostream &TabCodeGen::EOF_ACTIONS() { + taEA.OPEN( ARRAY_TYPE(redFsm->maxActionLoc) ); + out << "\t"; int totalStateNum = 0; for ( RedStateList::Iter st = redFsm->stateList; st.lte(); st++ ) { @@ -357,11 +371,17 @@ std::ostream &TabCodeGen::EOF_ACTIONS() } } out << "\n"; + + taEA.CLOSE(); + out << "\n"; + return out; } std::ostream &TabCodeGen::EOF_TRANS() { + taET.OPEN( ARRAY_TYPE(redFsm->maxIndexOffset+1) ); + out << "\t"; int totalStateNum = 0; for ( RedStateList::Iter st = redFsm->stateList; st.lte(); st++ ) { @@ -380,6 +400,9 @@ std::ostream &TabCodeGen::EOF_TRANS() } } out << "\n"; + + taET.CLOSE(); + out << "\n"; return out; } @@ -488,26 +511,31 @@ std::ostream &TabCodeGen::KEYS() std::ostream &TabCodeGen::INDICIES() { + taI.OPEN( ARRAY_TYPE(redFsm->maxIndex) ); + int totalTrans = 0; out << '\t'; for ( RedStateList::Iter st = redFsm->stateList; st.lte(); st++ ) { /* Walk the singles. */ for ( RedTransList::Iter stel = st->outSingle; stel.lte(); stel++ ) { - out << stel->value->id << ", "; + taI.VAL( stel->value->id ); + out << ", "; if ( ++totalTrans % IALL == 0 ) out << "\n\t"; } /* Walk the ranges. */ for ( RedTransList::Iter rtel = st->outRange; rtel.lte(); rtel++ ) { - out << rtel->value->id << ", "; + taI.VAL( rtel->value->id ); + out << ", "; if ( ++totalTrans % IALL == 0 ) out << "\n\t"; } /* The state's default index goes next. */ if ( st->defTrans != 0 ) { - out << st->defTrans->id << ", "; + taI.VAL( st->defTrans->id ); + out << ", "; if ( ++totalTrans % IALL == 0 ) out << "\n\t"; } @@ -515,19 +543,26 @@ std::ostream &TabCodeGen::INDICIES() /* Output one last number so we don't have to figure out when the last * entry is and avoid writing a comma. */ - out << 0 << "\n"; + taI.VAL( 0 ); + out << "\n"; + + taI.CLOSE(); + out << "\n"; return out; } std::ostream &TabCodeGen::TRANS_TARGS() { + taTT.OPEN( ARRAY_TYPE(redFsm->maxState) ); + int totalTrans = 0; out << '\t'; for ( RedStateList::Iter st = redFsm->stateList; st.lte(); st++ ) { /* Walk the singles. */ for ( RedTransList::Iter stel = st->outSingle; stel.lte(); stel++ ) { RedTransAp *trans = stel->value; - out << trans->targ->id << ", "; + taTT.VAL( trans->targ->id ); + out << ", "; if ( ++totalTrans % IALL == 0 ) out << "\n\t"; } @@ -535,7 +570,8 @@ std::ostream &TabCodeGen::TRANS_TARGS() /* Walk the ranges. */ for ( RedTransList::Iter rtel = st->outRange; rtel.lte(); rtel++ ) { RedTransAp *trans = rtel->value; - out << trans->targ->id << ", "; + taTT.VAL( trans->targ->id ); + out << ", "; if ( ++totalTrans % IALL == 0 ) out << "\n\t"; } @@ -543,7 +579,8 @@ std::ostream &TabCodeGen::TRANS_TARGS() /* The state's default target state. */ if ( st->defTrans != 0 ) { RedTransAp *trans = st->defTrans; - out << trans->targ->id << ", "; + taTT.VAL( trans->targ->id ); + out << ", "; if ( ++totalTrans % IALL == 0 ) out << "\n\t"; } @@ -554,22 +591,29 @@ std::ostream &TabCodeGen::TRANS_TARGS() if ( st->eofTrans != 0 ) { RedTransAp *trans = st->eofTrans; trans->pos = totalTrans; - out << trans->targ->id << ", "; + taTT.VAL( trans->targ->id ); + out << ", "; if ( ++totalTrans % IALL == 0 ) out << "\n\t"; } } - /* Output one last number so we don't have to figure out when the last * entry is and avoid writing a comma. */ - out << 0 << "\n"; + taTT.VAL( 0 ); + out << "\n"; + + taTT.CLOSE(); + out << "\n"; + return out; } std::ostream &TabCodeGen::TRANS_ACTIONS() { + taTA.OPEN( ARRAY_TYPE(redFsm->maxActionLoc) ); + int totalTrans = 0; out << '\t'; for ( RedStateList::Iter st = redFsm->stateList; st.lte(); st++ ) { @@ -612,11 +656,17 @@ std::ostream &TabCodeGen::TRANS_ACTIONS() /* Output one last number so we don't have to figure out when the last * entry is and avoid writing a comma. */ out << 0 << "\n"; + + taTA.CLOSE(); + out << "\n"; + return out; } std::ostream &TabCodeGen::TRANS_TARGS_WI() { + taTT.OPEN( ARRAY_TYPE(redFsm->maxState) ); + /* Transitions must be written ordered by their id. */ RedTransAp **transPtrs = new RedTransAp*[redFsm->transSet.length()]; for ( TransApSet::Iter trans = redFsm->transSet; trans.lte(); trans++ ) @@ -631,7 +681,7 @@ std::ostream &TabCodeGen::TRANS_TARGS_WI() trans->pos = t; /* Write out the target state. */ - out << trans->targ->id; + taTT.VAL( trans->targ->id ); if ( t < redFsm->transSet.length()-1 ) { out << ", "; if ( ++totalStates % IALL == 0 ) @@ -640,12 +690,18 @@ std::ostream &TabCodeGen::TRANS_TARGS_WI() } out << "\n"; delete[] transPtrs; + + taTT.CLOSE(); + out << "\n"; + return out; } std::ostream &TabCodeGen::TRANS_ACTIONS_WI() { + taTA.OPEN( ARRAY_TYPE(redFsm->maxActionLoc) ); + /* Transitions must be written ordered by their id. */ RedTransAp **transPtrs = new RedTransAp*[redFsm->transSet.length()]; for ( TransApSet::Iter trans = redFsm->transSet; trans.lte(); trans++ ) @@ -666,6 +722,10 @@ std::ostream &TabCodeGen::TRANS_ACTIONS_WI() } out << "\n"; delete[] transPtrs; + + taTA.CLOSE(); + out << "\n"; + return out; } @@ -831,64 +891,31 @@ void TabCodeGen::writeData() INDEX_OFFSETS(); if ( useIndicies ) { - OPEN_ARRAY( ARRAY_TYPE(redFsm->maxIndex), I() ); INDICIES(); - CLOSE_ARRAY() << - "\n"; - OPEN_ARRAY( ARRAY_TYPE(redFsm->maxState), TT() ); TRANS_TARGS_WI(); - CLOSE_ARRAY() << - "\n"; - if ( redFsm->anyActions() ) { - OPEN_ARRAY( ARRAY_TYPE(redFsm->maxActionLoc), TA() ); + if ( redFsm->anyActions() ) TRANS_ACTIONS_WI(); - CLOSE_ARRAY() << - "\n"; - } } else { - OPEN_ARRAY( ARRAY_TYPE(redFsm->maxState), TT() ); TRANS_TARGS(); - CLOSE_ARRAY() << - "\n"; - if ( redFsm->anyActions() ) { - OPEN_ARRAY( ARRAY_TYPE(redFsm->maxActionLoc), TA() ); + if ( redFsm->anyActions() ) TRANS_ACTIONS(); - CLOSE_ARRAY() << - "\n"; - } } - if ( redFsm->anyToStateActions() ) { - OPEN_ARRAY( ARRAY_TYPE(redFsm->maxActionLoc), TSA() ); + if ( redFsm->anyToStateActions() ) TO_STATE_ACTIONS(); - CLOSE_ARRAY() << - "\n"; - } - if ( redFsm->anyFromStateActions() ) { - OPEN_ARRAY( ARRAY_TYPE(redFsm->maxActionLoc), FSA() ); + if ( redFsm->anyFromStateActions() ) FROM_STATE_ACTIONS(); - CLOSE_ARRAY() << - "\n"; - } - if ( redFsm->anyEofActions() ) { - OPEN_ARRAY( ARRAY_TYPE(redFsm->maxActionLoc), EA() ); + if ( redFsm->anyEofActions() ) EOF_ACTIONS(); - CLOSE_ARRAY() << - "\n"; - } - if ( redFsm->anyEofTrans() ) { - OPEN_ARRAY( ARRAY_TYPE(redFsm->maxIndexOffset+1), ET() ); + if ( redFsm->anyEofTrans() ) EOF_TRANS(); - CLOSE_ARRAY() << - "\n"; - } STATE_IDS(); } |