Spirit X3中x3::raw的作用及解析结果含尾随空格的疑问
Spirit X3中x3::raw返回包含尾随空格的原因
这问题的核心在于x3::raw的工作机制,以及phrase_parse中skipper的作用方式:
- 当使用
phrase_parse并指定x3::ascii::space作为skipper时,Spirit会在每个原子规则(比如x3::alpha、x3::alnum)匹配前自动跳过空白字符。 - 普通的
rule匹配时,只会把实际命中的alpha/alnum/_字符拼接成结果字符串,那些被skipper跳过的空白不会被加入结果,所以得到Jame007。 - 而
x3::raw的作用是记录规则执行前的输入位置,执行完内部规则后,返回从记录位置到当前输入位置的全部原始字符——包括规则执行过程中被skipper跳过的空白。
具体到你的代码:
执行raw[rule]时,rule里的*(alnum|_)会循环尝试匹配:
- 先匹配完
Jame007,此时输入迭代器指向第一个空格; - 接下来的循环中,skipper自动跳过所有尾随空格,输入迭代器直接跳到字符串末尾;
- 因为没有更多字符可以匹配,
rule执行完毕,raw捕获的就是从开头到末尾的整个输入,也就是Jame007。
如果想让raw只捕获规则实际匹配的非空白内容,可以用x3::lexeme包裹内部规则,禁止skipper在规则内部生效:
const auto rule_raw = x3::raw[ x3::lexeme[rule] ];
这样rule匹配到Jame007后就会停止,raw的结果就和普通rule一致了。
内容的提问来源于stack exchange,提问作者august_71
相关产品推荐
相关产品推荐

