void FsmCodeGen::LM_SWITCH( ostream &ret, InlineItem *item, int targState, int inFinish ) { ret << " switch( " << ACT() << " ) {\n"; /* If the switch handles error then we also forced the error state. It * will exist. */ if ( item->handlesError ) { ret << " case 0: " << TOKEND() << " = " << TOKSTART() << "; "; GOTO( ret, redFsm->errState->id, inFinish ); ret << "\n"; } for ( InlineList::Iter lma = *item->children; lma.lte(); lma++ ) { /* Write the case label, the action and the case break. */ ret << " case " << lma->lmId << ":\n"; /* Write the block and close it off. */ ret << " {"; INLINE_LIST( ret, lma->children, targState, inFinish ); ret << "}\n"; ret << " break;\n"; } /* Default required for D code. */ ret << " default: break;\n" " }\n" "\t"; }
/* Write out an inline tree structure. Walks the list and possibly calls out * to virtual functions than handle language specific items in the tree. */ void FsmCodeGen::INLINE_LIST( ostream &ret, InlineList *inlineList, int targState, bool inFinish ) { for ( InlineList::Iter item = *inlineList; item.lte(); item++ ) { switch ( item->type ) { case InlineItem::Text: ret << item->data; break; case InlineItem::Goto: GOTO( ret, item->targState->id, inFinish ); break; case InlineItem::Call: CALL( ret, item->targState->id, targState, inFinish ); break; case InlineItem::Next: NEXT( ret, item->targState->id, inFinish ); break; case InlineItem::Ret: RET( ret, inFinish ); break; case InlineItem::PChar: ret << P(); break; case InlineItem::Char: ret << GET_KEY(); break; case InlineItem::Hold: ret << P() << "--;"; break; case InlineItem::Exec: EXEC( ret, item, targState, inFinish ); break; case InlineItem::HoldTE: ret << TOKEND() << "--;"; break; case InlineItem::ExecTE: EXECTE( ret, item, targState, inFinish ); break; case InlineItem::Curs: CURS( ret, inFinish ); break; case InlineItem::Targs: TARGS( ret, inFinish, targState ); break; case InlineItem::Entry: ret << item->targState->id; break; case InlineItem::GotoExpr: GOTO_EXPR( ret, item, inFinish ); break; case InlineItem::CallExpr: CALL_EXPR( ret, item, targState, inFinish ); break; case InlineItem::NextExpr: NEXT_EXPR( ret, item, inFinish ); break; case InlineItem::LmSwitch: LM_SWITCH( ret, item, targState, inFinish ); break; case InlineItem::LmSetActId: SET_ACT( ret, item ); break; case InlineItem::LmSetTokEnd: SET_TOKEND( ret, item ); break; case InlineItem::LmGetTokEnd: GET_TOKEND( ret, item ); break; case InlineItem::LmInitTokStart: INIT_TOKSTART( ret, item ); break; case InlineItem::LmInitAct: INIT_ACT( ret, item ); break; case InlineItem::LmSetTokStart: SET_TOKSTART( ret, item ); break; case InlineItem::SubAction: SUB_ACTION( ret, item, targState, inFinish ); break; case InlineItem::Break: BREAK( ret, targState ); break; } } }
void BackendGen::makeGenInlineList( GenInlineList *outList, InlineList *inList ) { for ( InlineList::Iter item = *inList; item.lte(); item++ ) { switch ( item->type ) { case InlineItem::Text: makeText( outList, item ); break; case InlineItem::Goto: makeTargetItem( outList, item->nameTarg, GenInlineItem::Goto ); break; case InlineItem::GotoExpr: makeSubList( outList, item->children, GenInlineItem::GotoExpr ); break; case InlineItem::Call: makeTargetItem( outList, item->nameTarg, GenInlineItem::Call ); break; case InlineItem::CallExpr: makeSubList( outList, item->children, GenInlineItem::CallExpr ); break; case InlineItem::Next: makeTargetItem( outList, item->nameTarg, GenInlineItem::Next ); break; case InlineItem::NextExpr: makeSubList( outList, item->children, GenInlineItem::NextExpr ); break; case InlineItem::Break: outList->append( new GenInlineItem( InputLoc(), GenInlineItem::Break ) ); break; case InlineItem::Ret: outList->append( new GenInlineItem( InputLoc(), GenInlineItem::Ret ) ); break; case InlineItem::PChar: outList->append( new GenInlineItem( InputLoc(), GenInlineItem::PChar ) ); break; case InlineItem::Char: outList->append( new GenInlineItem( InputLoc(), GenInlineItem::Char ) ); break; case InlineItem::Curs: outList->append( new GenInlineItem( InputLoc(), GenInlineItem::Curs ) ); break; case InlineItem::Targs: outList->append( new GenInlineItem( InputLoc(), GenInlineItem::Targs ) ); break; case InlineItem::Entry: makeTargetItem( outList, item->nameTarg, GenInlineItem::Entry ); break; case InlineItem::Hold: outList->append( new GenInlineItem( InputLoc(), GenInlineItem::Hold ) ); break; case InlineItem::Exec: makeSubList( outList, item->children, GenInlineItem::Exec ); break; case InlineItem::LmSetActId: makeSetAct( outList, item->longestMatchPart->longestMatchId ); break; case InlineItem::LmSetTokEnd: makeSetTokend( outList, 1 ); break; case InlineItem::LmOnLast: makeLmOnLast( outList, item ); break; case InlineItem::LmOnNext: makeLmOnNext( outList, item ); break; case InlineItem::LmOnLagBehind: makeLmOnLagBehind( outList, item ); break; case InlineItem::LmSwitch: makeLmSwitch( outList, item ); break; case InlineItem::LmInitAct: outList->append( new GenInlineItem( InputLoc(), GenInlineItem::LmInitAct ) ); break; case InlineItem::LmInitTokStart: outList->append( new GenInlineItem( InputLoc(), GenInlineItem::LmInitTokStart ) ); break; case InlineItem::LmSetTokStart: outList->append( new GenInlineItem( InputLoc(), GenInlineItem::LmSetTokStart ) ); cgd->hasLongestMatch = true; break; } } }
void XMLCodeGen::writeInlineList( InlineList *inlineList ) { for ( InlineList::Iter item = *inlineList; item.lte(); item++ ) { switch ( item->type ) { case InlineItem::Text: writeText( item ); break; case InlineItem::Goto: writeGoto( item ); break; case InlineItem::GotoExpr: writeGotoExpr( item ); break; case InlineItem::Call: writeCall( item ); break; case InlineItem::CallExpr: writeCallExpr( item ); break; case InlineItem::Next: writeNext( item ); break; case InlineItem::NextExpr: writeNextExpr( item ); break; case InlineItem::Break: out << "<break></break>"; break; case InlineItem::Ret: out << "<ret></ret>"; break; case InlineItem::PChar: out << "<pchar></pchar>"; break; case InlineItem::Char: out << "<char></char>"; break; case InlineItem::Curs: out << "<curs></curs>"; break; case InlineItem::Targs: out << "<targs></targs>"; break; case InlineItem::Entry: writeEntry( item ); break; case InlineItem::Hold: out << "<hold></hold>"; break; case InlineItem::Exec: writeActionExec( item ); break; case InlineItem::LmSetActId: out << "<set_act>" << item->longestMatchPart->longestMatchId << "</set_act>"; break; case InlineItem::LmSetTokEnd: out << "<set_tokend>1</set_tokend>"; break; case InlineItem::LmOnLast: writeLmOnLast( item ); break; case InlineItem::LmOnNext: writeLmOnNext( item ); break; case InlineItem::LmOnLagBehind: writeLmOnLagBehind( item ); break; case InlineItem::LmSwitch: writeLmSwitch( item ); break; case InlineItem::LmInitAct: out << "<init_act></init_act>"; break; case InlineItem::LmInitTokStart: out << "<init_tokstart></init_tokstart>"; break; case InlineItem::LmSetTokStart: out << "<set_tokstart></set_tokstart>"; break; } } }