omega_h
Reliable mesh adaptation
Omega_h_finite_automaton.hpp
1 #ifndef OMEGA_H_FINITE_AUTOMATON_HPP
2 #define OMEGA_H_FINITE_AUTOMATON_HPP
3 
4 #include <Omega_h_table.hpp>
5 #include <iosfwd>
6 #include <set>
7 
8 namespace Omega_h {
9 
10 /* This is basically a weird mix between a DFA and
11  an NFA-epsilon. It is really a DFA that can have two extra
12  epsilon symbols that it accepts transitions with.
13  We can simulate epsilon-transitions to multiple new
14  states by making trees of nodes connected by
15  epsilon-transitions.
16 
17  by convention, the start state is state 0
18  */
20  Table<int> table;
21  std::vector<int> accepted_tokens;
22  bool is_deterministic;
23  FiniteAutomaton() = default;
25  int nsymbols_init, bool is_deterministic_init, int nstates_reserve);
26  static FiniteAutomaton make_single_nfa(
27  int nsymbols, int symbol, int token = 0);
28  static FiniteAutomaton make_set_nfa(
29  int nsymbols, std::set<int> const& accepted, int token = 0);
30  static FiniteAutomaton make_range_nfa(
31  int nsymbols, int range_start, int range_end, int token = 0);
32  static FiniteAutomaton unite(
33  FiniteAutomaton const& a, FiniteAutomaton const& b);
34  static FiniteAutomaton concat(
35  FiniteAutomaton const& a, FiniteAutomaton const& b, int token = 0);
36  static FiniteAutomaton plus(FiniteAutomaton const& a, int token = 0);
37  static FiniteAutomaton maybe(FiniteAutomaton const& a, int token = 0);
38  static FiniteAutomaton star(FiniteAutomaton const& a, int token = 0);
39  static FiniteAutomaton make_deterministic(FiniteAutomaton const& nfa);
40  static FiniteAutomaton simplify_once(FiniteAutomaton const& fa);
41  static FiniteAutomaton simplify(FiniteAutomaton const& fa);
42 };
43 
44 int get_nstates(FiniteAutomaton const& fa);
45 int get_nsymbols(FiniteAutomaton const& fa);
46 bool get_determinism(FiniteAutomaton const& fa);
47 int get_epsilon0(FiniteAutomaton const& fa);
48 int get_epsilon1(FiniteAutomaton const& fa);
49 int add_state(FiniteAutomaton& fa);
50 void add_transition(
51  FiniteAutomaton& fa, int from_state, int at_symbol, int to_state);
52 void add_accept(FiniteAutomaton& fa, int state, int token);
53 void remove_accept(FiniteAutomaton& fa, int state);
54 int step(FiniteAutomaton const& fa, int state, int symbol);
55 int accepts(FiniteAutomaton const& fa, int state);
56 int get_nsymbols_eps(FiniteAutomaton const& fa);
57 void append_states(FiniteAutomaton& fa, FiniteAutomaton const& other);
58 
59 FiniteAutomaton make_char_nfa(bool is_deterministic_init, int nstates_reserve);
60 void add_char_transition(
61  FiniteAutomaton& fa, int from_state, char at_char, int to_state);
62 bool is_symbol(char c);
63 int get_symbol(char c);
64 char get_char(int symbol);
65 FiniteAutomaton make_char_set_nfa(
66  std::set<char> const& accepted, int token = 0);
67 FiniteAutomaton make_char_range_nfa(
68  char range_start, char range_end, int token = 0);
69 FiniteAutomaton make_char_single_nfa(char symbol_char, int token = 0);
70 std::set<char> negate_set(std::set<char> const& s);
71 
72 std::ostream& operator<<(std::ostream& os, FiniteAutomaton const& fa);
73 
74 } // namespace Omega_h
75 
76 #endif
Definition: amr_mpi_test.cpp:6
Definition: Omega_h_finite_automaton.hpp:19
Definition: Omega_h_scalar.hpp:287