2

我想为此语法实现一个 FSM/“下推自动机”解析器:具有范围和条件的解析器,它已经被“解析”到有限状态机解析器中

我有以下内容:

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 );
}

With B's event()doing (在许多 if-elseif's 之后) return m_parent->deleteDaughter()State我知道这很可疑(而且它崩溃了),但我需要办法从女儿那里归还父母,State并确保女儿State没有被泄露。

我的事件循环如下所示:

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

在你责骂设计和最后一段代码之前,我尝试从这里扩展一个过于简单的示例,这看起来还不错。为了清晰和简洁,我将决策部分转移到各州本身。

我知道有很多关于这个主题的书籍,但我不是计算机科学家/程序员,我想自己学习做这件事(当然,在 SO 的所有友好人士的帮助下)。如果概念不清楚,请询问。谢谢!

4

1 回答 1

0

随意发表你对此的看法,但我已经想出了如何优雅地处理一切:

首先:我的事件循环将保留一个指向最后State*创建的指针。

第二:每个State都有一个指向 parent 的指针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

于 2010-07-06T19:49:48.783 回答