问题标签 [fsm]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1511 浏览

fsm - 组合状态,FSM

组合 FSM 的状态是否“正确”?

假设你有一个对象

碰巧组合状态是有意义的,例如

但是在 FSM 理论中这是非法的吗?

这更像是一条捷径:

假设您有 3 个状态:跑步、步行和跳跃。然后你有第四个状态 Firing。

你需要能够跑和火,走路和火,跳和火。而不是制作6个状态RunningFiring,WalkingFiring,JumpingFiring,我想Firing状态与(无论Walking Running Jumping状态)结合起来

我知道我可以将 BOOL 用于“第四状态”,但这似乎不是更错误的吗?有一个“侧面的状态......”

0 投票
1 回答
1352 浏览

c++ - Generic FSM for game in C++?

I was wondering if there's a way I could code some kind of "generic" FSM for a game with C++?.

My game has a component oriented design, so I use a FSM Component.

my Finite State Machine (FSM) Component, looks more or less this way.

I would love to hear your opinions/ideas or suggestions about how to make this FSM component, generic. With generic I mean:

1) Creating the fsmTable from an xml file is really easy, I mean it's just a bunch of integers that can be loaded to create an MAX_STATESxMAX_ACTION matrix.

2) But what about the "perform Action" method ?

What if I wanted to make the "actions" and the switch generic?

This in order to avoid creating a different FSM component class for each GameEntity? (gecFSMZombie, gecFSMDryad, gecFSMBoss etc ?). That would allow me to go "Data Driven" and construct my generic FSM's from files for example.

What do you people suggest?

0 投票
2 回答
962 浏览

algorithm - 使用有限状态机是一般文本解析的好设计吗?

我正在阅读一个用十六进制数字填充的文件。我必须确定一个特定的模式,从它说“aaad”(不带引号)。每次看到该模式时,我都会为其他文件生成一些数据。

这将是设计程序时非常常见的情况——解析和寻找特定的模式

我将其设计为有限状态机,并在 C 中对其进行结构化switch-case以更改状态。这是我想到的第一个实现。

  • 设计:有没有更好的设计?
  • 实施:您是否看到我提到的使用开关盒的一些问题?
0 投票
7 回答
13500 浏览

python - 实现简单 FSM 的 Pythonic 方法是什么?

昨天我不得不解析一个非常简单的二进制数据文件 - 规则是,在一行中查找两个都是 0xAA 的字节,然后下一个字节将是一个长度字节,然后跳过 9 个字节并从中输出给定数量的数据那里。重复到文件末尾。

我的解决方案确实有效,而且组装起来非常迅速(尽管我本质上是一名 C 程序员,但我仍然认为用 Python 编写它比用 C 编写要快) - 但是,很明显完全不是 Pythonic,它读起来像一个 C 程序(而且不是一个很好的程序!)

对此有什么更好/更 Pythonic 的方法?像这样的简单 FSM 仍然是 Python 中的正确选择吗?

我的解决方案:

0 投票
3 回答
17463 浏览

c++ - 有限状态机解析器

我想在 C++ 中使用类似 FSM 的解析器来解析自行设计的文件格式(这是teach-myself-c++-the-hard-way-by-doing-something-big-and-difficult一种项目 :))。我有一个带有换行符的标记化字符串,表示 euh... 行的结尾。有关输入示例,请参见此处。所有的评论都会被过滤掉,所以我有一个像这样的 std::string :

语法解释:

  • { } 是范围,大写的单词表示要遵循的选项/文件列表。
  • \n 仅在选项/文件列表中很重要,表示列表的结尾。

所以我认为 FSM 足够简单/可扩展以满足我的需求/知识。据我所知(并希望我的文件设计如此),我不需要并发状态或类似的东西。一些设计/实施问题:

  1. 我应该为我的状态使用一个enum还是抽象class+衍生物?第一个可能更适合小语法,但以后可能会变得丑陋,而第二个恰恰相反。我倾向于第一个,因为它很简单。enum示例类示例。编辑:这个建议怎么样,goto我认为它们在 C++ 中是邪恶的?
  2. 阅读列表时,我不需要忽略\n. string我使用via的首选方式,默认情况下stringstream会忽略\n。所以我需要简单的方法来告诉(同样!)stringstream在启用某个状态时不要忽略换行符。
  3. 简单enum状态是否足以进行多级解析(范围内的范围{...{...}...}),还是需要 hacky 实现?
  4. 这是我想到的草案状态:
    • upper: 读取全局、exe、lib+ 目标名称...
    • normal: 在一个范围内,可以读取 SOURCES...,创建用户变量...
    • list:将项目添加到列表中,直到遇到换行符。

每个范围都会有一种条件(例如 win32:global { gcc:CFLAGS = ... }),并且需要在任何地方以完全相同的方式处理(即使在list状态中,每个项目)。

感谢您的任何意见。

0 投票
1 回答
669 浏览

c++ - C++ FSM 设计和所有权

我想为此语法实现一个 FSM/“下推自动机”解析器:具有范围和条件的解析器,它已经被“解析”到有限状态机解析器中

我有以下内容:

With B's event()doing (在许多 if-elseif's 之后) return m_parent->deleteDaughter()State我知道这很可疑(而且它崩溃了),但我需要办法从女儿那里归还父母,State并确保女儿State没有被泄露。

我的事件循环如下所示:

在你责骂设计和最后一段代码之前,我尝试从这里扩展一个过于简单的示例,这看起来还不错。为了清晰和简洁,我将决策部分转移到各州本身。

我知道有很多关于这个主题的书籍,但我不是计算机科学家/程序员,我想自己学习做这件事(当然,在 SO 的所有友好人士的帮助下)。如果概念不清楚,请询问。谢谢!

0 投票
3 回答
1279 浏览

scripting - Erlang 中的分层状态机实现

我正在计划一个回合制游戏(一种棋盘游戏),后端可能会在 Erlang 中完成。游戏逻辑部分似乎适合分层状态机,但我不确定如何在 Erlang 中实现它。

也许我可以为每个子 fsm 生成一个单独的进程,不确定这是否可行。

另一种选择是嵌入脚本语言或为此创建 DSL。

你怎么看?

谢谢。

0 投票
1 回答
2508 浏览

parsing - 如何在 Ragel 中解析模板语言?

我一直在研究简单模板语言的解析器。我正在使用雷格尔。

要求适中。我正在尝试找到可以嵌入输入字符串中任何位置的 [[tags]] 。

我正在尝试解析一种简单的模板语言,它可以在 HTML 中嵌入诸如 {{foo}} 之类的标签。我尝试了几种方法来解析它,但不得不求助于使用 Ragel 扫描仪并使用仅匹配单个字符作为“全部捕获”的低效方法。我觉得这是错误的做法。我实际上是在滥用扫描仪的最长匹配偏差来实现我的默认规则(它只能是 1 个字符长,所以它应该始终是最后的手段)。

(用 ruby​​ 编写的动作,但应该很容易理解)。

您将如何为如此简单的语言编写解析器?Ragel 可能不是正确的工具吗?如果语法是这样不可预测的,您似乎必须与 Ragel 牙齿和指甲作斗争。

0 投票
4 回答
8428 浏览

c# - 使用状态模式的分层状态机的最佳实践是什么?

我即将使用状态模式在 C# 中实现分层状态机。作为一个指南,我正在使用这个例子。但是,该示例并未提供有关分层状态的答案。不幸的是,我似乎无法在其他地方找到好的例子。我的第一个想法是为分层状态创建嵌套类。但这被认为是最佳实践还是有更好的解决方案?

问候!

更新:

我整个下午都在尝试实现上述状态模式。HSM 基于一个非常简单的媒体播放器:

替代文字 http://www.freeimagehosting.net/uploads/e8d2d6486a.jpg

我以为我已经做到了,但有一件事我不明白。首先是我写的代码(对不起,很多):

在 MediaPlayer 类中定义事件时,我不能调用任何其他函数

  • OnButtonPressed
  • OffButtonPressed

所以我想知道,我的实施有什么好处吗?怎么了?我还尝试查看使用复合模式的建议,但我不明白它应该如何与状态模式一起使用。希望任何人都可以提供帮助!

0 投票
3 回答
556 浏览

c++ - 将整个程序构建为 FSM 的良好设计?

我已经使用 FSM/Pushdown Automaton 方法构建了一个解析器,就像这里(它工作得很好!):C++ FSM 设计和所有权 当解析器出现问题时,它允许我优雅地退出并向用户输出有用的错误消息阶段。

我一直想知道在我的程序的其余部分中完成这项工作的好方法,自然而然地,解析器方法突然出现在我的脑海中......

我会让每个对象成为一个状态,它有一个 event() 函数,该函数有一个 switch 语句,根据我所处的执行阶段调用对象特定的函数。我可以使用特定于对象的枚举来跟踪它,并使代码更具可读性(case parser比 更具可读性case 5)。这将允许我关闭我创建的状态的下推树(使用m_parent*我的另一个问题中的方法)。

这是一个好的设计(强制所有东西都处于 FSM 模式)吗?有没有更好的方法,它会复杂多少(我发现 FSM 很容易实现和测试)?

感谢您的建议!

PS:我知道 boost 拥有人们可能需要的一切,但我想限制外部依赖,尤其是在 boost 上。c++0x 虽然没问题(但我认为在这里并不重要)