Spirit X3如何创建解析单个字符并生成字符串的规则
Spirit X3单个字符解析生成字符串规则实现方案
问题根因
你当前遇到的属性不兼容问题,核心是numeric_identifier规则的两个分支合成属性类型不统一:
- 分支
positive_digit >> digits的合成属性为tuple<wchar_t, std::wstring> - 分支
digit的合成属性为wchar_t
二者均无法直接匹配std::wstring类型的目标属性。
可行解决方案
无需使用存在回溯副作用的语义动作,直接用Spirit X3内置的x3::as_string适配器即可实现需求,该适配器可以将任意字符解析器的输出统一包装为字符串类型,天然适配属性传播逻辑。
修改后的实现代码如下:
#include <boost/spirit/home/x3.hpp> #include <string> namespace x3 = boost::spirit::x3; auto const positive_digit = x3::char_(L"123456789"); auto const digit = x3::char_(L"0123456789"); // 显式声明规则合成属性为std::wstring auto const numeric_identifier = x3::rule<class numeric_identifier, std::wstring>{"numeric_identifier"} = x3::as_string[ positive_digit >> +digit ] // 匹配非零开头的多位数字,输出字符串 | x3::as_string[ digit ]; // 匹配单个数字,输出字符串
方案优势
- 无副作用:
x3::as_string属于X3原生属性适配逻辑,不是语义动作,回溯过程中不会产生提前赋值的脏数据 - 类型统一:两个分支的输出均为
std::wstring,完全符合属性匹配要求 - 性能开销低:内置适配器实现的属性转换开销远低于自定义语义动作
内容的提问来源于stack exchange,提问作者Romain Deterre
相关产品推荐
相关产品推荐

