15struct Regex2NfaConverter {
17 : nfa_(std::make_unique<automaton::NFA>()) {}
19 void add_range_transitions(automaton::NFANode* from, automaton::NFANode* to, std::uint16_t lb, std::uint16_t ub) {
23 void add_range_transitions(automaton::NFANode* from, automaton::NFANode* to,
const Def* lit0,
const Def* lit1) {
24 auto lb = lit0->as<
Lit>()->
get();
25 auto ub = lit1->as<
Lit>()->
get();
26 add_range_transitions(from, to, lb, ub);
30 convert(
const Def* regex, automaton::NFANode* start, automaton::NFANode* end, automaton::NFANode*
error =
nullptr) {
32 auto middle = nfa_->add_state();
36 add_range_transitions(start, end, 0, 255);
38 add_range_transitions(start, end,
range->arg(0),
range->arg(1));
39 if (
error) add_range_transitions(start,
error, 0, 255);
41 auto first = nfa_->add_state();
42 auto error = nfa_->add_state();
43 error->set_erroring(
true);
52 convert(opt->arg(), start, end);
54 auto m1 = nfa_->add_state();
55 auto m2 = nfa_->add_state();
62 auto m0 = nfa_->add_state();
63 auto m1 = nfa_->add_state();
64 auto m2 = nfa_->add_state();
74 void convert(
const Def* regex) {
75 auto start = nfa_->add_state();
76 nfa_->set_start(start);
77 auto end = nfa_->add_state();
82 std::unique_ptr<automaton::NFA> nfa() {
return std::move(nfa_); }
85 std::unique_ptr<automaton::NFA> nfa_;
91 Regex2NfaConverter converter;
92 converter.convert(
regex);
93 return converter.nfa();
void set_accepting(bool accepting)
void add_transition(const NFANode *to, std::uint16_t c)
const Sigma * convert(const TBound< up > *b)
std::unique_ptr< automaton::NFA > regex2nfa(const Def *regex)
void error(Loc loc, const char *f, Args &&... args)
constexpr decltype(auto) get(Span< T, N > span) noexcept
auto match(const Def *def)
automaton::NFA * regex2nfa(const Def *regex)
You can dl::get this function.