【发布时间】:2017-03-29 17:25:52
【问题描述】:
我为我的 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)
];
不能从_val 构造wstring。 _val也没有begin()或end(),到底应该怎么用?
这个std::wstring(lex::_start, lex::_end) 也失败了,因为这些参数未被识别为迭代器。
在this question 中,我找到了phoenix::construct<std::wstring>(lex::_start, lex::_end),但这也不会真正导致wstring。
如何获取当前令牌的字符串或一对wchar_t 迭代器?
【问题讨论】:
标签: c++ boost boost-spirit boost-phoenix boost-spirit-lex