我的情况:我是新的精神,我必须使用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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top