gpt4 book ai didi

c++ - Boost Spirit - 将列表提取为单个字符串

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

我无法准确理解 Spirit 如何以及何时决定将匹配项合并为单个实体。我想做的是匹配双方括号内的单词列表,我想提取括号内的全文。示例:

[[This is some single-spaced text]] -> "This is some single-spaced text"

我的语法如下:

qi::rule<Iterator, std::string()> word  = +(char_ - char_(" []"));
qi::rule<Iterator, std::string()> entry = lit("[[") >> word >> *(char_(' ') >> word) >> lit("]]") >> -qi::eol;

std::string text;
bool r = parse( first, last, entry, text );

但是,这会按如下方式解析示例文本:

[[This is some single-spaced text]] -> "Thisissomesingle-spacedtext"

我不明白为什么会这样。我没有使用 lit 作为空格,如果我对 Spirit 的理解正确的话,任何规则或解析器似乎都不会忽略空格。我不确定如何验证我的语法结果是否是我想要的结果(例如,避免在每个单词的元组中使用空格,而不是将其连接起来)。

我应该怎么做才能得到我想要的结果?

最佳答案

您可能正在使用(字符串)流。在这种情况下,您需要在流中使用 std::noskipws:

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

namespace qi = boost::spirit::qi;

int main()
{
typedef boost::spirit::istream_iterator Iterator;

std::istringstream iss("[[This is some single-spaced text]]");
qi::rule<Iterator, std::string()> entry = "[[" >> qi::lexeme [ +(qi::char_ - "]]") ] >> "]]";

// this is key:
iss >> std::noskipws; // or:
iss.unsetf(std::ios::skipws);

Iterator f(iss), l;
std::string parsed;
if (qi::parse(f, l, entry >> -qi::eol, parsed))
{
std::cout << "Parsed: '" << parsed << "'\n";
} else
std::cout << "Failed";

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

打印

Parsed: 'This is some single-spaced text'

关于c++ - Boost Spirit - 将列表提取为单个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24105997/

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