【问题标题】:Finite state machines how to implement minimum and maximum hits有限状态机如何实现最小和最大命中
【发布时间】:2016-07-21 00:48:47
【问题描述】:

我正在尝试实现一个 fsm,它运行良好。我可以输入字符串,看看它们是否有效等等。

但是正则表达式(即 fsms)具有此功能,您可以在其中指定某个字符可能出现的次数,例如 a{2,4} 将接受“aa”和“aaa”,但不接受“aaaaa”和“一个”

我可以想象在边缘上有一个计数器来计算它们被击中的次数,并在计数器达到一定数量后使用它来拒绝任何字符,但你不能以这种方式实现最小值,因为它总是会阻塞第一个字符(除非最小值为 0)。

有人知道实现此功能的方法吗? 它还必须适用于非常大的数字,例如{1,99999999999}

【问题讨论】:

  • 想解释一下有限状态机和正则表达式之间的关系并给我们看一些代码吗?
  • @andrea 正则表达式是有限状态机
  • 哦,现在很清楚了...我很感激我可能不是该主题的专家,但如果您愿意以更清晰的方式解释问题,您可能会帮助其他人理解该主题并吸引得到更多人的关注和帮助。
  • aaa?a? 不是等价的吗?
  • 对于有限的 {n,m},您可以通过“爆炸”FSM 来摆脱困境:只需将其堆叠到自身上即可。一次又一次。对于无限 FSM,您需要一个堆栈来记住猜测的状态。

标签: algorithm fsm


【解决方案1】:

据我了解,这种约束不能在有限状态机中动态实现; FSM 的某些部分必须静态扩展。在您的示例中,对于a{2,3},必须构建三个不同的独立 FSM,一个接受 aa,第二个接受 aaa,第三个接受 aaaa;然后必须通过一些空转换在最终的 FSM 中替代这些。原因是 FSM 本身不存储达到其当前状态的路径,这意味着无法检查模式 a{i,j} 的参数化形式。

【讨论】:

  • 这是否意味着如果我做一个像 {1,999999999} 这样的正则表达式,就会产生那么多 fsms?对我来说听起来不太可能
  • 我在这里分享你的怀疑;但是我不确定正则表达式引擎的实现是否单独使用 FSM。如果我没记错的话,通常在计算机科学入门课程中提出的正则表达式的概念与正则表达式并不完全匹配,后者是通常实施。
  • 我觉得有一个比制作大量 fsms 更优雅的解决方案
  • 可能是,但可能不是 FSM。你熟悉所谓的 FSM 抽引引理吗?
  • 是的,我认为你是对的,但问题仍然是它是如何完成的?我还没有听说过抽引理
猜你喜欢
  • 1970-01-01
  • 2012-06-26
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多