我想在 C++ 中使用类似 FSM 的解析器来解析自行设计的文件格式(这是teach-myself-c++-the-hard-way-by-doing-something-big-and-difficult
一种项目 :))。我有一个带有换行符的标记化字符串,表示 euh... 行的结尾。有关输入示例,请参见此处。所有的评论都会被过滤掉,所以我有一个像这样的 std::string :
global \n { \n SOURCE_DIRS src \n HEADER_DIRS include \n SOURCES bitwise.c framing.c \n HEADERS ogg/os_types.h ogg/ogg.h \n } \n ...
语法解释:
- { } 是范围,大写的单词表示要遵循的选项/文件列表。
- \n 仅在选项/文件列表中很重要,表示列表的结尾。
所以我认为 FSM 足够简单/可扩展以满足我的需求/知识。据我所知(并希望我的文件设计如此),我不需要并发状态或类似的东西。一些设计/实施问题:
- 我应该为我的状态使用一个
enum
还是抽象class
+衍生物?第一个可能更适合小语法,但以后可能会变得丑陋,而第二个恰恰相反。我倾向于第一个,因为它很简单。enum
示例和类示例。编辑:这个建议怎么样,goto
我认为它们在 C++ 中是邪恶的? - 阅读列表时,我不需要忽略
\n
.string
我使用via的首选方式,默认情况下stringstream
会忽略\n
。所以我需要简单的方法来告诉(同样!)stringstream
在启用某个状态时不要忽略换行符。 - 简单
enum
状态是否足以进行多级解析(范围内的范围{...{...}...}
),还是需要 hacky 实现? - 这是我想到的草案状态:
upper
: 读取全局、exe、lib+ 目标名称...normal
: 在一个范围内,可以读取 SOURCES...,创建用户变量...list
:将项目添加到列表中,直到遇到换行符。
每个范围都会有一种条件(例如 win32:global { gcc:CFLAGS = ... }),并且需要在任何地方以完全相同的方式处理(即使在list
状态中,每个项目)。
感谢您的任何意见。