C ++ FSM дизайн и владение - PullRequest
2 голосов
/ 05 июля 2010

Я хотел бы реализовать синтаксический анализатор FSM / "pushdown automaton" для этого синтаксиса: синтаксический анализатор с областями действия и условиями , который уже "лексирован" в анализатор конечного автомата

У меня есть следующее:

class State
{
public:
    virtual State* event( const string &token );
    State* deleteDaughter();
private:
    A* m_parent;
    A* m_daughter;
}
class SomeState : public State
{
public:
    State* event( const std::string &token );
}

С B event() (после многих if-elseif) return m_parent->deleteDaughter(). Я знаю, что это подозрительно (и происходит сбой), но мне нужен способ вернуть родителя State от дочери State и убедиться, что дочь State не просочилась.

Мой цикл событий выглядит так:

while( somestringstream >> token )
    state = state->event();

Перед тем как ругать дизайн и последний кусок кода, я попытался расширить слишком простой пример с здесь , что выглядит довольно хорошо. Я передаю часть решения самим государствам для ясности и краткости.

Я понимаю, что есть множество книг по этому предмету, но я не ученый / программист, и я хочу научиться делать это самостоятельно (конечно, с помощью всех дружелюбных людей в SO). Если концепция не ясна, пожалуйста, спросите. Спасибо!

1 Ответ

0 голосов
/ 06 июля 2010

Не стесняйтесь по-прежнему размещать свой взгляд на это, но я понял, как справиться со всем изящно:

Первое: мой цикл событий будет хранить указатель на последний State* созданный.

Второе: каждый State имеет указатель на родительский элемент State, инициализированный в конструкторе, по умолчанию равный 0 (утечка памяти, если она используется для чего-либо, кроме первого State*); это гарантирует, что ни одно государство не выйдет за рамки.

Третье: State* endOfState() функция, которая делает именно это (и я особенно горжусь этим.

State* State::endOfState()
{
    State* parent = m_parent; // keep member pointer after suicide
    delete this;
    return parent;
}

Когда он вызывается из event() подкласса, он будет должным образом удален и вернет родительский указатель (идущий вверх по лестнице).

Если это все еще содержит утечку, пожалуйста, сообщите мне. Если решение не ясно, пожалуйста, спросите:)

PS: по справедливости, вдохновение было украдено у http://www.codeguru.com/forum/showthread.php?t=179284

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...