#include "Lexesis/automata.h" #include "Lexesis/driver.h" #include "Lexesis/re.h" #include #include #include #include #include int main(int argc, char** argv) { assert(argc == 3); std::vector > regexes; std::string testname = argv[1]; std::string outputdir = argv[2]; std::string line; std::ofstream reOut(outputdir + "/" + testname + ".re"); while (getline(std::cin, line)) { std::shared_ptr re = lxs::parseRE(line); reOut << re->toRe() << std::endl; regexes.push_back(re); } reOut.close(); std::vector enfas; for (std::size_t i = 0; i < regexes.size(); i++) { lxs::ENFA enfa; regexes[i]->toENFA(enfa, 0); enfa.numStates++; enfa.starting = 0; enfa.priority[*enfa.accepting.begin()] = i; enfa.acceptingToken[*enfa.accepting.begin()] = std::to_string(i); enfas.push_back(enfa); } lxs::ENFA merged = lxs::merge(enfas); std::ofstream enfaOut(outputdir + "/" + testname + ".enfa"); enfaOut << lxs::toDot(merged) << std::endl; enfaOut.close(); lxs::DFA dfa = lxs::mssc(merged); std::ofstream msscOut(outputdir + "/" + testname + ".mssc"); msscOut << lxs::toDot(dfa) << std::endl; msscOut.close(); lxs::DFA min = lxs::minimize(dfa); std::ofstream minOut(outputdir + "/" + testname + ".min"); minOut << lxs::toDot(min) << std::endl; minOut.close(); return 0; }