首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在AST中使用Boost精灵自动规则?

如何在AST中使用Boost精灵自动规则?
EN

Stack Overflow用户
提问于 2013-03-10 06:53:55
回答 2查看 676关注 0票数 4

编辑:我扩展了sehe的例子,以显示我想在另一个规则上使用它时的问题:http://liveworkspace.org/code/22lxL7$17

我正在努力提高我的Boost Spirit解析器的性能,我看到自从C++11以来,使用这样的自动规则是可能的:

代码语言:javascript
复制
auto comment = "/*" >> *(char_ - "*/") >> "*/"; 

(或使用BOOST_AUTO或BOOST_SPIRIT_AUTO)。

我有一个这样的规则声明:

代码语言:javascript
复制
qi::rule<lexer::Iterator, ast::SimpleType()> simple_type;

定义如下:

代码语言:javascript
复制
simple_type %=
        const_
    >>  lexer.identifier;

如果我用auto声明它,它会编译,但它不能在其他规则中用作AST。

是否可以定义使用自动规则创建AST的规则?我也很感兴趣的其他方法,以加速提升精神的AST创建。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-10 11:00:45

首先,我尝试了一个简单的示例,并使用一个简单的改编结构“它对我有效”:

代码语言:javascript
复制
struct fixed
{
    int integral;
    unsigned fractional;
};

BOOST_FUSION_ADAPT_STRUCT(fixed, (int, integral)(unsigned, fractional));

template <typename It, typename Skipper = qi::space_type>
    struct parser : qi::grammar<It, std::vector<fixed>(), Skipper>
{
    parser() : parser::base_type(start)
    {
        using namespace qi;

        BOOST_SPIRIT_AUTO(qi, fixed_rule, lexeme [ int_ >> -('.' >> uint_ | attr(0u)) ]);
        start = *fixed_rule;

        BOOST_SPIRIT_DEBUG_NODE(start);
    }

  private:
    qi::rule<It, std::vector<fixed>(), Skipper> start;
};

这很好地解析了输入:

我认为您可能是指需要属性兼容性的地方,以及

  • attr_cast (doc)
  • as<T>(parse_expr) (doc)

在这些情况下应该能很好地帮助你。

有关attr_cast (以及一般的属性兼容性)的更多详细信息,请参阅此答案:

票数 2
EN

Stack Overflow用户

发布于 2013-03-10 07:22:46

没有“自动规则”这回事。当您自动捕获这样的表达式时,您将使用所有默认值来创建规则。因此,这个“自动规则”的属性将恰好是表达式的属性,而不会进行属性转换。

如果您需要创建特殊属性数据(即:您需要将传入的属性类型转换为您自己的数据),则必须使用规则或语义操作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15316848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档