我正在实现自己的fsm来解析文件。我是fsm模式的新手,所以试图了解它。
我的fsm类获取正在解析的文件流以及当前状态和所有接受状态的集合。
现在我对几件事感到困惑。
fsm如何通过状态移动并跟踪到目前为止已解析的内容?
状态对象应存储哪些信息?现在他们有一个他们在线上匹配的模式,看看fsm是否可以移动到这个状态。
示例:
要解析的文件:
Person: bob smith
Age: 33
Location: new York
End person
Person: Jane smith
Age: 66
Location: Chicago
End person
所以我有一个人的开始,年龄,位置和最终的人的状态。每个状态对象都有一个模式。 (正则表达式)检查给定的行是否被他们接受。
但我仍然坚持在使用fsm ??
解析此文件时如何构造Person对象答案 0 :(得分:2)
列出人员名单(最初为空)。有一个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的东西。