MimIR
MimIR is my Intermediate Representation
Loading...
Searching...
No Matches
lower_regex.cpp
Go to the documentation of this file.
2
3#include <automaton/dfa.h>
4#include <automaton/dfamin.h>
5#include <automaton/nfa2dfa.h>
6
7#include <mim/def.h>
8
11#include <mim/plug/mem/mem.h>
12
16
17// clang-format off
18template<> struct std::formatter<automaton::DFA> : fe::ostream_formatter {};
19template<> struct std::formatter<automaton::NFA> : fe::ostream_formatter {};
20// clang-format on
21
22namespace mim::plug::regex {
23
24namespace {
25const Def* wrap_in_cps2ds(const Def* callee) { return direct::op_cps2ds_dep(callee); }
26} // namespace
27
28const Def* LowerRegex::rewrite(const Def* def) {
29 const Def* new_app = def;
30
31 if (auto app = def->isa<App>()) {
32 auto callee = app->callee();
35 || Axm::isa<quant>(callee) || Axm::isa<regex::empty>(callee)) {
36 const auto n = app->arg();
37 auto nfa = regex2nfa(callee);
38 DLOG("nfa: {}", *nfa);
39
40 auto dfa = automaton::nfa2dfa(*nfa);
41 DLOG("dfa: {}", *dfa);
42
43 auto min_dfa = automaton::minimize_dfa(*dfa);
44 new_app = wrap_in_cps2ds(dfa2matcher(world(), *min_dfa, n));
45 }
46 }
47
48 return new_app;
49}
50
51} // namespace mim::plug::regex
static auto isa(const Def *def)
Definition axm.h:107
Base class for all Defs.
Definition def.h:246
World & world()
Definition pass.h:77
const Def * rewrite(const Def *) override
const mim::Def * dfa2matcher(mim::World &, const automaton::DFA &, const mim::Def *)
You can dl::get this function.
#define DLOG(...)
Vaporizes to nothingness in Debug build.
Definition log.h:94
std::unique_ptr< DFA > minimize_dfa(const DFA &dfa)
Definition dfamin.cpp:115
std::unique_ptr< DFA > nfa2dfa(const NFA &nfa)
Definition nfa2dfa.cpp:33
const Def * op_cps2ds_dep(const Def *k)
Definition direct.h:16
The regex Plugin
Definition lower_regex.h:5
std::unique_ptr< automaton::NFA > regex2nfa(const Def *regex)