在 Boost Spirit Qi 中,我如何将每个字符匹配到下一个空格(带预跳过)
In Boost Spirit Qi, how do I match every character up to the next whitespace (with pre-skip)
在 boost::spirit::qi 语法规则中,如何匹配由提供的 skipper 定义的不超过下一个空白字符的字符串?
例如,如果语法是一组定义为的属性:
attributeList = '(' >> *attribute >> ')';
attribute = (name : value) | (name : value units);
如何匹配名称中不超过第一个船长字符的任何字符?
例如,对于名称,我想预先跳过,然后匹配除“:”或船长字符以外的所有字符。我是否必须在语法 class 中实例化一个船长,以便我可以做类似的事情:
name = +qi::char_ !(skipper | ':');
或者我能否以某种方式访问现有的提供的船长对象并直接引用它?另外,我认为这不需要包含在 qi:: lexeme[]...
在此先感谢您纠正我方法中的错误
为了做到这一点,您需要禁止跳过,因此必须涉及 qi::lexeme
(或至少 qi::no_skip
,但您只能使用它来重新实现 qi::lexeme
),并且要精确地执行您编写的内容,您还需要跳过解析器。然后你可以写
qi::lexeme[ +(qi::char_ - ':' - skipper) ]
虽然要求似乎很宽松。在标识符中允许使用不可打印的字符(例如钟形符号 (ASCII 7))是不常见的。我不知道你到底想做什么,所以我不能为你回答这样的设计问题,但对我来说,你很有可能会更喜欢更标准的规则,比如
qi::lexeme[ qi::alpha >> *qi::alnum ]
(举一个非常简单的例子。你的里程数可能因下划线等而异)
在 boost::spirit::qi 语法规则中,如何匹配由提供的 skipper 定义的不超过下一个空白字符的字符串?
例如,如果语法是一组定义为的属性:
attributeList = '(' >> *attribute >> ')';
attribute = (name : value) | (name : value units);
如何匹配名称中不超过第一个船长字符的任何字符?
例如,对于名称,我想预先跳过,然后匹配除“:”或船长字符以外的所有字符。我是否必须在语法 class 中实例化一个船长,以便我可以做类似的事情:
name = +qi::char_ !(skipper | ':');
或者我能否以某种方式访问现有的提供的船长对象并直接引用它?另外,我认为这不需要包含在 qi:: lexeme[]...
在此先感谢您纠正我方法中的错误
为了做到这一点,您需要禁止跳过,因此必须涉及 qi::lexeme
(或至少 qi::no_skip
,但您只能使用它来重新实现 qi::lexeme
),并且要精确地执行您编写的内容,您还需要跳过解析器。然后你可以写
qi::lexeme[ +(qi::char_ - ':' - skipper) ]
虽然要求似乎很宽松。在标识符中允许使用不可打印的字符(例如钟形符号 (ASCII 7))是不常见的。我不知道你到底想做什么,所以我不能为你回答这样的设计问题,但对我来说,你很有可能会更喜欢更标准的规则,比如
qi::lexeme[ qi::alpha >> *qi::alnum ]
(举一个非常简单的例子。你的里程数可能因下划线等而异)