test1.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #include <iostream>
  2. #include <string>
  3. #include <mutex>
  4. #include "automata.h"
  5. #include "state.h"
  6. using namespace L87;
  7. class S1 : public State {
  8. public:
  9. S1(StateDiagram* parent) : State(parent) { _register(); }
  10. const char* name() override { return "S1"; }
  11. virtual State* next(char input) override {
  12. if (input == 'a') {
  13. return states["S2"];
  14. }
  15. if (input == 'b') {
  16. return this; // states["S1"];
  17. }
  18. return states["E"];
  19. }
  20. };
  21. class S2 : public State {
  22. public:
  23. S2(StateDiagram* parent) : State(parent) { _register(); }
  24. virtual const char* name() override { return "S2"; }
  25. virtual State* next(char input) override {
  26. if (input == 'a') {
  27. return states["S3"];
  28. }
  29. if (input == 'b') {
  30. return states["T"];
  31. }
  32. return states["E"];
  33. }
  34. };
  35. class S3 : public State {
  36. public:
  37. S3(StateDiagram* parent) : State(parent) { _register(); }
  38. virtual const char* name() override { return "S3"; }
  39. virtual State* next(char input) override {
  40. if (input == 'a') {
  41. return states["S1"];
  42. }
  43. return states["E"];
  44. }
  45. };
  46. class T : public State {
  47. public:
  48. T(StateDiagram* parent) : State(parent) { _register(); }
  49. virtual const char* name() override { return "T"; }
  50. virtual State* next(char input) override {
  51. return this; // states["T"];
  52. }
  53. virtual bool done() override { return true; }
  54. };
  55. class E : public State {
  56. public:
  57. E(StateDiagram* parent) : State(parent) { _register(); }
  58. virtual const char* name() override { return "E"; }
  59. virtual State* next(char input) override {
  60. return this; // states["E"];
  61. }
  62. virtual bool done() override { return true; }
  63. virtual bool bad() override { return true; }
  64. };
  65. class TestStateDiagram : public StateDiagram {
  66. private:
  67. static TestStateDiagram* instance;
  68. private:
  69. TestStateDiagram() {
  70. initial = new S1(this);
  71. new S2(this);
  72. new S3(this);
  73. new T(this);
  74. new E(this);
  75. }
  76. ~TestStateDiagram() {
  77. for (auto it : states) {
  78. delete it.second;
  79. }
  80. }
  81. public:
  82. static TestStateDiagram& Instance() {
  83. if (instance == nullptr) {
  84. if (instance == nullptr) {
  85. instance = new TestStateDiagram();
  86. }
  87. }
  88. return *instance;
  89. }
  90. };
  91. TestStateDiagram* TestStateDiagram::instance = nullptr;
  92. int test1() {
  93. Automata automata(TestStateDiagram::Instance());
  94. {
  95. std::string input = "aaaab";
  96. Automata::Result result = automata.Run(input);
  97. std::string str((char*)result.value);
  98. std::cout << input << ':' << str << std::endl;
  99. }
  100. {
  101. std::string input = "aaaaaaaaaaaaaaaab";
  102. Automata::Result result = automata.Run(input);
  103. std::string str((char*)result.value);
  104. std::cout << input << ':' << str << std::endl;
  105. }
  106. return 0;
  107. }