gpt4 book ai didi

c++ - 我如何用精神正确解析这个?

转载 作者:太空狗 更新时间:2023-10-29 20:32:53 25 4
gpt4 key购买 nike

我的情况:我是 Spirit 的新手,我必须使用 VC6,因此我正在使用 Spirit 1.6.4。

我有一行看起来像这样:

//The Description;DESCRIPTION;;

如果该行以 //The Description; 开头,我想将文本 DESCRIPTION 放入字符串中。

我有一些东西可以用,但对我来说看起来不太优雅:

vector<char> vDescription; // std::string doesn't work due to missing ::clear() in VC6's STL implementation
if(parse(chars,
// Begin grammar
(
as_lower_d["//the description;"]
>> (+~ch_p(';'))[assign(vDescription)]
),
// End grammar
space_p).hit)
{
const string desc(vDescription.begin(), vDescription.end());
}

我更想将所有可打印字符分配给下一个 ';' 但以下将不起作用,因为 parse(...).hit == false

parse(chars,
// Begin grammar
(
as_lower_d["//the description;"]
>> (+print_p)[assign(vDescription)]
>> ';'
),
// End grammar
space_p).hit)

如何让它成功?

最佳答案

您可以尝试使用 confix_p :

confix_p(as_lower_d["//the description;"],
(+print_p)[assign(vDescription)],
ch_p(';')
)

它应该等同于Fred's response .

您的代码失败的原因是 print_p 贪婪+print_p 解析器将消耗字符,直到它遇到输入的结尾或不可打印的字符。分号是可打印的,所以 print_p 声明了它。您的输入已耗尽,变量已分配,匹配失败 — 解析器的最后一个分号已无任何可匹配之处。

Fred 的答案构建了一个新的解析器 (print_p - ';'),它匹配 print_p 所做的一切,除了分号。 “匹配除 X 之外的所有内容,然后匹配 X”是一种常见的模式,因此提供了 confix_p 作为构建此类解析器的快捷方式.文档建议使用它来解析 C 或 Pascal 风格的注释,但这不是必需的。

为了让您的代码正常工作,Spirit 需要认识到贪婪的 print_p 匹配得太多,然后回溯 以减少匹配。但是,尽管 Spirit 会回溯,但它不会回溯到子解析器本来会贪婪匹配的“中间”。它将回溯到下一个“选择点”,但您的语法没有任何选择。参见 Exhaustive backtracking and greedy RD在 Spirit 文档中。

关于c++ - 我如何用精神正确解析这个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/466802/

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