gpt4 book ai didi

c++ - spirit qi中可选解析器的使用

转载 作者:搜寻专家 更新时间:2023-10-31 02:20:20 26 4
gpt4 key购买 nike

我正在尝试解析“A+C”形式的加法表达式,或者单独解析“A”。经过几次测试后,我意识到问题显然出在我对可选解析器的使用上,举个例子:

qi::rule<string::iterator, string()> Test;

Test =
(
qi::string("A")[qi::_val= qi::_1]
>> -(
qi::string("B")[qi::_val += qi::_1]
>> qi::string("C")[qi::_val += qi::_1]
)
)
;

string s1, s2;
s1 = "AB";
bool a= qi::parse(s1.begin(), s1.end(), Test, s2);

思路是解析'A'或"ABC",但是如果s1的值为"AB"而没有'C',则a的值为真。我相信虽然我在运算符“-”之后加上括号然后使用“>>”运算符,但“C”部分被认为是可选的,而不是整个 B>>C。有什么想法吗?

最佳答案

容器属性不回溯。

这是一种性能选择。您需要使用例如显式控制传播qi::hold:

Live On Coliru

#include <boost/spirit/include/qi.hpp>

namespace qi = boost::spirit::qi;

int main() {
using It = std::string::const_iterator;
qi::rule<It, std::string()> Test;

Test =
(
qi::char_('A')
>> -qi::hold [
qi::char_('B')
>> qi::char_('C')
]
)
;

for (std::string const input : { "A", "AB", "ABC" })
{
std::cout << "-------------------------\nTesting '" << input << "'\n";
It f = input.begin(), l = input.end();

std::string parsed;
bool ok = qi::parse(f, l, Test, parsed);
if (ok)
std::cout << "Parsed success: " << parsed << "\n";
else
std::cout << "Parsed failed\n";

if (f != l)
std::cout << "Remaining unparsed: '" << std::string(f,l) << "'\n";
}
}

打印:

-------------------------
Testing 'A'
Parsed success: A
-------------------------
Testing 'AB'
Parsed success: A
Remaining unparsed: 'B'
-------------------------
Testing 'ABC'
Parsed success: ABC

注意我做了一些简化。

另见:

关于c++ - spirit qi中可选解析器的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32829601/

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