4 #include <unordered_map>
14 #include <vcsn/dyn/fwd.hh>
58 virtual bool open(
bool o) = 0;
61 virtual dyn::automaton
result() = 0;
64 virtual void reset() = 0;
83 template <Automaton Aut>
168 "edit_automaton: invalid transition from pre to post: ",
169 src,
" -> ", dst,
" (", entry,
")");
170 if (s ==
res_->pre() || d ==
res_->post())
172 if (entry.get().empty())
173 res_->add_transition(s, d,
res_->prepost_label());
185 "edit_automaton: invalid ",
186 s ==
res_->pre() ?
"initial" :
"final",
187 " entry: ", entry.get());
188 res_->add_transition(s, d,
197 for (
auto e: p.first->second)
222 const auto& ls = *
res_->labelset();
225 p.first->second =
conv(ls, l);
226 return p.first->second;
233 const auto& ws = *
res_->weightset();
236 p.first->second = w.get().empty() ? ws.one() :
conv(ws, w);
237 return p.first->second;
244 return res_->state(k);
253 using entry_map = std::unordered_map<string_t, entry_t>;
256 using label_map = std::unordered_map<string_t, label_t>;
303 dyn::automaton
result(
const std::string&
ctx = {});
322 using transition_t = std::tuple<string_t, string_t, string_t, string_t>;
347 template <
typename Ctx>
351 const auto& c = ctx->
as<Ctx>();
value_impl< detail::weight_tag > weight
context_t_of< automaton_t > context_t
Abstract Builder (the design pattern) for automata.
weightset_type
Weightset types.
typename detail::weight_t_of_impl< base_t< ValueSet >>::type weight_t_of
SharedPtr make_shared_ptr(Args &&...args)
Same as std::make_shared, but parameterized by the shared_ptr type, not the (pointed to) element_type...
void add_transition(string_t src, string_t dst, string_t label, string_t weight=string_t{}) override final
Add a transition from src to dst.
virtual void add_state(string_t s)=0
Register the existence of state named s.
void add_initial(string_t s, string_t weight=string_t{}) override final
Concrete Builder (the design pattern) for automata.
void add_pre(string_t s) override final
Register that state named s is preinitial.
bool open_
Whether the labelset is open.
bool weighted_
Whether we saw a non-empty weight.
boost::flyweight< std::string, boost::flyweights::no_tracking, boost::flyweights::intermodule_holder > symbol
An internalized string.
void add_initial(string_t s, string_t w=string_t{})
Add s as an initial state.
virtual void add_initial(string_t s, string_t w)=0
labelset_type
Labelset types, increasing generality.
void add_entry(string_t src, string_t dst, string_t entry) override final
Add transitions from src to dst, labeled by entry.
void register_weight_(string_t w)
Record that this weight was seen.
virtual void add_final(string_t s, string_t w)=0
typename detail::labelset_t_of_impl< base_t< ValueSet >>::type labelset_t_of
virtual void add_pre(string_t s)=0
Declare that s denotes the preinitial state in entries.
weight_t_of< automaton_t > weight_t
typename detail::context_t_of_impl< base_t< ValueSet >>::type context_t_of
bool real_
Whether we saw a period in a the weight.
auto label_of(const welement< Label, Weight > &m) -> decltype(m.label())
The label of a welement.
void add_transition(string_t src, string_t dst, string_t lbl, string_t w=string_t{})
Add an acceptor transition from src to dst, labeled by lbl.
virtual dyn::automaton result()=0
The final result.
void add_final(string_t s, string_t w=string_t{})
Add s as a final state.
automaton_editor * make_automaton_editor(const context &ctx)
Bridge.
void require(Bool b, Args &&...args)
If b is not verified, raise an error with args as message.
std::unordered_map< string_t, label_t > label_map
Memoize label conversion.
auto conv(const ValueSet &vs, const std::string &str, Args &&...args) -> decltype(vs.conv(std::declval< std::istream & >(), std::forward< Args >(args)...))
Parse str via vs.conv.
automaton_t res_
The automaton under construction.
void reset() override final
Detach the built automaton.
auto & as()
Downcast to the exact type.
automaton_editor::string_t string_t
A hash-cons'ed string type.
virtual ~automaton_editor()
void reset()
Get ready to build another automaton.
void add_state(string_t s) override final
Register the existence of state named s.
virtual void reset()=0
Forget about the current automaton, but do not free it.
dyn::automaton result() override final
Return the built automaton.
labelset_t_of< automaton_t > labelset_t
virtual void add_entry(string_t src, string_t dst, string_t entry)=0
Add an entry from src to dst, with value entry.
std::vector< std::pair< string_t, string_t > > initial_states_
The collected initial states: (State, Weight).
bool open(bool o) override final
Whether unknown letters should be added, or rejected.
labelset_type output_type_
Labelset type for output tape.
typename detail::state_t_of_impl< base_t< ValueSet >>::type state_t_of
value_impl< detail::label_tag > label
void set_separator(char c)
Set the label separator. Defaults to '+'.
void add_post(string_t s) override final
Register that state named s is postfinal.
Template-less root for contexts.
super_t::string_t string_t
bool open(bool o)
Whether unknown letters should be added, or rejected.
labelset_type input_type_
Labelset type for input tape.
std::unordered_map< string_t, entry_t > entry_map
Memoize entry conversion.
typename detail::label_t_of_impl< base_t< ValueSet >>::type label_t_of
#define VCSN_REQUIRE(Cond,...)
A macro similar to require.
virtual void add_post(string_t s)=0
Declare that s denotes the postfinal state in entries.
virtual bool open(bool o)=0
Whether unknown letters should be added, or rejected.
state_t state_(string_t k)
Convert a state name to a state handler.
std::tuple< string_t, string_t, string_t, string_t > transition_t
The collected transitions: (Source, Destination, Label, Weight).
std::vector< transition_t > transitions_
virtual void add_transition(string_t src, string_t dst, string_t label, string_t weight=string_t{})=0
Add a transition from src to dst.
void add_final(string_t s, string_t weight=string_t{}) override final
label_t_of< automaton_t > label_t
weight_t weight_(string_t w)
Convert a weight string to its value.
std::vector< std::pair< string_t, string_t > > final_states_
The collected final states: (State, Weight).
polynomialset< context_t > ps_
Entries handler.
std::shared_ptr< detail::name_automaton_impl< Aut >> name_automaton
std::string result_context() const
Return the context that was inferred.
auto weight_of(const welement< Label, Weight > &m) -> decltype(m.weight())
The weight of a welement.
std::unordered_map< string_t, weight_t > weight_map
Memoize weight conversion.
typename polynomialset< context_t >::value_t entry_t
state_t_of< automaton_t > state_t
void weightset(weightset_type t)
Specify the weightset type.
char sep_
The label separator.
Provide a variadic mul on top of a binary mul(), and one().
name_automaton< Aut > automaton_t
weightset_type weightset_type_
The weightset scale.
label_t label_(string_t l)
Convert a label string to its value.
dyn::automaton result(const std::string &ctx={})
Return the built automaton.
Build an automaton with unknown context.
edit_automaton(const context_t &ctx)