in blingfiretools/fa_fsm2fsm/fa_fsm2fsm.cpp [154:352]
int __cdecl main (int argc, char** argv)
{
__PROG__ = argv [0];
--argc, ++argv;
::FAIOSetup ();
// parse a command line
process_args (argc, argv);
try {
// select in/out streams
std::istream * pIs = &std::cin;
std::ifstream ifs;
std::ostream * pOs = &std::cout;
std::ofstream ofs;
std::ostream * pTrBrOs = NULL;
std::ofstream trbr_ofs;
if (NULL != pInFile) {
ifs.open (pInFile, std::ios::in);
FAAssertStream (&ifs, pInFile);
pIs = &ifs;
}
if (NULL != pOutFile) {
ofs.open (pOutFile, std::ios::out);
pOs = &ofs;
}
if (NULL != pTrBrFile) {
trbr_ofs.open (pTrBrFile, std::ios::out);
pTrBrOs = &trbr_ofs;
}
DebugLogAssert (pIs);
DebugLogAssert (pOs);
// create all possible automata
FARSNfa_ar_judy rs_nfa (&g_alloc);
FARSNfa_wo_ro rs_nfa_wo_ro (&g_alloc);
FARSDfa_ro rs_dfa (&g_alloc);
FARSDfa_ro moore_dfa (&g_alloc);
FAState2Ow moore_ows (&g_alloc);
FARSDfa_ro moore_mdfa_dfa (&g_alloc);
FAState2Ows moore_mdfa_ows (&g_alloc);
FAMealyNfa mealy_nfa_ows (&g_alloc);
// read in specified automaton
if (0 == strcmp (pInType, "rs-nfa")) {
g_io.Read (*pIs, &rs_nfa);
} else if (0 == strcmp (pInType, "rs-dfa")) {
g_io.Read (*pIs, &rs_dfa);
} else if (0 == strcmp (pInType, "moore-dfa")) {
g_io.Read (*pIs, &moore_dfa, &moore_ows);
} else if (0 == strcmp (pInType, "moore-mdfa")) {
g_io.Read (*pIs, &moore_mdfa_dfa, &moore_mdfa_ows);
}
// make convertions
const FARSNfaA * pOutNfa = NULL;
const FARSDfaA * pOutDfa = NULL;
const FAState2OwA * pState2Ow = NULL;
const FAState2OwsA * pState2Ows = NULL;
const FAMealyNfaA * pMealyOws = NULL;
if (0 == strcmp (pInType, "rs-nfa") &&
0 == strcmp (pOutType, "rs-nfa")) {
pOutNfa = &rs_nfa;
} else if (0 == strcmp (pInType, "rs-dfa") &&
0 == strcmp (pOutType, "rs-dfa")) {
pOutDfa = &rs_dfa;
} else if (0 == strcmp (pInType, "moore-dfa") &&
0 == strcmp (pOutType, "moore-dfa")) {
pOutDfa = &moore_dfa;
pState2Ow = &moore_ows;
} else if (0 == strcmp (pInType, "moore-mdfa") &&
0 == strcmp (pOutType, "moore-mdfa")) {
pOutDfa = &moore_mdfa_dfa;
pState2Ows = &moore_mdfa_ows;
} else if (0 == strcmp (pInType, "rs-dfa") &&
0 == strcmp (pOutType, "moore-dfa")) {
FARSDfa2MooreDfa rs2moore (&g_alloc);
rs2moore.SetRSDfa (&rs_dfa);
rs2moore.SetMooreDfa (&moore_dfa);
rs2moore.SetState2Ow (&moore_ows);
rs2moore.SetOwsRange (g_OwBase, g_OwMax);
rs2moore.SetKeepOws (g_keep_ows);
rs2moore.Process ();
pOutDfa = &moore_dfa;
pState2Ow = &moore_ows;
} else if (0 == strcmp (pInType, "rs-dfa") &&
0 == strcmp (pOutType, "moore-mdfa")) {
FARSDfa2MooreDfa rs2moore (&g_alloc);
rs2moore.SetRSDfa (&rs_dfa);
rs2moore.SetMooreDfa (&moore_mdfa_dfa);
rs2moore.SetState2Ows (&moore_mdfa_ows);
rs2moore.SetOwsRange (g_OwBase, g_OwMax);
rs2moore.SetKeepOws (g_keep_ows);
rs2moore.Process ();
pOutDfa = &moore_mdfa_dfa;
pState2Ows = &moore_mdfa_ows;
} else if (0 == strcmp (pInType, "rs-dfa") &&
0 == strcmp (pOutType, "mealy-nfa")) {
FADfa2MealyNfa dfa2mealy (&g_alloc);
dfa2mealy.SetInDfa (&rs_dfa);
dfa2mealy.SetOutNfa (&rs_nfa_wo_ro, &mealy_nfa_ows);
dfa2mealy.Process ();
pOutNfa = &rs_nfa_wo_ro;
pMealyOws = &mealy_nfa_ows;
} else if (0 == strcmp (pInType, "rs-nfa") &&
0 == strcmp (pOutType, "mealy-nfa")) {
FATrBrNfa2MealyNfa nfa2mealy (&g_alloc);
nfa2mealy.SetEpsilonIw (FAFsmConst::IW_EPSILON);
nfa2mealy.SetInNfa (&rs_nfa);
nfa2mealy.SetOutNfa (&rs_nfa, &mealy_nfa_ows);
nfa2mealy.SetTrBrBaseIw (g_OwBase);
nfa2mealy.SetTrBrMaxIw (g_OwMax);
nfa2mealy.Process ();
pOutNfa = &rs_nfa;
pMealyOws = &mealy_nfa_ows;
if (pTrBrOs) {
const FAMultiMapA * pOw2TrBrs = nfa2mealy.GetOw2TrBrMap ();
if (!::FAIsEmpty (pOw2TrBrs)) {
g_map_io.Print (*pTrBrOs, pOw2TrBrs);
}
}
} else {
std::cerr << "ERROR: \"Unsupported convertion type\""
<< " in program " << __PROG__ << '\n';
return 1;
}
// write down specified automaton
if (0 == strcmp (pOutType, "rs-nfa")) {
g_io.Print (*pOs, pOutNfa);
} else if (0 == strcmp (pOutType, "rs-dfa")) {
g_io.Print (*pOs, pOutDfa);
} else if (0 == strcmp (pOutType, "moore-dfa")) {
g_io.Print (*pOs, pOutDfa, pState2Ow);
} else if (0 == strcmp (pOutType, "moore-mdfa")) {
g_io.Print (*pOs, pOutDfa, pState2Ows);
} else if (0 == strcmp (pOutType, "mealy-nfa")) {
g_io.Print (*pOs, pOutNfa, pMealyOws);
}
} catch (const FAException & e) {
const char * const pErrMsg = e.GetErrMsg ();
const char * const pFile = e.GetSourceName ();
const int Line = e.GetSourceLine ();
std::cerr << "ERROR: " << pErrMsg << " in " << pFile \
<< " at line " << Line << " in program " << __PROG__ << '\n';
return 2;
} catch (...) {
std::cerr << "ERROR: Unknown error in program " << __PROG__ << '\n';
return 1;
}
return 0;
}