【发布时间】:2016-01-13 08:58:54
【问题描述】:
我正在编写一个解析器,它处理带有枚举和结构的简单 C 头文件。我用 Boost Spirit Qi 编写了一个解析器,几乎可以完成任务。我遇到了一个可以通过 hack 解决的问题,但我很好奇是否有可能更准确地解决它。
我正在处理的枚举很简单。这是一个例子:
enum <optional enum name>
{
VALUE1,
VALUE2 = 222,
VALUE3
}
解析此类枚举的代码sn-p:
IdParser %= lexeme[(alpha | '_') >> *(alnum | '_')];
EnumExprParser %= lexeme[+(char_ - (lit(",") | lit("}")))];
EnumValueParser %= IdParser >> -('=' >> EnumExprParser);
EnumParser %= lit("enum") >> -IdParser >> lit("{") >> (EnumValueParser % lit(",")) >> lit("}") >> -lit(";");
请注意,我将枚举值解析为以逗号分隔的列表。但有时最后一个枚举值也以逗号结尾:VALUE3,。我的肮脏解决方案如下:*(EnumValueParser >> -lit(","))
但这允许在没有分隔符的情况下解析多个枚举值。这对我来说是可以接受的,但我对更干净的解决方案感兴趣。我将枚举解析为以下结构:
struct EnumValue
{
std::string Name;
boost::optional<std::string> Value;
};
struct Enum
{
boost::optional<std::string> Name;
std::vector<EnumValue> Values;
};
非常感谢!
【问题讨论】:
-
为什么不把它做成一个独立的样本呢? livecoding.tv/sehe
-
完成从您的代码创建自包含示例。 19 分钟
-
@sehe 嘿,干得好!但是我的问题真的需要一个工作样本吗?我认为我的问题是在 boost.spirit 方面缺乏知识和经验。所以我想有人至少可以给我指明一个方向。翻阅精神手册对我没有多大帮助。
-
对我来说总是与实际代码有关。尝试脱离上下文推理 sn-ps 并不是很有用。
标签: c++ boost boost-spirit-qi