编辑:我扩展了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的规则?我也很感兴趣的其他方法,以加速提升精神的AST创建。
发布于 2013-03-10 11:00:45
首先,我尝试了一个简单的示例,并使用一个简单的改编结构“它对我有效”:
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 (以及一般的属性兼容性)的更多详细信息,请参阅此答案:
发布于 2013-03-10 07:22:46
没有“自动规则”这回事。当您自动捕获这样的表达式时,您将使用所有默认值来创建规则。因此,这个“自动规则”的属性将恰好是表达式的属性,而不会进行属性转换。
如果您需要创建特殊属性数据(即:您需要将传入的属性类型转换为您自己的数据),则必须使用规则或语义操作。
https://stackoverflow.com/questions/15316848
复制相似问题