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/24225184/

相关文章:

c++ - 使用 istream_iterators 构造 vector

c++ - boost::lockfree::spsc_queue的read_available和write_available应该如何使用?

c++ - Boost::spirit::qi 无法编译字符串匹配器

c++ - 在 Qi 中对解析器公开的属性应用操作

c++ - 如何从随机数中取一个名字?

c++ - 从另一个类访问 QTableWidget 的数据

c++ - 为什么 boost::serialization 不检查 XML 文件中的标签名称?

c++ - ublas 矩阵表达式教程/示例

boost-spirit - 如何以 boost 精神从 C++11 lambda 语义 Action 构建综合参数?

C++ - 不正确的 ASCII 值 ("ë")