如何在AST中使用Boost Spirit自动规则?

时间:2013-03-09 22:53:55

标签: c++ boost c++11 boost-spirit

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

我正在尝试提高我的Boost Spirit解析器的性能,我发现自从C ++ 11以来,可以使用这样的自动规则:

auto comment = "/*" >> *(char_ - "*/") >> "*/"; 

(或使用BOOST_AUTO或BOOST_SPIRIT_AUTO)。

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

qi::rule<lexer::Iterator, ast::SimpleType()> simple_type;

并定义如下:

simple_type %=
        const_
    >>  lexer.identifier;

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

是否可以使用自动规则定义创建AST的规则? 我也对在Boost Spirit中加速AST创建的其他方法感兴趣。

2 个答案:

答案 0 :(得分:2)

首先,我尝试了一个简单的例子,“它适用于我”,带有一个简单的自适应结构:

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;
};

这很愉快地解析输入: http://liveworkspace.org/code/22lxL7$1

我认为您可能意味着需要属性兼容性,

在这些情况下,

应该能够帮助正常

有关attr_cast(以及一般属性兼容性)的详细信息,请参阅此答案: String parser with boost variant recursive wrapper

答案 1 :(得分:1)

没有“自动规则”这样的东西。当您自动捕获这样的表达式时,您将使用所有默认值来创建规则。因此,这个“自动规则”的属性将只是表达式的属性,没有属性转换。

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