令牌解析器语义动作
我已经根据精灵lex示例4中显示的代码编写了一个工作令牌解析器
我的一条规则是这样的
set_name
= ( tok.set_ >> tok.name_ >> tok.identifier )
[
std::cout << val("set name statement to: ") << _3 << "n"
]
;
这很好用。当提出
SET NAME xyz
它按照我的预期输出
将name name设置为:xyz
现在我想做一些有用的事情,将找到的名字存储在一个类中。从解析器语义示例开始,我编写了这段代码
class writer
{
public:
void print(string const& s) const
{
std::cout << s << std::endl;
}
};
writer w;
...
set_name
= ( tok.set_ >> tok.name_ >> tok.identifier )
[
boost::bind( &writer::print, &w, ::_3 )
]
;
这不编译
1> C: Program Files boost boost_1_44 boost / bind / bind.hpp(318):错误C2664:'R boost :: _ mfi :: cmf1 :: operator()(const U&,A1)const':无法将参数2从'bool'转换为'const std :: basic_string'
1>用
1> [
1> R =无效,
1> T = eCrew :: rule :: writer,
1> A1 = const std :: string&,
1> U = eCrew :: rule :: writer *
1>]
1>和
1> [
1> _Elem = char,
1> _Traits = std :: char_traits,
1> _Ax = std :: allocator
1>]
1>原因:无法从'bool'转换为'const std :: string'
1>没有构造函数可以采用源类型,或构造函数重载解析是不明确的
为什么编译器抱怨尝试从bool转换为字符串?我看不到布尔。
没有找到相关结果
已邀请:
1 个回复
闯舱酮
是指
,这是一个boost.phoenix v2占位符。占位符
是一个boost.bind占位符(自然)。 这些占位符不共享相同的行为,甚至不会引用相同的数据。形式为_N的Phoenix占位符引用解析器的第N个子属性,而绑定占位符具有不同的含义: _1指的是整个解析器的属性 _2指的是解析器的上下文 _3指的是
'hit'参数 在你的情况下最简单的解决方案是使用
而不是
,这样你就可以继续使用
来引用解析器的第三个子属性,而不必在
内手动选择它。 或者,只将语义动作附加到
,以便boost.bind的
按预期工作: