2

我正在实现自己的 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 对象?

4

3 回答 3

2

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

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

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

于 2011-11-27T16:01:52.700 回答
1

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

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

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

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

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

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

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

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

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

于 2011-11-27T16:02:03.953 回答
1

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

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

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

于 2011-11-27T16:11:15.433 回答