Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有限状态机程序_Java_C++_C - Fatal编程技术网

Java 有限状态机程序

Java 有限状态机程序,java,c++,c,Java,C++,C,我的任务是创建一个小程序,可以从输入读取FSM的定义,从输入读取一些字符串,并根据定义确定FSM是否接受这些字符串。我需要用C、C++或java编写这个。我已经在网上搜寻如何开始的想法,但我能找到的最好的是维基百科上的一篇文章。提供的C示例似乎使用枚举列表来定义状态,如果这些状态是预先硬编码的,那就好了。再一次,我需要能够真正阅读国家的数量和每个国家应该做什么的定义。如有任何建议,我们将不胜感激 更新: 我可以使字母表变小(例如,{ab}),并采用其他约定,例如 开始状态始终为状态0。我被允许对

我的任务是创建一个小程序,可以从输入读取FSM的定义,从输入读取一些字符串,并根据定义确定FSM是否接受这些字符串。我需要用C、C++或java编写这个。我已经在网上搜寻如何开始的想法,但我能找到的最好的是维基百科上的一篇文章。提供的C示例似乎使用枚举列表来定义状态,如果这些状态是预先硬编码的,那就好了。再一次,我需要能够真正阅读国家的数量和每个国家应该做什么的定义。如有任何建议,我们将不胜感激

更新: 我可以使字母表变小(例如,{ab}),并采用其他约定,例如 开始状态始终为状态0。我被允许对人数施加合理的限制 州,例如不超过10个

问题摘要:

  • 如何实施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个)的列表。然后有两种方法,解释或代码生成:

  • 解释。制作一个NxM矩阵,其中矩阵的每个元素都填入相应的目标状态号,如果没有,则填入-1。然后只需要一个初始状态变量并开始处理输入。如果达到状态-1,则失败。如果没有达到成功状态,则输入符号不足,则失败。其他你能成功吗

  • 代码生成。用C或您最喜欢的编译器语言打印程序。它应该有一个初始化为开始状态的整数状态变量。它应该在输入字符上有一个for循环,在状态变量上包含一个开关。每个状态应该有一个大小写,每个大小写都有一个更改状态变量的当前字符上的switch语句

  • 如果您想要比2更快的速度,并且肯定会被判不及格(!),请去掉state变量,改为使用goto:-)如果不及格,您可以安慰自己,编译器就是这么做的


    另外,如果您在状态图中识别循环等,并打印出相应的whileif语句,而不是使用goto

    什么是输入格式?在继续之前需要定义好。您能描述一下输入文件的格式吗e?…更重要的是,你将如何表示“每个州应该做什么的定义”?你应该提供更多关于你需要做什么的信息。“我如何实施FSA?”这是一个非常广泛的问题,尤其是