c++ - 具有继承属性的 Boost Spirit 解析器 - 简单示例无法编译

标签 c++ boost boost-spirit

我正在尝试使用 boost::spirit 为类 C 语言编写一个解析器,它使用继承的属性来传输有关变量范围的信息。例如,“命名空间 a { var b }”会将“a”作为属性传递给“var b”的解析器。

我在获取使用继承属性编译此代码的基本解析器时遇到了问题:

#ifndef CPARSER_DEF_HPP
#define CPARSER_DEF_HPP

#include <string>

#include <boost/spirit/include/qi.hpp>

namespace encoding = boost::spirit::ascii;
using boost::spirit::unused_type;
using boost::spirit::qi::rule;

template <typename Iterator>
struct cparser : boost::spirit::qi::grammar<
                    Iterator,
                    std::string(std::string),
                    encoding::space_type
                    >
{
    rule<Iterator, std::string(std::string), encoding::space_type> start;
    rule<Iterator, std::string(std::string), encoding::space_type> sym_list;

    cparser() :
        cparser::base_type(start)
    {
        sym_list         = encoding::string(boost::spirit::qi::_r1);
        start            = sym_list(boost::spirit::qi::_r1);
    }

};

#endif

此解析器在 main() 中用 cparser<std::string::const_iterator> parser 实例化.

我相信这个解析器应该接受一个 std::string 作为它的继承属性,解析匹配这个字符串的输入,然后返回这个字符串作为一个合成属性。此示例代码无法编译,我不明白为什么。我一直在使用启用了 C++11 的 GCC 和 Clang 进行编译。任何一个编译器的输出都很大(大约 1000 行),我无法理解它。 boost::spirit::qi::_r1使用有问题吗? std::string(std::string) 有问题在规则声明中?

预先感谢您的帮助。

最佳答案

我试图构建一个示例 here .我不确定我遇到过与您相同的问题(因为您没有提供重现它们的方法)但我认为有两个不同的问题:第一个很常见,是 PhoenixV2 不适用于“现代编译器”自 Boost 1.52 中的突破性更改使 BOOST_RESULT_OF_USE_DECLTYPE 成为默认值以来。 有两种方法可以解决这个问题(至少对于 coliru 使用的 clang 版本)或者通过定义 BOOST_SPIRIT_USE_PHOENIX_V3 使用 V3(这是我推荐的,我认为它应该是默认的)或者返回V2 通过定义 BOOST_RESULT_OF_USE_TR1 期望的行为的 result_of 协议(protocol)。第二个问题,我不太熟悉,所以对此持保留态度或者只是等待更有经验的“某人”的回答,似乎你不能直接将字符串文字作为继承属性传递,您需要将它们作为字符串传递(使用 phx::val("foo") 似乎也有效)。

简短版本:定义 BOOST_SPIRIT_USE_PHOENIX_V3 并将继承的属性作为 std::string 而不是字符串文字传递。

关于c++ - 具有继承属性的 Boost Spirit 解析器 - 简单示例无法编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20440238/

相关文章:

c++ - 非常量引用绑定(bind)到临时的 Visual Studio 错误?

c++ - boost 变体 : get reference to the variant by its type

c++ - 实现上的巨大差异?

c++ - spirit :不能在其规则定义中使用 x3::skip(skipper)[一些递归规则]

c++ - 使用 'boost::optional' 参数与 boost::spirit 绑定(bind)成员函数

c++ - QSerialPort - setReadBufferSize

c++ - QCombobox 向下箭头图像

c++ - 随机未在范围内声明

c++ - 如何仅使用 boost/standard 库在 C++ 中读/写图像?

c++ - BOOST SPIRIT 解析 - 创建正确的 AST 树