gpt4 book ai didi

c++ - Boost Spirit Qi Re-Establish skipping with custom skip 语法

转载 作者:可可西里 更新时间:2023-11-01 18:34:55 28 4
gpt4 key购买 nike

到目前为止,我有一个语法一直在使用标准的 boost::spirit::ascii::space/boost::spirit::ascii::space_type 船长。

我有一些使用船长的规则和一些不使用的规则,比如

qi::rule<Iterator, PTR<Expression>(), ascii::space_type> expression;
qi::rule<Iterator, PTR<Term>()> term;

当我在跳跃式非终结符(如 expression)内部使用非跳跃式非终结符(如 term)时,一切都像我期望的那样工作 - 空格只在内部起作用term 非终结符。

此外,到目前为止,我一直很好地包括在不使用 qi::skip 重新建立跳过的非终端内部使用 skipper 的非终端,例如

index = (qi::lit('[') >> qi::skip(ascii::space)[explist >> qi::lit(']')]);

这样,空格在 [] 大括号内并不重要,但在外面。

但是,现在我想添加我自己的自定义船长(我想让换行符有意义,然后添加评论跳过)。我的船长语法如下:

struct skip_grammar : qi::grammar<Iterator> {
qi::rule<Iterator> start;
skip_grammar() : skip_grammar::base_type(start) {
start = qi::char_("\t\r ");
}
};

我已经能够像这样将它添加到我的规则定义中了

qi::rule<Iterator, PTR<Expression>(), skip_grammar> expression;

但我似乎无法弄清楚如何使用我的跳过语法作为 qi::skip 的参数(并替换 ascii::space)。我试过使用类型、局部实例变量和全局实例变量。我得到的最远的是让 clang 提示我的 skip_grammar 需要一个复制构造函数。所以我尝试向我的跳过语法添加一个复制构造函数,但显然 boost::noncopyable 基类存在是有原因的,因为我的二进制段几乎立即发生错误。

我应该如何使用它?

谢谢

最佳答案

qi::grammar 只是qi::rules 的容器。它没有复制构造函数,因为这可能会无意中在这些规则右侧的解析器表达式中创建悬空引用。

按照您的意愿使用语法作为跳过器有点棘手,相当于将语法的开始规则传递给跳过解析器。仅为此创建一个规则实例可能更容易(特别是如果您只有一个规则船长)。

在任何情况下,规则都需要作为引用传递给船长(通过调用规则的成员函数alias()):

skip_grammar skippper;
index = '[' >> qi::skip(skipper.start.alias())[explist >> ']'];

或者简单地说:

rule<iterator> skipper = qi::char_("\t\r ");
index = '[' >> qi::skip(skipper.alias())[explist >> ']'];

别名是必要的,因为它意味着复制规则的具体含义。在 Spirit 的常见问题解答中有更详细的描述 here .

关于c++ - Boost Spirit Qi Re-Establish skipping with custom skip 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5037661/

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