在Boost Spirit Qi中,我如何将每个字符匹配到下一个空格(带有预跳过)

In Boost Spirit Qi, how do I match every character up to the next whitespace (with pre-skip)

本文关键字:空格 下一个 字符 Qi Spirit Boost      更新时间:2023-10-16

在boost::spirit::qi语法规则中,如何匹配字符串,直到并排除所提供的capper定义的下一个空白字符?

例如,如果语法是一组定义为的属性:

attributeList = '(' >> *attribute >> ')';
attribute     = (name : value) | (name : value units);

如何匹配第一个队长角色之前的任何角色?

例如,对于name,我想预先跳过,然后匹配除":"或队长字符之外的所有字符。我是否必须在语法类中实例化一个队长,这样我就可以做一些类似的事情:

name = +qi::char_ !(skipper | ':');

或者我可以以某种方式访问现有提供的capper对象并直接引用它吗?此外,我不认为这需要用qi来包装::lexeme[]。。。

提前感谢您纠正我的方法

的错误

为了做到这一点,您需要抑制跳过,因此必须涉及qi::lexeme(或者至少涉及qi::no_skip,但您只会使用它来重新实现qi::lexeme),并且要准确地完成您所写的内容,还需要跳过解析器。然后你可以写

qi::lexeme[ +(qi::char_ - ':' - skipper) ]

不过,要求似乎相当宽松。在标识符中甚至允许不可打印的字符,如钟形符号(ASCII 7),这是不寻常的。我不知道你到底想做什么,所以我不能为你回答这样的设计问题,但对我来说,有一个更标准的规则,比如,你会更高兴

qi::lexeme[ qi::alpha >> *qi::alnum ]

(举一个非常简单的例子。您的里程数可能因下划线等而异)