gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:49:13 25 4
gpt4 key购买 nike

我正在尝试使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com