【发布时间】:2012-04-12 10:52:20
【问题描述】:
如何将 boost::spirit 与包含字符以外的其他内容的输入一起使用?
就我而言,我有一个 std::vector
struct AbstractBaseClass
{
};
struct ConcreteClassA : public AbstractBaseClass
{
};
struct ConcreteClassB : public AbstractBaseClass
{
};
std::vector<AbstractBaseClass> stream;
std::vector<AbstractBaseClass>::iterator iter = stream.begin();
std::vector<AbstractBaseClass>::iterator end = stream.end();
bool r = boost::spirit::qi::parse( iter, end, TOKEN_ID_FOR_CONCRETE_CLASS_A >> TOKEN_ID_FOR_CONCRETE_CLASS_B >> TOKEN_ID_FOR_CONCRETE_CLASS_A );
我需要将哪些方法添加到我的类中/令牌 ID 应该是什么样子才能支持这一点?
大概我需要提供一些类似于 boost::spirit::lex::token_def 和 boost::spirit::lex::token 的东西。
我已经研究过直接使用这些,但是这两个类似乎假设在词法分析器标记下有一个原始字符流,这在我的情况下是不正确的;我直接拿到token。
编辑:
好吧,我回答了我自己的问题。我会留下这个,以防其他人发现它有用。 here 解释了基础知识。有一些注意事项。
- 我的第一次尝试是使用 boost::variant 来描述我的令牌。解析器要求标记可转换为布尔值。为了解决这个问题,我将 boost::variant 包裹在 boost::optional 中。编辑:实际上,似乎是调试能力强加了这个要求。我当前的解决方案添加了一个自定义调试处理程序,而不是不再检查迭代器的值是否为“true”的库存处理程序。
- 类似地,必须定义运算符
- 在 parse() 方法中,您需要在取消引用之前检查您的迭代器是否不在末尾。
- 如果您有很多标记类型,您可能需要增加 MPL 向量和列表的大小,如 here 所述。
【问题讨论】:
-
如果您在这里没有得到答案,请尝试在提升精神邮件列表中提问。它非常活跃。 lists.sourceforge.net/lists/listinfo/spirit-general
-
或者如果没有人在这里给你答案,你应该开始质疑使用
boost::spirit是否真的是个好主意。
标签: c++ parsing boost boost-spirit