ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 使用继承属性增强Spirit解析器 – 简单示例将无法编译

2019-10-03 07:04:14  阅读:197  来源: 互联网

标签:c boost boost-spirit


我正在尝试使用boost :: spirit为类C语言编写解析器,它使用继承的属性来传输有关变量范围的信息.例如,“namespace 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>进行实例化.解析器.

我相信这个解析器应该接受一个std :: string作为它的继承属性,解析匹配该字符串的输入,然后将该字符串作为合成属性返回.这个示例代码没有编译,我无法弄清楚原因.我一直在用GCC和Clang编译C 11启用.任何一个编译器的输出都是巨大的(大约1000行),我无法理解它.使用boost :: spirit :: qi :: _ r1有问题吗?规则声明中std :: string(std :: string)的问题?

在此先感谢您的帮助.

解决方法:

我试图构建一个示例here.我不确定我遇到了同样的问题(因为你没有提供重现它们的方法)但我认为有两个不同的问题:第一个,非常常见的是,PhoenixV2不能与“现代编译器”一起工作,因为Boost 1.52的突破性变化使BOOST_RESULT_OF_USE_DECLTYPE成为默认值.
有两种方法来解决这个问题(至少与coliru用途铛版本)或者通过定义BOOST_SPIRIT_USE_PHOENIX_V3使用V3(这就是我推荐的,我想应该是默认的)或的result_of协议返回行为V2期望通过定义BOOST_RESULT_OF_USE_TR1.第二个问题,其中我并不熟悉,所以请稍等一下,或者只是等待“更有经验的人”的回答,是因为你似乎无法直接将字符串文字作为继承属性传递,你需要将它们作为一个字符串传递(使用phx :: val(“foo”)似乎也有效).

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

标签:c,boost,boost-spirit
来源: https://codeday.me/bug/20191003/1847759.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有