example-test1.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. #include <iostream>
  2. #include <string>
  3. #include <mutex>
  4. #include "example.h"
  5. using namespace L87;
  6. class S1 : public State {
  7. public:
  8. S1(StateDiagram* parent) : State(parent) { auto_register(); }
  9. const char* name() override { return "S1"; }
  10. virtual State* next(char input) override {
  11. if (input == 'a') {
  12. return states["S2"];
  13. }
  14. if (input == 'b') {
  15. return this; // states["S1"];
  16. }
  17. return states["E"];
  18. }
  19. };
  20. class S2 : public State {
  21. public:
  22. S2(StateDiagram* parent) : State(parent) { auto_register(); }
  23. virtual const char* name() override { return "S2"; }
  24. virtual State* next(char input) override {
  25. if (input == 'a') {
  26. return states["S3"];
  27. }
  28. if (input == 'b') {
  29. return this; // states["S2"];
  30. }
  31. if (input == 'c') {
  32. return states["T"];
  33. }
  34. return states["E"];
  35. }
  36. };
  37. class S3 : public State {
  38. public:
  39. S3(StateDiagram* parent) : State(parent) { auto_register(); }
  40. virtual const char* name() override { return "S3"; }
  41. virtual State* next(char input) override {
  42. if (input == 'a') {
  43. return states["S1"];
  44. }
  45. if (input == 'b') {
  46. return this; // states["S3"];
  47. }
  48. return states["E"];
  49. }
  50. };
  51. class T : public State {
  52. public:
  53. T(StateDiagram* parent) : State(parent) { auto_register(); }
  54. virtual const char* name() override { return "T"; }
  55. virtual State* next(char input) override {
  56. return this; // states["T"];
  57. }
  58. virtual bool done() override { return true; }
  59. };
  60. class E : public State {
  61. public:
  62. E(StateDiagram* parent) : State(parent) { auto_register(); }
  63. virtual const char* name() override { return "E"; }
  64. virtual State* next(char input) override {
  65. return this; // states["E"];
  66. }
  67. virtual bool done() override { return true; }
  68. virtual bool bad() override { return true; }
  69. };
  70. class TestStateDiagram : public StateDiagram {
  71. private:
  72. static TestStateDiagram* instance;
  73. static std::mutex mtx;
  74. private:
  75. TestStateDiagram() {
  76. initial = new S1(this);
  77. new S2(this);
  78. new S3(this);
  79. new T(this);
  80. new E(this);
  81. }
  82. public:
  83. static TestStateDiagram& Instance() {
  84. if (instance == nullptr) {
  85. mtx.lock();
  86. if (instance == nullptr) {
  87. instance = new TestStateDiagram();
  88. }
  89. mtx.unlock();
  90. }
  91. return *instance;
  92. }
  93. static void Destory() {
  94. if (instance != nullptr) {
  95. mtx.lock();
  96. if (instance != nullptr) {
  97. TestStateDiagram* to_del = instance;
  98. instance = nullptr;
  99. delete to_del;
  100. }
  101. mtx.unlock();
  102. }
  103. }
  104. };
  105. TestStateDiagram* TestStateDiagram::instance = nullptr;
  106. std::mutex TestStateDiagram::mtx;
  107. void test1() {
  108. // TestStateDiagram 状态图包含 5 个状态: S1, S2, S3, T, E
  109. // s a b c oth
  110. // S1 S2 S1 E E
  111. // S2 S3 S2 T E
  112. // S3 S1 S3 E E
  113. // T T T T T
  114. // E E E E E
  115. L87::Automata automata(TestStateDiagram::Instance());
  116. {
  117. std::string input = "ab?!ababac";
  118. L87::Automata::Result result = automata.Run(input);
  119. std::cout << input << ": " << result.value << std::endl;
  120. }
  121. {
  122. std::string input = "abababaabccasvsddb";
  123. L87::Automata::Result result = automata.Run(input);
  124. std::cout << input << ": " << result.value << std::endl;
  125. }
  126. {
  127. std::string input = "abaabbbaaaac";
  128. L87::Automata::Result result = automata.Run(input);
  129. std::cout << input << ": " << result.value << std::endl;
  130. }
  131. TestStateDiagram::Destory();
  132. }