reglibcpp  1.7.0
(Naïve) C++ implementation of models for regular languages
Classes | Typedefs | Functions | Variables
reg Namespace Reference

Where this library lives. More...

Classes

class  dfa
 Represents deterministic finite automata. More...
 
class  expression
 Represents formal regular expressions. More...
 
class  gnfa
 Represents generalized nondeterministic finite automata. More...
 
class  nfa
 Represents nondeterministic finite automata with ε-moves. More...
 

Typedefs

using Dtransitionmap = unordered_map< string, unordered_map< char32_t, string > >
 Shorthand for the map from state name and transition symbol to target state. More...
 
using Ntransitionmap = unordered_map< string, unordered_map< char32_t, unordered_set< string > >>
 Shorthand for the map from state name and transition symbol to set of target states. More...
 

Functions

u32string findShortestWord (dfa const &d)
 Searches the shortest UTF-32-encoded word accepted by a given DFA. More...
 
string findShortestUtf8Word (dfa const &d)
 Same as above for a UTF-8-encoded word. More...
 
u32string findShortestWord (nfa const &n)
 Searches the shortest UTF-32-encoded word accepted by a given NFA. More...
 
string findShortestUtf8Word (nfa const &n)
 Same as above for a UTF-8-encoded word. More...
 
template<class C , class T >
size_t index_of (C const &container, T const &element)
 Basically Java's List interface's indexOf, but as a non-member function and returning the container's size upon failure. More...
 

Variables

std::wstring_convert< std::codecvt_utf8< char32_t >, char32_t > converter
 Converts between UTF-8-encoded and UTF-32-encoded strings. More...
 

Detailed Description

Where this library lives.

Typedef Documentation

◆ Dtransitionmap

Shorthand for the map from state name and transition symbol to target state.

Definition at line 502 of file dfa.cpp.

◆ Ntransitionmap

Shorthand for the map from state name and transition symbol to set of target states.

Definition at line 653 of file nfa.cpp.

Function Documentation

◆ findShortestUtf8Word() [1/2]

std::string reg::findShortestUtf8Word ( dfa const &  d)

Same as above for a UTF-8-encoded word.

Definition at line 445 of file dfa.cpp.

445  {
446  return converter.to_bytes(findShortestWord(d));
447 }
std::wstring_convert< std::codecvt_utf8< char32_t >, char32_t > converter
Converts between UTF-8-encoded and UTF-32-encoded strings.
Definition: utils.cpp:4
u32string findShortestWord(dfa const &d)
Searches the shortest UTF-32-encoded word accepted by a given DFA.
Definition: dfa.cpp:418

◆ findShortestUtf8Word() [2/2]

std::string reg::findShortestUtf8Word ( nfa const &  n)

Same as above for a UTF-8-encoded word.

Definition at line 568 of file nfa.cpp.

568  {
569  return converter.to_bytes(findShortestWord(n));
570 }
std::wstring_convert< std::codecvt_utf8< char32_t >, char32_t > converter
Converts between UTF-8-encoded and UTF-32-encoded strings.
Definition: utils.cpp:4
u32string findShortestWord(nfa const &n)
Searches the shortest UTF-32-encoded word accepted by a given NFA.
Definition: nfa.cpp:539

◆ findShortestWord() [1/2]

std::u32string reg::findShortestWord ( dfa const &  d)

Searches the shortest UTF-32-encoded word accepted by a given DFA.

Parameters
dthe DFA
Returns
the shortest word leading to one of the DFA's accept states
Exceptions
std::logic_errorif the DFA doesn't accept any words

Definition at line 418 of file dfa.cpp.

418  {
419  auto const& p = d.p;
420  if (p->accepting[0]) {
421  return U"";
422  }
423  unordered_map<size_t, u32string> shortestWords(p->labels.size());
424  size_t oldSize = 0;
425  shortestWords.emplace(0, U"");
426  while (shortestWords.size() > oldSize) {
427  oldSize = shortestWords.size();
428  for (auto const& stateWord : shortestWords) {
429  for (auto symbol : p->alphabet) {
430  size_t reached = d.delta(stateWord.first, symbol);
431  u32string shWord = stateWord.second + symbol;
432  if (p->accepting[reached]) {
433  return shWord;
434  }
435  if (shortestWords.find(reached) == shortestWords.end()) {
436  shortestWords.emplace(reached, shWord);
437  }
438  }
439  }
440  }
441  throw std::logic_error("This DFA doesn't accept any words!");
442 }

◆ findShortestWord() [2/2]

std::u32string reg::findShortestWord ( nfa const &  n)

Searches the shortest UTF-32-encoded word accepted by a given NFA.

Parameters
nthe NFA
Returns
the shortest word leading to one of the NFA's accept states
Exceptions
std::logic_errorif the NFA doesn't accept any words

Definition at line 539 of file nfa.cpp.

539  {
540  auto const& p = n.p;
541  if (p->accepting[0]) {
542  return U"";
543  }
544  unordered_map<size_t, u32string> shortestWords(p->labels.size());
545  size_t oldSize = 0;
546  shortestWords.emplace(0, U"");
547  while (shortestWords.size() > oldSize) {
548  oldSize = shortestWords.size();
549  for (auto const& stateWord : shortestWords) {
550  for (auto symbol : p->alphabet) {
551  valarray<bool> reached = n.deltaHat(stateWord.first, u32string(!!symbol, symbol));
552  u32string shWord = stateWord.second + u32string(!!symbol, symbol);
553  for (size_t q = 0; q < reached.size(); q++) { if (reached[q]) {
554  if (p->accepting[q]) {
555  return shWord;
556  }
557  if (shortestWords.find(q) == shortestWords.end()) {
558  shortestWords.emplace(q, shWord);
559  }
560  }}
561  }
562  }
563  }
564  throw std::logic_error("This NFA doesn't accept any words!");
565 }

◆ index_of()

template<class C , class T >
size_t reg::index_of ( C const &  container,
T const &  element 
)

Basically Java's List interface's indexOf, but as a non-member function and returning the container's size upon failure.

Parameters
containerthe container to search through
elementthe element to find the index of
Returns
the first i with container.begin()[i]==element or container.size() if none is found

Definition at line 19 of file utils.h.

19  {
20  static_assert(std::is_same<typename C::value_type,T>::value, "C must be a container with T as value_type.");
21  return static_cast<size_t>(std::distance(container.begin(), std::find(container.begin(), container.end(), element)));
22 }

Variable Documentation

◆ converter

std::wstring_convert< std::codecvt_utf8< char32_t >, char32_t > reg::converter

Converts between UTF-8-encoded and UTF-32-encoded strings.

Definition at line 4 of file utils.cpp.