在Boost Spirit Qi中,如何将每个角色与下一个空格匹配(使用pre-skip)

时间:2015-02-14 18:56:44

标签: c++ boost-spirit boost-spirit-qi

在boost :: spirit :: qi语法规则中,如何匹配由提供的队长定义的下一个空白字符的字符串?

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

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

我如何匹配任何字符的名称,直到第一个队长字符?

例如,对于名称,我想预先跳过,然后匹配所有字符,除了':'或船长角色。我是否必须在语法类中实例化一个队长,以便我可以执行以下操作:

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

或者我可以以某种方式访问​​现有提供的skipper对象并直接引用它吗?另外,我不相信这需要包含在qi :: lexeme [] ...

提前感谢您纠正我的方式错误

1 个答案:

答案 0 :(得分:3)

为了做到这一点,您需要禁止跳过,因此qi::lexeme必须参与(或至少qi::no_skip,但您只能使用它来重新实现qi::lexeme),并准确地做你写的你也需要跳过解析器。然后你可以写

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

但要求似乎相当宽松。在标识符中甚至允许使用不可打印的字符(例如钟形符号(ASCII 7))是不常见的。我不知道你到底想要做什么,所以我无法为你回答这些设计问题,但对我来说似乎很有可能你有机会对更加标准的规则更加满意,例如

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

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