C++ 具有非标准(非字符串)输入流的spirit

C++ 具有非标准(非字符串)输入流的spirit,c++,parsing,boost,boost-spirit,C++,Parsing,Boost,Boost Spirit,如何将boost::spirit与由字符以外的内容组成的输入一起使用 在我的例子中,我有一个std::vector,我想将它作为一个令牌流处理到语法中,其中每个AbstractBaseClass都是一个令牌。比如: struct AbstractBaseClass { }; struct ConcreteClassA : public AbstractBaseClass { }; struct ConcreteClassB : public AbstractBaseClass { };

如何将boost::spirit与由字符以外的内容组成的输入一起使用

在我的例子中,我有一个std::vector,我想将它作为一个令牌流处理到语法中,其中每个AbstractBaseClass都是一个令牌。比如:

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 );
struct AbstractBaseClass
{
};
结构ConcreteClassA:公共抽象基类
{
};
结构ConcreteClassB:公共抽象基类
{
};
向量。这里有一些警告

  • 我的第一次尝试是使用boost::variant来描述我的令牌。解析器要求令牌可以转换为bool。为了解决这个问题,我将boost::variant包装在boost::optional中。编辑:实际上,似乎是调试能力强加了这个要求。我当前的解决方案添加了一个自定义调试处理程序,而不是不再检查迭代器值是否为“true”的常用调试处理程序

  • 同样,操作员您的自我回答似乎解决了一个类似但不同的问题:

    • 如何创建使用非char元素的解析器类
    然而,您最初的问题更像是“如何将spirit解析器与非字符令牌流结合使用”

    在这种情况下,最有用的链接是将LexerTL集成到Boost Spirit框架中的链接

    如果需要,您可以轻松地将Spirit Lex暴露令牌转换为信息(超出令牌Id),尽管默认情况下源迭代器范围始终可用。通过这种方式,你可以以相当灵活的方式混合搭配灵气和灵气

    我没有时间做一个简单的例子但是

    • 文档中附有示例
    • 请参阅我的另一个答案,以了解总体思路

    如果您在这里没有得到答案,请尝试在boost spirit邮件列表中询问。它非常活跃。或者,如果没有人给你答案,你应该开始质疑使用
    boost::spirit
    是否真的是个好主意。至于你的第一点,我在一定程度上同意。我想当然地认为,如果有人能想出如何编写一个非字符解析器,那么其用法是显而易见的。我的示例的最后3行显示了一个使用abitrary标记的解析器。至于Lex,虽然将Lex与Spirit解析器一起使用确实会导致解析器使用非字符令牌流(特别是,它使用boost::Spirit::Lex::token流),但据我所知,创建不引用基本字符流的Lex令牌是不可能的。