使用有限状态机解析文件

时间:2011-11-27 15:50:20

标签: java finite-automata fsm state-machine

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

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

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

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

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

  3. 示例:

    要解析的文件:

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

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

    但我仍然坚持在使用fsm ??

    解析此文件时如何构造Person对象

3 个答案:

答案 0 :(得分:2)

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

  • 当状态为“人员开始”时,将currentPerson变量初始化为新人员。
  • 当州为“年龄”时,请将年龄设为currentPerson
  • “位置”状态相同。
  • 当州是“人的结束”时,将currentPerson添加到人员列表中。

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

答案 1 :(得分:1)

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

对我来说这看起来很像JSON。一些变化,你就在那里。它也很容易成为XML;你不必写一个解析器。

但是,如果你坚持,你的FSM将开始阅读一条线。

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

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

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

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

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

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

答案 2 :(得分:1)

在FSM中构建状态的标准方法是在读取令牌时构造树。 FSM的状态取决于您当前所处的节点类型。例如,您首先要解析单词'Person',这样您就知道在树中构建一个新的'Person'节点。然后,您阅读的所有内容,直到您到达“结束人”令牌,在“人”下创建节点。

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

此外,yacc(或bison)是构建FSM解析器的权威方式。它给出了一个正式定义语法的C代码。我从来没有调查过,但可能有类似Java的东西。