123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- #include <iostream>
- #include <string>
- #include <mutex>
- #include "example.h"
- using namespace L87;
- class S1 : public State {
- public:
- S1(StateDiagram* parent) : State(parent) { auto_register(); }
- const char* name() override { return "S1"; }
- virtual State* next(char input) override {
- if (input == 'a') {
- return states["S2"];
- }
- if (input == 'b') {
- return this; // states["S1"];
- }
- return states["E"];
- }
- };
- class S2 : public State {
- public:
- S2(StateDiagram* parent) : State(parent) { auto_register(); }
- virtual const char* name() override { return "S2"; }
- virtual State* next(char input) override {
- if (input == 'a') {
- return states["S3"];
- }
- if (input == 'b') {
- return this; // states["S2"];
- }
- if (input == 'c') {
- return states["T"];
- }
- return states["E"];
- }
- };
- class S3 : public State {
- public:
- S3(StateDiagram* parent) : State(parent) { auto_register(); }
- virtual const char* name() override { return "S3"; }
- virtual State* next(char input) override {
- if (input == 'a') {
- return states["S1"];
- }
- if (input == 'b') {
- return this; // states["S3"];
- }
- return states["E"];
- }
- };
- class T : public State {
- public:
- T(StateDiagram* parent) : State(parent) { auto_register(); }
- virtual const char* name() override { return "T"; }
- virtual State* next(char input) override {
- return this; // states["T"];
- }
- virtual bool done() override { return true; }
- };
- class E : public State {
- public:
- E(StateDiagram* parent) : State(parent) { auto_register(); }
- virtual const char* name() override { return "E"; }
- virtual State* next(char input) override {
- return this; // states["E"];
- }
- virtual bool done() override { return true; }
- virtual bool bad() override { return true; }
- };
- class TestStateDiagram : public StateDiagram {
- private:
- static TestStateDiagram* instance;
- static std::mutex mtx;
- private:
- TestStateDiagram() {
- initial = new S1(this);
- new S2(this);
- new S3(this);
- new T(this);
- new E(this);
- }
- public:
- static TestStateDiagram& Instance() {
- if (instance == nullptr) {
- mtx.lock();
- if (instance == nullptr) {
- instance = new TestStateDiagram();
- }
- mtx.unlock();
- }
- return *instance;
- }
- static void Destory() {
- if (instance != nullptr) {
- mtx.lock();
- if (instance != nullptr) {
- TestStateDiagram* to_del = instance;
- instance = nullptr;
- delete to_del;
- }
- mtx.unlock();
- }
- }
- };
- TestStateDiagram* TestStateDiagram::instance = nullptr;
- std::mutex TestStateDiagram::mtx;
- void test1() {
- // TestStateDiagram 状态图包含 5 个状态: S1, S2, S3, T, E
- // s a b c oth
- // S1 S2 S1 E E
- // S2 S3 S2 T E
- // S3 S1 S3 E E
- // T T T T T
- // E E E E E
- L87::Automata automata(TestStateDiagram::Instance());
- {
- std::string input = "ab?!ababac";
- L87::Automata::Result result = automata.Run(input);
- std::cout << input << ": " << result.value << std::endl;
- }
- {
- std::string input = "abababaabccasvsddb";
- L87::Automata::Result result = automata.Run(input);
- std::cout << input << ": " << result.value << std::endl;
- }
- {
- std::string input = "abaabbbaaaac";
- L87::Automata::Result result = automata.Run(input);
- std::cout << input << ": " << result.value << std::endl;
- }
- TestStateDiagram::Destory();
- }
|