【问题标题】:Is using a finite state machine a good design for general text parsing?使用有限状态机是一般文本解析的好设计吗?
【发布时间】:2011-02-16 02:43:21
【问题描述】:

我正在读取一个已填充的文件 带有十六进制数字。我必须确定一个 特定模式,例如“aaad”(不带引号)来自 它。每次看到这个图案,我 为其他文件生成一些数据。

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

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

  • 设计:有没有更好的设计?
  • 实施:您是否发现使用我提到的开关盒有一些问题?

【问题讨论】:

  • @Pierreten:以前从未在 C 代码中使用过正则表达式。有一些 C 的正则表达式库吗?

标签: algorithm language-agnostic implementation fsm


【解决方案1】:

手动 FSM 可以很好地适用于简单的情况,但随着状态和输入数量的增加,它们往往会变得笨拙。

可能没有理由更改您已经设计/实现的内容,但如果您对通用文本解析技术感兴趣,您可能应该看看诸如正则表达式、Flex、Bison 和 ANTLR 之类的东西。

【讨论】:

  • +1:正则表达式是一个 FSM。因此,就此而言,解析器是由 Flex、Bison 和 ANTLR 等工具生成的。我喜欢这样:是的,使用 FSM;不,不要自己动手。
【解决方案2】:

对于非常简单的情况,if's 或 switch'es 就足够了。 对于在 POSIX 系统上解析字符串,man regex (3)。对于整个文件(例如复杂配置)的全功能解析,请使用 Lex/FlexYacc/Bison

使用 C++ 编写时,请查看 Boost Regex 以获得更简单的情况,查看 Boost Spirit 以获得更复杂的情况。 Flex 和 Bison 也可以使用 C++。

【讨论】:

    猜你喜欢
    • 2012-01-07
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 2010-12-02
    • 2016-07-21
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多