我为我的 Boost Spirit Lexer 编写了一个语义操作,将字符串中的转义序列转换为它们所代表的内容。它运行良好,我想将其转换为 Boost Phoenix 表达式,但无法编译该表达式。
这是有效的:
// the semantic action
struct ConvertEscapes
{
template <typename ItT, typename IdT, typename CtxT>
void operator () (ItT& start, ItT& end, lex::pass_flags& matched, IdT& id, CtxT& ctx)
{
static boost::wregex escapeRgx(L"(\\\\r)|(\\\\n)|(\\\\t)|(\\\\\\\\)|(\\\\\")");
static std::wstring escapeRepl = L"(?1\r)(?2\n)(?3\t)(?4\\\\)(?5\")";
static std::wstring wval; // static b/c set_value doesn't seem to copy
auto const& val = ctx.get_value();
wval.assign(val.begin(), val.end());
wval = boost::regex_replace(wval,
escapeRgx,
escapeRepl,
boost::match_default | boost::format_all);
ctx.set_value(wval);
}
};
// the token declaration
lex::token_def<std::wstring, wchar_t> literal_str;
// the token definition
literal_str = L"\\\"([^\\\\\"]|(\\\\.))*\\\""; // string with escapes
// adding it to the lexer
this->self += literal_str [ ConvertEscapes() ];
这是我试图转换它:
this->self += literal_str
[
lex::_val = boost::regex_replace(lex::_val /* this is the place I can't figure out */,
boost::wregex(L"(\\\\r)|(\\\\n)|
(\\\\t)|(\\\\\\\\)|(\\\\\")"),
L"(?1\r)(?2\n)(?3\t)(?4\\\\)(?5\")",
boost::match_default | boost::format_all)
];
Awstring
不能从 构造_val
。_val
也没有begin()
or end()
,到底应该怎么用?
这std::wstring(lex::_start, lex::_end)
也失败了,因为这些参数不被识别为迭代器。
在这个问题中,我发现了phoenix::construct<std::wstring>(lex::_start, lex::_end)
,但这也并没有真正导致wstring
.
如何获取wchar_t
当前令牌的字符串或一对迭代器?