有限状态机程序

时间:2009-11-21 22:16:48

标签: java c++ c

我的任务是创建一个小程序,它可以从输入中读取FSM的定义,从输入中读取一些字符串,并根据定义确定FSM是否接受这些字符串。我需要用C,C ++或Java来编写它。我已经在网上搜索了如何开始的想法,但我能找到的最好的是关于Automata-based programming的维基百科文章。提供的C示例似乎使用枚举列表来定义状态,如果状态是事先进行硬编码则没问题。同样,我需要能够实际读取状态的数量和每个状态应该做的定义。任何建议都表示赞赏。

更新: 我可以使字母表变小(例如{a b})并采用其他约定 开始状态总是状态0.我被允许对数量施加合理的限制 国家,例如不超过10个。

问题摘要:

  • 如何实施FSA?

6 个答案:

答案 0 :(得分:7)

首先,获取所有状态(N个)的列表,以及所有符号(M个)的列表。然后有两种方法,解释或代码生成:

  1. 解读。创建一个NxM矩阵,其中矩阵的每个元素都填入相应的目标状态编号,如果没有则填充-1。然后只需要一个初始状态变量并开始处理输入。如果你达到-1状态,你就失败了。如果输入符号用完而没有进入成功状态,则会失败。否则你就成功了。

  2. 代码生成。用C或您最喜欢的编译器语言打印出一个程序。它应该有一个初始化为start状态的整数状态变量。它应该在输入字符上有 for 循环,在状态变量上包含开关。每个状态应该有一个案例,并且在每种情况下,在当前字符上都有一个switch语句,用于更改状态变量。

  3. 如果你想要比2更快的东西,这肯定会让你不及格(!),摆脱状态变量,而是使用转到 :-)如果你不及格,你可以安慰自己知道这就是编译器的作用。

    P.S。如果您在状态图中识别出循环等,并且打印出相应的 if 语句,而不是使用 goto <,则可以将F更改为A. /强>

答案 1 :(得分:2)

表示自动机的一种非硬编码方式是转换矩阵,它允许表示每个当前状态和每个输入字符,即下一个状态。

答案 2 :(得分:1)

你实际上没有问过一个问题。如果您对特定任务有特定question(但仍然给出总体目标),您将获得更多更好的帮助。问题的范围应该是狭窄的(例如,不是“我如何实施FSA?”)。

至于如何代表FSA(这似乎是你遇到的困难),请继续阅读。

首先考虑FSM的定义:它是一个字母Σ,一组状态 S ,一个起始状态 s 0 ,一组接受状态 A 和从状态和符号到状态的转换函数δ。您必须能够从输入中确定这些属性。可以删除转换函数无法访问的任何状态以生成等效的FSM。因此,最小的状态和字母表集合隐含在转换函数中;你可以通过在输入中不需要Σ S 来使你的FSM更容易使用(并且更难实现,但不会更难)。

您不需要对输入使用的状态使用相同的表示形式。只要您有从整数到字符串和字符串到整数的映射,就可以使用无符号整数进行内部表示,这样您就可以在内部表示和外部表示之间进行转换。这样,您的转换函数可以存储为数组,因此转换步骤可以在恒定时间内执行。

更简单的方法是使用外部表示作为内部表示。使用此选项,转换函数将存储为从字符串和符号到字符串的映射。考虑到大多数地图数据结构的性能,转换步骤可能是O(log(| S | + |Σ|))。如果符号表示为整数(例如char s),则转换函数可以表示为从字符串到字符串数组的映射,从而得到O(log(| S |))性能。

在FSM的图表视图之后的另一个选项是为状态创建一个类。状态具有名称(外部表示)。国家负责过渡;将符号发送到州并返回另一个州。

class State {
    property name;
    State& transition(Symbol s);
    void setTransition(Symbol s, State& to);
}

将状态集存储为从名称到状态的映射。

你去,三个不同的地方开始,每个地方都有不同的方式来代表国家。

答案 3 :(得分:1)

不要再考虑所有事情了。一次做一件事

- come with language of state machine
- come with language for stimulus
- create sample file of one state machine in language
- create sample file of stimulus
- come with class for state
- come with class for transition
- come with class for state machine as set of states and transitions
- add method to handle violation to state class
- code a little parser for language 
- code another parser for language 
- initial state
- some output thing like WriteLn here and there
- main method
- compile
- run
- debug
- done

答案 4 :(得分:1)

OpenFst工具包的作用方式是:FSM有一个状态向量,每个状态都有一个弧矢量。每个弧都有一个输入(和输出)标签,一个目标状态ID和一个权重。你可以看看代码。也许它会激励你。

答案 5 :(得分:0)

如果您使用的是面向对象的语言,如Java或C ++,我建议您从对象开始。在您担心文件格式等之前,请为有限状态自动机及其行为获得良好的对象模型。您将如何表示状态,过渡,事件等?你的FSA会成为综合体吗?一旦你有这样的事情工作,你可以正确的文件格式。一切都会做:XML,文本等。