编辑:当我想在另一条规则上使用它时,我扩展了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创建的其他方法感兴趣。
答案 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)
没有“自动规则”这样的东西。当您自动捕获这样的表达式时,您将使用所有默认值来创建规则。因此,这个“自动规则”的属性将只是表达式的属性,没有属性转换。
如果您需要创建特殊属性数据(即:您需要将传入属性类型转换为您自己的数据),您必须使用规则或语义操作。