gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:03:49 25 4
gpt4 key购买 nike

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

我正在尝试 boost 我的 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 中 boost AST 创建的其他方法感兴趣。

最佳答案

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

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

关于c++ - 如何在 AST 中使用 Boost Spirit 自动规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15316848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com