automata.cpp 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #include "automata.h"
  2. namespace L87 {
  3. Automata::Error::Error() {
  4. name = "unknown"; // TBD 反制魔法字符串
  5. details = "undefined error"; // TBD 反制魔法字符串
  6. }
  7. Automata::Error::Error(std::string& _name) {
  8. InnerMapIterator it = Inner_Error_Table.find(_name);
  9. if (it != Inner_Error_Table.end()) {
  10. name = it->first.c_str();
  11. details = it->second.c_str();
  12. }
  13. else {
  14. name = "unknown";
  15. details = "undefined error";
  16. }
  17. }
  18. Automata::Error::InnerMap Automata::Error::Inner_Error_Table;
  19. }
  20. namespace L87 {
  21. Automata::Result::Result(State* _state) : state(_state) {}
  22. }
  23. namespace L87 {
  24. Automata::Automata(StateDiagram& _diagram) : diagram(_diagram) {}
  25. Automata::Result Automata::Run(std::string _input) {
  26. State* current = diagram.initial;
  27. Result result(current);
  28. result.value = current->name();
  29. for (auto& item : _input) {
  30. result.state = current = current->next(item);
  31. result.value += " -> ";
  32. result.value += current->name();
  33. if (current->bad()) {
  34. // TBD
  35. break;
  36. }
  37. if (current->done()) {
  38. // TBD
  39. break;
  40. }
  41. }
  42. return result; // 拷贝构造
  43. }
  44. }