题
我的情况:我是新的精神,我必须使用VC6和我这样用精神1.6.4
。我有一个线,看起来像这样:
//The Description;DESCRIPTION;;
我想把文本DESCRIPTION
一个字符串,如果符合//The 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的响应。
你的代码失败的原因是因为print_p
是的贪婪的。直到它遇到的输入或一个不可打印的字符结束时+print_p
解析器将消耗字符。分号是可打印的,所以print_p
声称它。您的输入被耗尽时,变量分配,和匹配失败 - 没有什么留给你的解析器来匹配的最后一个分号
弗雷德的答案构造一个新的解析器,(print_p - ';')
,它匹配一切print_p
确实,除了分号。 “匹配除 X 所有内容,然后匹配的 X ”是一种常见的图案,所以confix_p
被提供作为用于构建那种解析器的快捷方式。该文件建议将它用于分析C或帕斯卡尔样式注释,但是这不是必须的。
有关您的代码工作,精神需要认识到贪婪print_p
匹配太多了,然后的原路返回的允许匹配较少。但是,虽然精神会走回头路,也不会原路返回到一个什么样的子解析器原本贪婪匹配“中间”。它将回溯到下一个“选择点”,但你的语法没有任何。请参阅 力竭回溯和贪婪RD 灵文档。
其他提示
你没有得到一个打击,因为“;”通过print_p匹配。尝试这样:
parse(chars,
// Begin grammar
(
as_lower_d["//the description;"]
>> (+(print_p-';'))[assign(vDescription)]
>> ';'
),
// End grammar
space_p).hit)
不隶属于 StackOverflow