我正在阅读一个用十六进制数字填充的文件。我必须确定一个特定的模式,从它说“aaad”(不带引号)。每次看到该模式时,我都会为其他文件生成一些数据。
这将是设计程序时非常常见的情况——解析和寻找特定的模式。
我将其设计为有限状态机,并在 C 中对其进行结构化switch-case
以更改状态。这是我想到的第一个实现。
- 设计:有没有更好的设计?
- 实施:您是否看到我提到的使用开关盒的一些问题?
我正在阅读一个用十六进制数字填充的文件。我必须确定一个特定的模式,从它说“aaad”(不带引号)。每次看到该模式时,我都会为其他文件生成一些数据。
这将是设计程序时非常常见的情况——解析和寻找特定的模式。
我将其设计为有限状态机,并在 C 中对其进行结构化switch-case
以更改状态。这是我想到的第一个实现。
手动 FSM 可以很好地用于简单的情况,但随着状态和输入数量的增加,它们往往会变得笨拙。
可能没有理由更改您已经设计/实现的内容,但如果您对通用文本解析技术感兴趣,您可能应该查看诸如正则表达式、Flex、Bison 和 ANTLR 之类的东西。
对于令人尴尬的简单情况,几个if
's 或switch
'es 就足够了。要在 POSIX 系统上解析字符串,请使用man regex (3)。对于整个文件(例如复杂配置)的全功能解析,请使用Lex / Flex和Yacc / Bison。
使用 C++ 编写时,请查看Boost Regex以获得更简单的情况,而使用Boost Spirit了解更复杂的情况。Flex & Bison 也可以使用 C++。