Boost X3中与Spirit Qi的kwd关键字解析指令等效的组件是什么?
替代Spirit Qi中kwd指令的X3实现方案
Qi里的kwd主要用来匹配关键字,自动处理空白和避免部分匹配(比如防止if被当成ifdef的前缀)。X3没有内置这个指令,但完全可以组合现有工具实现一模一样的效果:
基础替代写法
假设你Qi里的代码是:
qi::kwd("if") / qi::kwd("else")
换成X3可以这么写:
x3::lexeme[x3::lit("if") >> !x3::alnum] / x3::lexeme[x3::lit("else") >> !x3::alnum]
x3::lexeme:强制不跳过关键字内部的空白,确保关键字是完整的一段!x3::alnum:断言关键字后面跟的不是字母数字,避免被更长的标识符“吞掉”
封装成复用的kwd匹配器
不想每次都写这么长?可以自己封装一个kwd函数:
template <typename String> auto kwd(String&& keyword) { return x3::lexeme[x3::lit(std::forward<String>(keyword)) >> !x3::alnum]; }
之后就能像Qi里那样用了:
kwd("if") / kwd("else")
大小写不敏感的情况
如果需要忽略关键字的大小写,加上x3::no_case就行:
template <typename String> auto kwd(String&& keyword) { return x3::lexeme[x3::no_case[x3::lit(std::forward<String>(keyword))] >> !x3::alnum]; }
注意点
- 如果你的解析器全局开了空白跳过,
lexeme只会影响当前关键字的匹配,不会打乱全局规则 - 要是你的标识符允许下划线之类的字符,把
!x3::alnum改成!x3::char_("_a-zA-Z0-9")就行,适配自己的语法规则
内容的提问来源于stack exchange,提问作者sandwood
相关产品推荐
相关产品推荐

