4

编辑:当我想在另一个规则上使用它时,我扩展了 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 创建的其他方法感兴趣。

4

2 回答 2

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

于 2013-03-10T03:00:45.087 回答
1

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

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

于 2013-03-09T23:22:45.953 回答