【问题标题】:Parsing file using finite state machine使用有限状态机解析文件
【发布时间】:2012-01-07 09:03:01
【问题描述】:

我正在实现自己的 fsm 来解析文件。我是 fsm 模式的新手,所以试图了解它。

我的 fsm 类获取正在解析的文件流以及当前状态和所有接受状态的集合。

现在我对几件事感到困惑。

  1. fsm 如何通过状态移动并跟踪到目前为止已解析的内容?

  2. 状态对象应存储哪些信息?现在他们有一个匹配的模式,看看 fsm 是否可以移动到这个状态。

例子:

要解析的文件:

Person:  bob smith
        Age: 33
        Location: new York
End person
Person:  Jane smith
        Age: 66
        Location: Chicago
End person

所以我有一个人开始、年龄、位置和结束人的状态。每个状态对象都有一个模式。 (正则表达式)检查给定的行是否被他们接受。

但是当我使用 fsm 解析这个文件时,我将如何构造一个 Person 对象??

【问题讨论】:

    标签: java finite-automata fsm state-machine


    【解决方案1】:

    有一个人员列表(最初为空)。有一个 currentPerson 变量。

    • 当状态为“person start”时,将currentPerson变量初始化为一个新的Person。
    • 当状态为“年龄”时,将年龄设置为currentPerson
    • “位置”状态也是如此。
    • 当状态为“人员结束”时,将 currentPerson 添加到人员列表中。

    当您到达文件末尾时,人员列表将包含您的所有人员。

    【讨论】:

    • 这将解析 Person 对象,但仅此而已。假设这就是提问者想要的,它会起作用,但语法非常有限。
    【解决方案2】:

    我不认为这是 FSM 的最佳用途。

    在我看来,这很像 JSON。一些改变,你就在那里。它也很容易成为 XML;您不必编写解析器。

    但是,如果您坚持,您的 FSM 将从读取一行开始。

    如果该行包含“Person”,您将保存名称值。 (建议:在“Person”之后添加“Name”行。)

    如果该行包含“年龄”,您将保存年龄值。

    如果该行包含“位置”,您将保存位置值。

    如果该行包含“End”,您将实例化一个新 Person,将其添加到数据结构中,然后读取下一行。

    如果该行为空,则表示您已到达末尾;转换到结束状态并关闭文件。

    你没有说你是否允许任何属性乱序。

    【讨论】:

      【解决方案3】:

      在 FSM 中构建状态的标准方法是在读取标记时构建一棵树。 FSM 的状态取决于您当前所处的节点类型。例如,您将从解析单词“Person”开始,因此您会知道在树中构建一个新的“Person”节点。然后,您阅读的所有内容,直到您到达“End Person”标记,都会在该“Person”下创建节点。

      作为一项学术练习,这对 FSM 来说听起来不错。但出于实际目的,这看起来确实像 JSON,所以我肯定会寻找现有的解析方法。

      此外,yacc(或 bison)是构建 FSM 解析器的权威方法。给出正式定义的语法,它会吐出 C 代码。我从未研究过它,但 Java 可能有类似的东西。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-06
        • 1970-01-01
        • 2011-02-16
        • 2016-07-21
        • 1970-01-01
        • 2018-10-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多