Java 有限状态机程序
我的任务是创建一个小程序,可以从输入读取FSM的定义,从输入读取一些字符串,并根据定义确定FSM是否接受这些字符串。我需要用C、C++或java编写这个。我已经在网上搜寻如何开始的想法,但我能找到的最好的是维基百科上的一篇文章。提供的C示例似乎使用枚举列表来定义状态,如果这些状态是预先硬编码的,那就好了。再一次,我需要能够真正阅读国家的数量和每个国家应该做什么的定义。如有任何建议,我们将不胜感激 更新: 我可以使字母表变小(例如,{ab}),并采用其他约定,例如 开始状态始终为状态0。我被允许对人数施加合理的限制 州,例如不超过10个 问题摘要:Java 有限状态机程序,java,c++,c,Java,C++,C,我的任务是创建一个小程序,可以从输入读取FSM的定义,从输入读取一些字符串,并根据定义确定FSM是否接受这些字符串。我需要用C、C++或java编写这个。我已经在网上搜寻如何开始的想法,但我能找到的最好的是维基百科上的一篇文章。提供的C示例似乎使用枚举列表来定义状态,如果这些状态是预先硬编码的,那就好了。再一次,我需要能够真正阅读国家的数量和每个国家应该做什么的定义。如有任何建议,我们将不胜感激 更新: 我可以使字母表变小(例如,{ab}),并采用其他约定,例如 开始状态始终为状态0。我被允许对
- 如何实施FSA
如果你使用的是面向对象语言,如java或C++,我建议你从对象开始。在您担心文件格式之类的问题之前,先为有限状态自动机准备一个好的对象模型以及它的行为。您将如何表示状态、转换、事件等。?你的FSA会是复合的吗?一旦你有这样的工作,你可以得到正确的文件格式。任何东西都可以:XML、文本等。
表示自动机的一种非硬编码方式是转换矩阵,它允许表示每个当前状态和每个输入字符的下一个状态。您实际上没有问任何问题。如果你对某项任务有明确的目标(但仍然给出总体目标),你会得到更多更好的帮助。问题的范围应该很窄(例如,不是“如何实施FSA?”) 至于如何表示FSA(这似乎是您遇到的困难),请继续阅读 首先考虑FSM的定义:它是一个字母表∑, 一组状态S、开始状态s0、一组接受状态a以及从状态和符号到状态的转换函数δ。您必须能够从输入中确定这些属性。过渡函数无法达到的任何状态都可以删除以生成等效的FSM。因此,最小状态集和字母表隐含在转换函数中;您可以通过不需要这两种方法使您的FSM更易于使用(也更难实现,但不会太难)∑ 或输入中的S 对于输入使用的状态,不需要使用相同的表示形式。您可以将无符号整数用于内部表示,只要您具有从整数到字符串以及字符串到整数的映射,以便可以在内部表示和外部表示之间进行转换。这样,您的转换函数可以存储为数组,因此转换步骤可以在固定时间内执行 更简单的方法是使用外部表示作为内部表示。使用此选项,转换函数将存储为从字符串和符号到字符串的映射。转换步骤可能是O(log(| S|+|∑|)), 给定大多数映射数据结构的性能。如果符号表示为整数(例如,char
s),则转换函数可以表示为从字符串到字符串数组的映射,从而提供O(log(| s |)性能
在FSM的图形视图之后建模的另一个选项是为状态创建一个类。一个状态有一个名称(外部表示)。状态负责转换;向一个状态发送一个符号,然后返回另一个状态
class State {
property name;
State& transition(Symbol s);
void setTransition(Symbol s, State& to);
}
将状态集存储为从名称到状态的映射
好了,从三个不同的地方开始,每个地方都有不同的方式来表示状态。不要一下子想所有的事情。一次只做一件事
- 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
工具箱的工作方式是:FSM有一个状态向量,每个状态向量都有一个弧向量。每个弧都有一个输入(和输出)标签、一个目标状态ID和一个权重。你可以看看代码。也许它会给你启发。首先,获得所有状态(N个)的列表,以及所有符号(M个)的列表。然后有两种方法,解释或代码生成:
另外,如果您在状态图中识别循环等,并打印出相应的while和if语句,而不是使用goto,什么是输入格式?在继续之前需要定义好。您能描述一下输入文件的格式吗e?…更重要的是,你将如何表示“每个州应该做什么的定义”?你应该提供更多关于你需要做什么的信息。“我如何实施FSA?”这是一个非常广泛的问题,尤其是